Subversion Repositories HelenOS-historic

Rev

Rev 534 | Rev 845 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 534 Rev 843
Line 25... Line 25...
25
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
#
27
#
28
 
28
 
29
#include <arch/asm/macro.h>
29
#include <arch/asm/macro.h>
-
 
30
#include <arch/asm/spr.h>
30
 
31
 
31
.section K_TEXT_START
32
.section K_TEXT_START
32
 
33
 
33
.global kernel_image_start
34
.global kernel_image_start
34
 
35
 
-
 
36
.org 0x0
-
 
37
/* 256 bytes of some data */
-
 
38
/* exception table - must use 'ba' instructions for branches,
-
 
39
 * because it is elsewhere than the linker thinks
-
 
40
 */
-
 
41
.space 4096
-
 
42
 
35
kernel_image_start:
43
kernel_image_start:
-
 
44
	/* Initialize OFW, might be needed before relocate_kernel? */
36
	lis r4, ofw@ha
45
	lis r4, ofw@ha
37
	addi r4, r4, ofw@l
46
	addi r4, r4, ofw@l
38
	stw r5, 0(r4)
47
	stw r5, 0(r4)
39
	
48
	
40
	bl ofw_init
49
	bl ofw_init
-
 
50
	bl preboot_read_config
41
	
51
 
-
 
52
	bl relocate_kernel
-
 
53
__after_reloc:
-
 
54
	/* Set stack to some more meaningful value */
-
 
55
	/* TODO: This is hardcoded for PearPC, must be changed later */
-
 
56
	lis r1, 0x70
42
	b main_bsp
57
	b main_bsp
-
 
58
	
-
 
59
relocate_kernel:
-
 
60
	/* TODO: We _know_ that pearpc loads it to 8MB, and
-
 
61
	 * but it should be really generic
-
 
62
	 */
-
 
63
	lis r4, 0x80 /* r4 is where data was loaded - 8MB */
-
 
64
	
-
 
65
	bl to_real_mode
-
 
66
	/* Now we are in real mode, copy first block and jump to it,
-
 
67
	 * we are running in the loaded kernel now
-
 
68
	 * We still have in r3 physical load kernel address
-
 
69
	 */
-
 
70
	
-
 
71
	b __after_reloc /* We know in pearpc we are ok, so return,
-
 
72
	                 * otherwise we should relocate kernel
-
 
73
		         * here
-
 
74
	                 */
-
 
75
 
-
 
76
	
-
 
77
 
-
 
78
	
-
 
79
/* Turn off page translation
-
 
80
 * - assume that physical-loaded address is in r4
-
 
81
 */
-
 
82
to_real_mode:
-
 
83
	mflr r0
-
 
84
	
-
 
85
	lis   r5, ktext_start@ha // Expected start of kernel
-
 
86
	addi r5, r5, ktext_start@l
-
 
87
	
-
 
88
	add  r0, r4, r0  	
-
 
89
	sub  r0, r0, r5         // r0 now contains physical return address
-
 
90
	
-
 
91
	mfmsr r3
-
 
92
	andis. r3, r3, (~MSR_DR | MSR_IR) >> 16
-
 
93
	mtspr SPRN_SRR0, r0
-
 
94
	mtspr SPRN_SRR1, r3
-
 
95
	sync 			// Really needed? RFI should do it as well?
-
 
96
	RFI
-
 
97