kernel entry for thumb2-only cpus
Uwe Kleine-König
u.kleine-koenig at pengutronix.de
Sun Aug 5 05:55:28 EDT 2012
On Fri, Aug 03, 2012 at 12:45:32PM +0100, Will Deacon wrote:
> On Fri, Aug 03, 2012 at 10:04:52AM +0100, Uwe Kleine-König wrote:
> > Hello,
>
> Hi Uwe,
>
> > in both arch/arm/kernel/head.S and arch/arm/kernel/head-nommu.S we have
> >
> > .arm
> > THUMB( adr r9, BSYM(1f) ) @ Kernel is always entered in ARM.
> > THUMB( bx r9 ) @ If this is a Thumb-2 kernel,
> > THUMB( .thumb ) @ switch to Thumb now.
> > THUMB(1: )
> >
> > as first instructions at the entry point. This is a problem for
> > thumb2-only cpus (e.g. Cortex-M3).
>
> Yup, Documentation/arm/Booting mentions this too.
>
> > Up to now I commented out the first three lines for the Cortex-M3 port.
> > What should we do about that. There are two possibilities I see:
> >
> > a) introduce a kconfig symbol for thumb2-only builds and #ifdef the
> > first three lines out if it is given.
> > b) expect the bootloader to directly jump to the label 1.
> >
> > The downside of a) is that a boot loader on a cpu that is capable to
> > execute the tradtional instructions would need to detect if the switch
> > to thumb is there or not and react accordingly. (In fact it needs to
> > distringuish three cases:
> >
> > - traditional kernel
> > - thumb2 kernel with ARM entry
> > - thumb2 kernel without ARM entry
> >
> > .) So I think b) is the more sensible option in the long run.
> >
> > What do you think?
>
> How about something like:
>
>
> diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S
> index 835898e..9f07be2 100644
> --- a/arch/arm/kernel/head.S
> +++ b/arch/arm/kernel/head.S
> @@ -86,6 +86,7 @@
> __HEAD
> ENTRY(stext)
>
> + THUMB( .inst 0xe200e004 ) @ ARM: and lr, r0, #4 T2: b 1f
> THUMB( adr r9, BSYM(1f) ) @ Kernel is always entered in ARM.
> THUMB( bx r9 ) @ If this is a Thumb-2 kernel,
> THUMB( .thumb ) @ switch to Thumb now.
Great idea, but it doesn't work as suggested. My compiler already barfs
on the .arm above:
arch/arm/kernel/head-nommu.S:36: Error: selected processor does not support ARM opcodes
arch/arm/kernel/head-nommu.S:42: Error: attempt to use an ARM instruction on a Thumb-only processor -- `adr r9,1f+1'
arch/arm/kernel/head-nommu.S:43: Error: attempt to use an ARM instruction on a Thumb-only processor -- `bx r9'
but something like that should be doable.
Best regards
Uwe
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | http://www.pengutronix.de/ |
More information about the linux-arm-kernel
mailing list