|
@@ -457,12 +457,22 @@ __after_prom_start:
|
|
/* process relocations for the final address of the kernel */
|
|
/* process relocations for the final address of the kernel */
|
|
lis r25,PAGE_OFFSET@highest /* compute virtual base of kernel */
|
|
lis r25,PAGE_OFFSET@highest /* compute virtual base of kernel */
|
|
sldi r25,r25,32
|
|
sldi r25,r25,32
|
|
|
|
+#if defined(CONFIG_PPC_BOOK3E)
|
|
|
|
+ tovirt(r26,r26) /* on booke, we already run at PAGE_OFFSET */
|
|
|
|
+#endif
|
|
lwz r7,__run_at_load-_stext(r26)
|
|
lwz r7,__run_at_load-_stext(r26)
|
|
|
|
+#if defined(CONFIG_PPC_BOOK3E)
|
|
|
|
+ tophys(r26,r26)
|
|
|
|
+#endif
|
|
cmplwi cr0,r7,1 /* flagged to stay where we are ? */
|
|
cmplwi cr0,r7,1 /* flagged to stay where we are ? */
|
|
bne 1f
|
|
bne 1f
|
|
add r25,r25,r26
|
|
add r25,r25,r26
|
|
1: mr r3,r25
|
|
1: mr r3,r25
|
|
bl relocate
|
|
bl relocate
|
|
|
|
+#if defined(CONFIG_PPC_BOOK3E)
|
|
|
|
+ /* IVPR needs to be set after relocation. */
|
|
|
|
+ bl init_core_book3e
|
|
|
|
+#endif
|
|
#endif
|
|
#endif
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -490,12 +500,21 @@ __after_prom_start:
|
|
* variable __run_at_load, if it is set the kernel is treated as relocatable
|
|
* variable __run_at_load, if it is set the kernel is treated as relocatable
|
|
* kernel, otherwise it will be moved to PHYSICAL_START
|
|
* kernel, otherwise it will be moved to PHYSICAL_START
|
|
*/
|
|
*/
|
|
|
|
+#if defined(CONFIG_PPC_BOOK3E)
|
|
|
|
+ tovirt(r26,r26) /* on booke, we already run at PAGE_OFFSET */
|
|
|
|
+#endif
|
|
lwz r7,__run_at_load-_stext(r26)
|
|
lwz r7,__run_at_load-_stext(r26)
|
|
cmplwi cr0,r7,1
|
|
cmplwi cr0,r7,1
|
|
bne 3f
|
|
bne 3f
|
|
|
|
|
|
|
|
+#ifdef CONFIG_PPC_BOOK3E
|
|
|
|
+ LOAD_REG_ADDR(r5, __end_interrupts)
|
|
|
|
+ LOAD_REG_ADDR(r11, _stext)
|
|
|
|
+ sub r5,r5,r11
|
|
|
|
+#else
|
|
/* just copy interrupts */
|
|
/* just copy interrupts */
|
|
LOAD_REG_IMMEDIATE(r5, __end_interrupts - _stext)
|
|
LOAD_REG_IMMEDIATE(r5, __end_interrupts - _stext)
|
|
|
|
+#endif
|
|
b 5f
|
|
b 5f
|
|
3:
|
|
3:
|
|
#endif
|
|
#endif
|
|
@@ -514,9 +533,6 @@ __after_prom_start:
|
|
p_end: .llong _end - _stext
|
|
p_end: .llong _end - _stext
|
|
|
|
|
|
4: /* Now copy the rest of the kernel up to _end */
|
|
4: /* Now copy the rest of the kernel up to _end */
|
|
-#if defined(CONFIG_PPC_BOOK3E)
|
|
|
|
- tovirt(r26,r26)
|
|
|
|
-#endif
|
|
|
|
addis r5,r26,(p_end - _stext)@ha
|
|
addis r5,r26,(p_end - _stext)@ha
|
|
ld r5,(p_end - _stext)@l(r5) /* get _end */
|
|
ld r5,(p_end - _stext)@l(r5) /* get _end */
|
|
5: bl copy_and_flush /* copy the rest */
|
|
5: bl copy_and_flush /* copy the rest */
|