lkml.org 
[lkml]   [2017]   [Oct]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 162/192] ARM: OMAP3: Fix booting with thumb2 kernel
    3.16.49-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Tony Lindgren <tony@atomide.com>

    commit d8a50941c91a68da202aaa96a3dacd471ea9c693 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 6ebbf2ce437b ("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 <khilman@kernel.org>
    Tested-by: Kevin Hilman <khilman@linaro.org>
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    arch/arm/mach-omap2/sleep34xx.S | 22 ++--------------------
    1 file changed, 2 insertions(+), 20 deletions(-)

    --- a/arch/arm/mach-omap2/sleep34xx.S
    +++ b/arch/arm/mach-omap2/sleep34xx.S
    @@ -203,23 +203,8 @@ save_context_wfi:
    */
    ldr r1, kernel_flush
    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
    -
    -/*
    - * Local variables
    - */
    +ENDPROC(omap34xx_cpu_suspend)
    omap3_do_wfi_sram_addr:
    .word omap3_do_wfi_sram
    kernel_flush:
    @@ -364,10 +349,7 @@ exit_nonoff_modes:
    * ===================================
    */
    ldmfd sp!, {r4 - r11, pc} @ restore regs and return
    -
    -/*
    - * Local variables
    - */
    +ENDPROC(omap3_do_wfi)
    sdrc_power:
    .word SDRC_POWER_V
    cm_idlest1_core:
    \
     
     \ /
      Last update: 2017-10-09 15:59    [W:4.027 / U:0.108 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site