[RFC] Fix omap3 booting with thumb2 compiled kernel

Dave Martin Dave.Martin at arm.com
Thu May 28 09:17:30 PDT 2015


On Thu, May 28, 2015 at 07:21:25AM -0700, Tony Lindgren wrote:
> * Grazvydas Ignotas <notasas at gmail.com> [150528 04:45]:
> > On Thu, May 28, 2015 at 1:55 AM, Tony Lindgren <tony at atomide.com> wrote:
> > > 8 <----------------------
> > > From: Tony Lindgren <tony at atomide.com>
> > > Date: Wed, 27 May 2015 15:33:57 -0700
> > > Subject: [PATCH] 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 moaps needs to interact with
> > 
> > moaps -> omaps
> 
> Thanks, fixed now. I also added a link for why ENDPROC is needed to the
> description. I'll apply the patch below into fixes today.
> 
> Regards,
> 
> Tony
> 
> 8< ----------------------
> From: Tony Lindgren <tony at atomide.com>
> Date: Wed, 27 May 2015 15:33:57 -0700
> Subject: [PATCH] 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 at codeaurora.org>. Let's add the
> missing ENDPROC in two places to sleep34xx.S, and also remove the
> earlier mystery code that was probably also caused by missing ENDPROC
> for earlier kernels.
> 
> 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 at kernel.org>
> Tested-by: Kevin Hilman <khilman at linaro.org>
> Signed-off-by: Tony Lindgren <tony at atomide.com>
> 
> --- 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
> -

^ This looks unrelated to the issue?  This code is simply unnecessary
after Russell introduced the "ret" macro in commit 6ebbf2ce43.  That
made v7_flush_dcache_all do a proper interworking return.

It should probably be in a separate commit, or at least mentioned
explicitly in the commit log.


>  	b	omap3_do_wfi
> -
> -/*
> - * Local variables
> - */

^ Likewise this is just tidyup, not bug fixing.


> +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)

The ENDPROC()s look appropriate here.

[...]

Cheers
---Dave




More information about the linux-arm-kernel mailing list