Skip to content

Commit 3e1698e

Browse files
committed
ARM: proc-v7: Retry uncached stmia if necessary
A failure of some CPU cores to come online has been traced to the failure of a stm instruction while the cache is disabled. The symptom is that the saved values read back as zeroes, a catastrophic error since one of the values is a return address. This patch forces a readback and retry until the correct value is returned, Notes: At this stage in the boot process the core is running with its cache disabled. Before enabling the cache its contents must be explicitly invalidated, a process that requires quite a few registers that the caller must preserve. Evidence suggests that something is writing a block of zeroes over that space at a time when all other cores should be idle, possibly some kind of write-combiner, and retrying is an attempt to avoid the problem. The previous attempted fix (forcing the accesses to only be 4-byte aligned) appears to have only worked for a while and likely for less obvious reasons such as a change in code alignment. See: Hexxeh/rpi-firmware#232 Signed-off-by: Phil Elwell <[email protected]>
1 parent 36d449a commit 3e1698e

File tree

1 file changed

+8
-0
lines changed

1 file changed

+8
-0
lines changed

arch/arm/mm/proc-v7.S

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,11 @@ __v7_ca17mp_setup:
288288
1: adr r0, __v7_setup_stack_ptr
289289
ldr r12, [r0]
290290
add r12, r12, r0 @ the local stack
291+
1:
291292
stmia r12, {r1-r6, lr} @ v7_invalidate_l1 touches r0-r6
293+
ldr r0, [r12, #(6 * 4)] @ read back the return address
294+
teq r0, lr @ confirm it is correct
295+
bne 1b @ retrying if not
292296
bl v7_invalidate_l1
293297
ldmia r12, {r1-r6, lr}
294298
#ifdef CONFIG_SMP
@@ -474,7 +478,11 @@ __v7_setup:
474478
adr r0, __v7_setup_stack_ptr
475479
ldr r12, [r0]
476480
add r12, r12, r0 @ the local stack
481+
1:
477482
stmia r12, {r1-r6, lr} @ v7_invalidate_l1 touches r0-r6
483+
ldr r0, [r12, #(6 * 4)] @ read back the return address
484+
teq r0, lr @ confirm it is correct
485+
bne 1b @ retrying if not
478486
bl v7_invalidate_l1
479487
ldmia r12, {r1-r6, lr}
480488

0 commit comments

Comments
 (0)