Thread (28 messages) 28 messages, 7 authors, 2022-01-21

Re: [PATCH 06/14] ARM: disallow CONFIG_THUMB with ARMv4

From: Ard Biesheuvel <ardb@kernel.org>
Date: 2021-10-06 16:01:37
Also in: linux-arm-kernel, lkml

On Tue, 28 Sept 2021 at 17:42, Arnd Bergmann [off-list ref] wrote:
From: Arnd Bergmann <arnd@arndb.de>

We can currently build a multi-cpu enabled kernel that allows both ARMv4
and ARMv5 CPUs, and also supports THUMB mode in user space.

However, returning to user space in this configuration with the usr_ret
macro requires the use of the 'bx' instruction, which is refused by
the assembler:

arch/arm/kernel/entry-armv.S: Assembler messages:
arch/arm/kernel/entry-armv.S:937: Error: selected processor does not support `bx lr' in ARM mode
arch/arm/kernel/entry-armv.S:960: Error: selected processor does not support `bx lr' in ARM mode
arch/arm/kernel/entry-armv.S:1003: Error: selected processor does not support `bx lr' in ARM mode
<instantiation>:2:2: note: instruction requires: armv4t
 bx lr

While it would be possible to handle this correctly in principle, doing so
seems to not be worth it, if we can simply avoid the problem by enforcing
that a kernel supporting both ARMv4 and a later CPU architecture cannot
run THUMB binaries.
I had a quick look, and it seems that the only way to handle this
correctly is to emit the BX instructions, and use code patching to
change them into 'mov pc, <reg>' if the runtime detected CPU is not
Thumb capable. The usual approach (emitting 'tst <reg>, #1; moveq pc,
<reg>; bx lr') is not feasible here, since we run out of space in the
kuser helper slots.

Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
quoted hunk ↗ jump to hunk
This turned up while build-testing with clang; for some reason,
gcc never triggered the problem.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/arm/mm/Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig
index 82aa990c4180..58afba346729 100644
--- a/arch/arm/mm/Kconfig
+++ b/arch/arm/mm/Kconfig
@@ -675,7 +675,7 @@ config ARM_PV_FIXUP

 config ARM_THUMB
        bool "Support Thumb user binaries" if !CPU_THUMBONLY && EXPERT
-       depends on CPU_THUMB_CAPABLE
+       depends on CPU_THUMB_CAPABLE && !CPU_32v4
        default y
        help
          Say Y if you want to include kernel support for running user space
--
2.29.2
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help