Commit d8a50941 authored by Tony Lindgren's avatar Tony Lindgren

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 <sboyd@codeaurora.org>. 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 6ebbf2ce ("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/Thumb2PortingHowtoReported-by: default avatarKevin Hilman <khilman@kernel.org>
Tested-by: default avatarKevin Hilman <khilman@linaro.org>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent f25bf74c
...@@ -203,23 +203,8 @@ save_context_wfi: ...@@ -203,23 +203,8 @@ save_context_wfi:
*/ */
ldr r1, kernel_flush ldr r1, kernel_flush
blx r1 blx r1
/*
* The kernel doesn't interwork: v7_flush_dcache_all in particluar will
* always return in Thumb state when CONFIG_THUMB2_KERNEL is enabled.
* This sequence switches back to ARM. Note that .align may insert a
* nop: bx pc needs to be word-aligned in order to work.
*/
THUMB( .thumb )
THUMB( .align )
THUMB( bx pc )
THUMB( nop )
.arm
b omap3_do_wfi b omap3_do_wfi
ENDPROC(omap34xx_cpu_suspend)
/*
* Local variables
*/
omap3_do_wfi_sram_addr: omap3_do_wfi_sram_addr:
.word omap3_do_wfi_sram .word omap3_do_wfi_sram
kernel_flush: kernel_flush:
...@@ -364,10 +349,7 @@ exit_nonoff_modes: ...@@ -364,10 +349,7 @@ exit_nonoff_modes:
* =================================== * ===================================
*/ */
ldmfd sp!, {r4 - r11, pc} @ restore regs and return ldmfd sp!, {r4 - r11, pc} @ restore regs and return
ENDPROC(omap3_do_wfi)
/*
* Local variables
*/
sdrc_power: sdrc_power:
.word SDRC_POWER_V .word SDRC_POWER_V
cm_idlest1_core: cm_idlest1_core:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment