Skip to contentSkip to conversation

arch/arm: add support for thumb(1) mode

PATCH New Gustavo Zacarias 3 participants 15 messages Jul 17, 2013 – Jul 19, 2013

lore
Share & tools
lore
#0 lore raw

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
index b2fe257..7fef04c 100644
@@ -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
#1 lore raw

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
#2 lore raw

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.

#3 lore raw

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
#4 lore raw

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.

#5 lore raw

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
#6 lore raw

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.

#7 lore raw

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
#8 lore raw

PATCH 1/1 arch/arm: add support for thumb(1) mode

In reply to Gustavo Zacarias
Quoted 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
#9 lore raw

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.

#10 lore raw

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
#11 lore raw

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.

#12 lore raw

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
#13 lore raw

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.

#14 lore raw

PATCH 1/1 arch/arm: add support for thumb(1) mode

In reply to Gustavo Zacarias
Quoted 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