|
@@ -93,6 +93,30 @@ _ENTRY(_start);
|
|
|
|
|
|
bl early_init
|
|
|
|
|
|
+#ifdef CONFIG_RELOCATABLE
|
|
|
+ /*
|
|
|
+ * r25 will contain RPN/ERPN for the start address of memory
|
|
|
+ *
|
|
|
+ * Add the difference between KERNELBASE and PAGE_OFFSET to the
|
|
|
+ * start of physical memory to get kernstart_addr.
|
|
|
+ */
|
|
|
+ lis r3,kernstart_addr@ha
|
|
|
+ la r3,kernstart_addr@l(r3)
|
|
|
+
|
|
|
+ lis r4,KERNELBASE@h
|
|
|
+ ori r4,r4,KERNELBASE@l
|
|
|
+ lis r5,PAGE_OFFSET@h
|
|
|
+ ori r5,r5,PAGE_OFFSET@l
|
|
|
+ subf r4,r5,r4
|
|
|
+
|
|
|
+ rlwinm r6,r25,0,28,31 /* ERPN */
|
|
|
+ rlwinm r7,r25,0,0,3 /* RPN - assuming 256 MB page size */
|
|
|
+ add r7,r7,r4
|
|
|
+
|
|
|
+ stw r6,0(r3)
|
|
|
+ stw r7,4(r3)
|
|
|
+#endif
|
|
|
+
|
|
|
/*
|
|
|
* Decide what sort of machine this is and initialize the MMU.
|
|
|
*/
|
|
@@ -1001,9 +1025,6 @@ clear_utlb_entry:
|
|
|
lis r3,PAGE_OFFSET@h
|
|
|
ori r3,r3,PAGE_OFFSET@l
|
|
|
|
|
|
- /* Kernel is at the base of RAM */
|
|
|
- li r4, 0 /* Load the kernel physical address */
|
|
|
-
|
|
|
/* Load the kernel PID = 0 */
|
|
|
li r0,0
|
|
|
mtspr SPRN_PID,r0
|
|
@@ -1013,9 +1034,8 @@ clear_utlb_entry:
|
|
|
clrrwi r3,r3,12 /* Mask off the effective page number */
|
|
|
ori r3,r3,PPC47x_TLB0_VALID | PPC47x_TLB0_256M
|
|
|
|
|
|
- /* Word 1 */
|
|
|
- clrrwi r4,r4,12 /* Mask off the real page number */
|
|
|
- /* ERPN is 0 for first 4GB page */
|
|
|
+ /* Word 1 - use r25. RPN is the same as the original entry */
|
|
|
+
|
|
|
/* Word 2 */
|
|
|
li r5,0
|
|
|
ori r5,r5,PPC47x_TLB2_S_RWX
|
|
@@ -1026,7 +1046,7 @@ clear_utlb_entry:
|
|
|
/* We write to way 0 and bolted 0 */
|
|
|
lis r0,0x8800
|
|
|
tlbwe r3,r0,0
|
|
|
- tlbwe r4,r0,1
|
|
|
+ tlbwe r25,r0,1
|
|
|
tlbwe r5,r0,2
|
|
|
|
|
|
/*
|
|
@@ -1124,7 +1144,13 @@ head_start_common:
|
|
|
lis r4,interrupt_base@h /* IVPR only uses the high 16-bits */
|
|
|
mtspr SPRN_IVPR,r4
|
|
|
|
|
|
- addis r22,r22,KERNELBASE@h
|
|
|
+ /*
|
|
|
+ * If the kernel was loaded at a non-zero 256 MB page, we need to
|
|
|
+ * mask off the most significant 4 bits to get the relative address
|
|
|
+ * from the start of physical memory
|
|
|
+ */
|
|
|
+ rlwinm r22,r22,0,4,31
|
|
|
+ addis r22,r22,PAGE_OFFSET@h
|
|
|
mtlr r22
|
|
|
isync
|
|
|
blr
|