• Tony Lindgren's avatar
    ARM: OMAP3: Fix booting with thumb2 kernel · 9fb9e4f0
    Tony Lindgren authored
    commit d8a50941 upstream.
    
    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>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    9fb9e4f0
sleep34xx.S 15.6 KB