arch/arm: add support for thumb(1) mode
PATCH 1/1 arch/arm: add support for thumb(1) mode
--- arch/Config.in.arm | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-)
arch/Config.in.arm +26 -2
@@ -31,6 +31,9 @@ config BR2_ARM_CPU_HAS_VFPV4 bool select BR2_ARM_CPU_HAS_VFPV3 +config BR2_ARM_CPU_HAS_THUMB + bool + config BR2_ARM_CPU_HAS_THUMB2 bool
@@ -43,28 +46,38 @@ choice config BR2_arm7tdmi bool "arm7tdmi" + select BR2_ARM_CPU_HAS_THUMB config BR2_arm720t bool "arm720t" + select BR2_ARM_CPU_HAS_THUMB config BR2_arm920t bool "arm920t" + select BR2_ARM_CPU_HAS_THUMB config BR2_arm922t bool "arm922t" + select BR2_ARM_CPU_HAS_THUMB config BR2_arm926t bool "arm926t" select BR2_ARM_CPU_MAYBE_HAS_VFPV2 + select BR2_ARM_CPU_HAS_THUMB config BR2_arm10t bool "arm10t" + select BR2_ARM_CPU_HAS_THUMB config BR2_arm1136jf_s_r0 bool "arm1136jf_s rev0" select BR2_ARM_CPU_HAS_VFPV2 + select BR2_ARM_CPU_HAS_THUMB config BR2_arm1136jf_s_r1 bool "arm1136jf_s rev1" select BR2_ARM_CPU_HAS_VFPV2 + select BR2_ARM_CPU_HAS_THUMB config BR2_arm1176jz_s bool "arm1176jz-s" + select BR2_ARM_CPU_HAS_THUMB config BR2_arm1176jzf_s bool "arm1176jzf-s" select BR2_ARM_CPU_HAS_VFPV2 + select BR2_ARM_CPU_HAS_THUMB config BR2_cortex_a5 bool "cortex-A5" select BR2_ARM_CPU_MAYBE_HAS_NEON
@@ -99,6 +112,7 @@ config BR2_strongarm bool "strongarm sa110/sa1100" config BR2_xscale bool "xscale" + select BR2_ARM_CPU_HAS_THUMB config BR2_iwmmxt bool "iwmmxt" endchoice
@@ -286,7 +300,7 @@ endchoice choice prompt "ARM instruction set" - depends on BR2_ARM_CPU_HAS_THUMB2 + depends on BR2_ARM_CPU_HAS_THUMB || BR2_ARM_CPU_HAS_THUMB2 config BR2_ARM_INSTRUCTIONS_ARM_CHOICE bool "ARM"
@@ -294,8 +308,18 @@ config BR2_ARM_INSTRUCTIONS_ARM_CHOICE This option instructs the compiler to generate regular ARM instructions, that are all 32 bits wide. +config BR2_ARM_INSTRUCTIONS_THUMB + bool "Thumb" + depends on BR2_ARM_CPU_HAS_THUMB + help + This option instructions the compiler to generate Thumb + instructions, which allows to mix 16 bits instructions and + 32 bits instructions. This generally provides a much smaller + compiled binary size. + config BR2_ARM_INSTRUCTIONS_THUMB2 bool "Thumb2" + depends on BR2_ARM_CPU_HAS_THUMB2 help This option instructions the compiler to generate Thumb2 instructions, which allows to mix 16 bits instructions and
@@ -306,7 +330,7 @@ endchoice config BR2_ARM_INSTRUCTIONS_ARM def_bool y - depends on !BR2_ARM_INSTRUCTIONS_THUMB2 + depends on !(BR2_ARM_INSTRUCTIONS_THUMB || BR2_ARM_INSTRUCTIONS_THUMB2) config BR2_ARCH default "arm" if BR2_arm
Signature · 1 line
1.8.1.5
PATCH 1/1 arch/arm: add support for thumb(1) mode
Dear Gustavo Zacarias,
arch/Config.in.arm config BR2_ARM_INSTRUCTIONS_ARM_CHOICE · line 318
Quoted 8 lines · Gustavo Zacarias
arch/Config.in.arm +8
-0+config BR2_ARM_INSTRUCTIONS_THUMB + bool "Thumb" + depends on BR2_ARM_CPU_HAS_THUMB + help + This option instructions the compiler to generate Thumb + instructions, which allows to mix 16 bits instructions and + 32 bits instructions. This generally provides a much smaller + compiled binary size.
I think this is misleading: Thumb doesn't allow to mix 16 bits and 32 bits instructions like Thumb2 does. IIRC, with Thumb, a particular function needs to be either completely Thumb (16 bits) or completely ARM (32 bits), and there is the thumb-interworking mechanism between the two.
Which leads me to this question: is adding Thumb support as simple as what you're adding? Aren't there some additional thumb-interworking complexities to handle?
Thanks!
Thomas
Signature · 4 lines
Thomas Petazzoni, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
PATCH 1/1 arch/arm: add support for thumb(1) mode
Quoted 9 lines · Thomas Petazzoni
I think this is misleading: Thumb doesn't allow to mix 16 bits and 32 bits instructions like Thumb2 does. IIRC, with Thumb, a particular function needs to be either completely Thumb (16 bits) or completely ARM (32 bits), and there is the thumb-interworking mechanism between the two.
Which leads me to this question: is adding Thumb support as simple as what you're adding? Aren't there some additional thumb-interworking complexities to handle?
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf
Section 5.6 is of interest, once OABI (APCS) was dropped interworking isn't that hard since it's mandatory for AAPCS.
Regards.
PATCH 1/1 arch/arm: add support for thumb(1) mode
Dear Gustavo Zacarias,
Quoted 7 lines · Gustavo Zacarias
Quoted 3 lines
Which leads me to this question: is adding Thumb support as simple as what you're adding? Aren't there some additional thumb-interworking complexities to handle?
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf
Section 5.6 is of interest, once OABI (APCS) was dropped interworking isn't that hard since it's mandatory for AAPCS.
Ok, so if I select "Thumb" for ARMv5T, but use a normal ARMv5 external toolchain (compiled ARM, not Thumb), it should work. Am I correct?
Thanks!
Thomas
Signature · 4 lines
Thomas Petazzoni, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
PATCH 1/1 arch/arm: add support for thumb(1) mode
Quoted 3 lines · Thomas Petazzoni
Ok, so if I select "Thumb" for ARMv5T, but use a normal ARMv5 external toolchain (compiled ARM, not Thumb), it should work. Am I correct?
Yes, because at the moment it's a NOP, we don't do anything regarding thumb and external toolchains :)
However if we did it must work, it's part of the spec and the gcc default as long as we are talking about a thumb-supporting cpu of course. Regards.
PATCH 1/1 arch/arm: add support for thumb(1) mode
Dear Gustavo Zacarias,
Quoted 8 lines · Gustavo Zacarias
Quoted 3 lines · Thomas Petazzoni
Ok, so if I select "Thumb" for ARMv5T, but use a normal ARMv5 external toolchain (compiled ARM, not Thumb), it should work. Am I correct?
Yes, because at the moment it's a NOP, we don't do anything regarding thumb and external toolchains :)
We definitely do something. If you enable Thumb in the configuration, then -mthumb gets hard-coded into the external toolchain wrapper. If you enable ARM in the configuration, then -marm gets hard-coded into the external toolchain wrapper.
See:
http://git.buildroot.net/buildroot/tree/toolchain/toolchain-external/ext-tool.mk#n183
and:
http://git.buildroot.net/buildroot/tree/toolchain/toolchain-external/ext-toolchain-wrapper.c#n50.
Thomas
Signature · 4 lines
Thomas Petazzoni, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
PATCH 1/1 arch/arm: add support for thumb(1) mode
Quoted 9 lines · Thomas Petazzoni
We definitely do something. If you enable Thumb in the configuration, then -mthumb gets hard-coded into the external toolchain wrapper. If you enable ARM in the configuration, then -marm gets hard-coded into the external toolchain wrapper.
See:
http://git.buildroot.net/buildroot/tree/toolchain/toolchain-external/ext-tool.mk#n183
and:
http://git.buildroot.net/buildroot/tree/toolchain/toolchain-external/ext-toolchain-wrapper.c#n50.
Missed that!
It's working though, tested on real hardware (arm920t) with CS 2013.05 Regards.
PATCH 1/1 arch/arm: add support for thumb(1) mode
Dear Gustavo Zacarias,
Quoted 5 lines · Gustavo Zacarias
Quoted 5 lines
We definitely do something. If you enable Thumb in the configuration, then -mthumb gets hard-coded into the external toolchain wrapper. If you enable ARM in the configuration, then -marm gets hard-coded into the external toolchain wrapper.
Quoted 7 lines
Quoted 4 lines
See:
http://git.buildroot.net/buildroot/tree/toolchain/toolchain-external/ext-tool.mk#n183
and:
http://git.buildroot.net/buildroot/tree/toolchain/toolchain-external/ext-toolchain-wrapper.c#n50.Missed that!
It's working though, tested on real hardware (arm920t) with CS 2013.05
Excellent, thanks for the testing!
Thomas
Signature · 4 lines
Thomas Petazzoni, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
PATCH 1/1 arch/arm: add support for thumb(1) mode
In reply to Gustavo ZacariasQuoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Gustavo" == Gustavo Zacarias <[email protected]> writes:
Quoted 3 lines · Thomas Petazzoni
Quoted 3 lines
Ok, so if I select "Thumb" for ARMv5T, but use a normal ARMv5 external toolchain (compiled ARM, not Thumb), it should work. Am I correct?
Gustavo> Yes, because at the moment it's a NOP, we don't do anything Gustavo> regarding thumb and external toolchains :) However if we did Gustavo> it must work, it's part of the spec and the gcc default as Gustavo> long as we are talking about a thumb-supporting cpu of course.
FYI, I just did a test build (arm926/thumb1/internal uclibc), and the build dies in NPTL when it runs out of registers. Without threads it builds and seems to work.
Signature · 1 line
Bye, Peter Korsgaard
PATCH 1/1 arch/arm: add support for thumb(1) mode
Quoted 3 lines · Peter Korsgaard
FYI, I just did a test build (arm926/thumb1/internal uclibc), and the build dies in NPTL when it runs out of registers. Without threads it builds and seems to work.
I regularly build -mthumb (via CFLAGS) projects without issues for an arm920t, but that doesn't force those flags for uclibc, just catched the breakage after you fixed my patch (mine was a no-op, d'oh!) Seems uclibc is broken for thumb builds, even with COMPILE_IN_THUMB_MODE=y in its config (which the only thing it does is add -mthumb to the compile flags).
Patches follow to make uclibc build on ARM mode regardless to avoid the breakage (eglibc seems broken too, though none of them for thumb2 since the register set isn't restricted).
I've also disabled libmudflap for thumb1 since it doesn't build either - i know Thomas has a patchset coming adding the option for libmudflap, just that i don't want to leave it broken/undocumented in the mean time. Regards.
PATCH 1/1 arch/arm: add support for thumb(1) mode
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Gustavo" == Gustavo Zacarias <[email protected]> writes:
Quoted 3 lines · Peter Korsgaard
Quoted 3 lines
FYI, I just did a test build (arm926/thumb1/internal uclibc), and the build dies in NPTL when it runs out of registers. Without threads it builds and seems to work.
Gustavo> I regularly build -mthumb (via CFLAGS) projects without issues for an Gustavo> arm920t, but that doesn't force those flags for uclibc, just catched the Gustavo> breakage after you fixed my patch (mine was a no-op, d'oh!) Gustavo> Seems uclibc is broken for thumb builds, even with
Gustavo> COMPILE_IN_THUMB_MODE=y in its config (which the only thing it does is Gustavo> add -mthumb to the compile flags).
Actually the uClibc breakage seems to only be in the NPTL stuff. A test build without threads worked OK.
Signature · 1 line
Bye, Peter Korsgaard
PATCH 1/1 arch/arm: add support for thumb(1) mode
Quoted 2 lines · Peter Korsgaard
Actually the uClibc breakage seems to only be in the NPTL stuff. A test build without threads worked OK.
Question is did (does) it really work or just built? Regards.
PATCH 1/1 arch/arm: add support for thumb(1) mode
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Gustavo" == Gustavo Zacarias <[email protected]> writes:
Quoted 2 lines · Peter Korsgaard
Quoted 2 lines
Actually the uClibc breakage seems to only be in the NPTL stuff. A test build without threads worked OK.
Gustavo> Question is did (does) it really work or just built?
A statically built busybox with it atleast ran here. I didn't really give it a lot of testing though.
Signature · 1 line
Bye, Peter Korsgaard
PATCH 1/1 arch/arm: add support for thumb(1) mode
Quoted 4 lines · Peter Korsgaard
Gustavo> Question is did (does) it really work or just built?
A statically built busybox with it atleast ran here. I didn't really give it a lot of testing though.
Fair enough then, i'll send a v2.
Regards.
PATCH 1/1 arch/arm: add support for thumb(1) mode
In reply to Gustavo ZacariasQuoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Gustavo" == Gustavo Zacarias <[email protected]> writes:
Gustavo> Signed-off-by: Gustavo Zacarias <[email protected]> Gustavo> ---
Gustavo> arch/Config.in.arm | 28 ++++++++++++++++++++++++++--
Gustavo> 1 file changed, 26 insertions(+), 2 deletions(-)
Gustavo> config BR2_ARM_INSTRUCTIONS_ARM
Gustavo> def_bool y
Gustavo> - depends on !BR2_ARM_INSTRUCTIONS_THUMB2
Gustavo> + depends on !(BR2_ARM_INSTRUCTIONS_THUMB || BR2_ARM_INSTRUCTIONS_THUMB2)
You seem to have missed setting BR2_TARGET_CPU_MODE to "thumb", so it doesn't actually do anything.
Committed with that fixed, thanks.
Signature · 1 line
Bye, Peter Korsgaard