Skip to content

Commit d8a5094

Browse files
committed
ARM: OMAP3: Fix booting with thumb2 kernel
We get a NULL pointer dereference on omap3 for thumb2 compiled kernels: Internal error: Oops: 80000005 [#1] SMP THUMB2 ... [<c046497b>] (_raw_spin_unlock_irqrestore) from [<c0024375>] (omap3_enter_idle_bm+0xc5/0x178) [<c0024375>] (omap3_enter_idle_bm) from [<c0374e63>] (cpuidle_enter_state+0x77/0x27c) [<c0374e63>] (cpuidle_enter_state) from [<c00627f1>] (cpu_startup_entry+0x155/0x23c) [<c00627f1>] (cpu_startup_entry) from [<c06b9a47>] (start_kernel+0x32f/0x338) [<c06b9a47>] (start_kernel) from [<8000807f>] (0x8000807f) The power management related assembly on omaps needs to interact with ARM mode bootrom code, so we need to keep most of the related assembly in ARM mode. Turns out this error is because of missing ENDPROC for assembly code as suggested by Stephen Boyd <[email protected]>. Let's fix the problem by adding ENDPROC in two places to sleep34xx.S. Let's also remove the now duplicate custom code for mode switching. This has been unnecessary since commit 6ebbf2c ("ARM: convert all "mov.* pc, reg" to "bx reg" for ARMv6+"). And let's also remove the comments about local variables, they are now just confusing after the ENDPROC. The reason why ENDPROC makes a difference is it sets .type and then the compiler knows what to do with the thumb bit as explained at: https://wiki.ubuntu.com/ARM/Thumb2PortingHowto Reported-by: Kevin Hilman <[email protected]> Tested-by: Kevin Hilman <[email protected]> Signed-off-by: Tony Lindgren <[email protected]>
1 parent f25bf74 commit d8a5094

File tree

1 file changed

+2
-20
lines changed

1 file changed

+2
-20
lines changed

arch/arm/mach-omap2/sleep34xx.S

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -203,23 +203,8 @@ save_context_wfi:
203203
*/
204204
ldr r1, kernel_flush
205205
blx r1
206-
/*
207-
* The kernel doesn't interwork: v7_flush_dcache_all in particluar will
208-
* always return in Thumb state when CONFIG_THUMB2_KERNEL is enabled.
209-
* This sequence switches back to ARM. Note that .align may insert a
210-
* nop: bx pc needs to be word-aligned in order to work.
211-
*/
212-
THUMB( .thumb )
213-
THUMB( .align )
214-
THUMB( bx pc )
215-
THUMB( nop )
216-
.arm
217-
218206
b omap3_do_wfi
219-
220-
/*
221-
* Local variables
222-
*/
207+
ENDPROC(omap34xx_cpu_suspend)
223208
omap3_do_wfi_sram_addr:
224209
.word omap3_do_wfi_sram
225210
kernel_flush:
@@ -364,10 +349,7 @@ exit_nonoff_modes:
364349
* ===================================
365350
*/
366351
ldmfd sp!, {r4 - r11, pc} @ restore regs and return
367-
368-
/*
369-
* Local variables
370-
*/
352+
ENDPROC(omap3_do_wfi)
371353
sdrc_power:
372354
.word SDRC_POWER_V
373355
cm_idlest1_core:

0 commit comments

Comments
 (0)