v7-M: Fixing XIP when the kernel is in ROM
Chris Brandt
Chris.Brandt at renesas.com
Tue Nov 3 09:52:53 PST 2015
> So the right fix is to move __v7m_setup_stack to .data I guess.
Since my set of patches went nowhere, last week we had a look at doing just that (using a pre-allocated stack in .data instead of hard coding to the top of PLAT_PHYS_OFFSET).
Here's the code we came up with. Seems to work on XIP and non-XIP builds as well as SMP and non-SMP.
Maybe you can try this technique to allocate the temporary stack in the data section.
(and if your patch gets in...then maybe I'll try submitting again...)
-Chris
arch/arm/mm/proc-v7.S | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
--- 0001/arch/arm/mm/proc-v7.S
+++ work/arch/arm/mm/proc-v7.S 2015-10-28 15:44:48.980513000 +0900
@@ -274,7 +274,15 @@ __v7_ca15mp_setup:
__v7_b15mp_setup:
__v7_ca17mp_setup:
mov r10, #0
-1: adr r12, __v7_setup_stack @ the local stack
+1: adr r11, __v7_setup_stack_ptr @ pointer to local stack
+ ldmia r11, {r0, r12}
+#ifdef CONFIG_XIP_KERNEL
+ ldr r11, =PLAT_PHYS_OFFSET @ fixed address
+#else
+ sub r11, r11, r0 @ position independent offset
+#endif
+ add r12, r12, r11 @ phys address
+ sub r12, #PAGE_OFFSET
stmia r12, {r0-r5, lr} @ v7_invalidate_l1 touches r0-r6
bl v7_invalidate_l1
ldmia r12, {r0-r5, lr}
@@ -415,7 +423,15 @@ __v7_pj4b_setup:
#endif /* CONFIG_CPU_PJ4B */
__v7_setup:
- adr r12, __v7_setup_stack @ the local stack
+ adr r11, __v7_setup_stack_ptr @ pointer to local stack
+ ldmia r11, {r0, r12}
+#ifdef CONFIG_XIP_KERNEL
+ ldr r11, =PLAT_PHYS_OFFSET @ fixed address
+#else
+ sub r11, r11, r0 @ position independent offset
+#endif
+ add r12, r12, r11 @ phys address
+ sub r12, #PAGE_OFFSET
stmia r12, {r0-r5, lr} @ v7_invalidate_l1 touches r0-r6
bl v7_invalidate_l1
ldmia r12, {r0-r5, lr}
@@ -482,6 +498,11 @@ __errata_finish:
ret lr @ return to head.S:__ret
ENDPROC(__v7_setup)
+__v7_setup_stack_ptr:
+ .long .
+ .long __v7_setup_stack
+
+ .data
.align 2
__v7_setup_stack:
.space 4 * 7 @ 12 registers
More information about the linux-arm-kernel
mailing list