[PATCH] arm: mediatek: fix secondary CPU boot on Thumb-2 kernels with Clang
Akari Tsuyukusa
akkun11.open at gmail.com
Thu Jul 23 02:15:47 PDT 2026
Hi Nick,
On Wed, Jul 22, 2026 at 02:03:31PM -0700, Nick Desaulniers wrote:
> On Wed, Jul 22, 2026 at 10:25 AM Akari Tsuyukusa <akkun11.open at gmail.com> wrote:
> >
> > When building with CONFIG_THUMB2_KERNEL=y and Clang, secondary CPUs
>
> Specifically, was LLVM=1 or CC=clang or something else used?
I used ARCH=arm LLVM=1
config is here:
https://github.com/TeamYogaBlade2/linux/blob/d7633f01ec25209fc6cdde012128b19ac336ab18/arch/arm/configs/lenovo-blade_defconfig
> > secondary_startup_arm is ARM-mode code (.arm) and, on a Thumb-2 kernel,
> > expects to be entered in ARM mode in order to switch to Thumb via the
> > standard sequence at that label. Starting in Thumb mode causes the CPU
> > to execute ARM instructions as Thumb, resulting in an immediate crash.
> >
> > Clear bit 0 of the entry address so the CPU always starts in ARM mode.
>
> Thanks for the patch. Any idea why this isn't an issue for
> GCC+GAS+BFD? Perhaps there's a difference in the LLVM tools that we
> need to address?
>
> There's definitely some difference between clang and GAS here.
> https://github.com/llvm/llvm-project/issues/211376
>
> I wonder if perhaps a better machine-agnostic assembler-agnostic
> assembler-version-agnostic patch would be something like:
>
> ```
> diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S
> index f22c50d4bd41..687ee7063a73 100644
> --- a/arch/arm/kernel/head.S
> +++ b/arch/arm/kernel/head.S
> @@ -383,6 +383,7 @@ ENDPROC(__create_page_tables)
> ENTRY(secondary_startup_arm)
> THUMB( badr r9, 1f ) @ Kernel is entered in ARM.
> THUMB( bx r9 ) @ If this is a Thumb-2 kernel,
> +ENDPROC(secondary_startup_arm)
> THUMB( .thumb ) @ switch to Thumb now.
> THUMB(1: )
> ENTRY(secondary_startup)
> @@ -429,7 +430,6 @@ ARM_BE8(eor r4, r4, r5) @
> without using a temp reg.
> @ (return control reg)
> ret r12
> ENDPROC(secondary_startup)
> -ENDPROC(secondary_startup_arm)
>
> ENTRY(__secondary_switched)
> #if defined(CONFIG_VMAP_STACK) && !defined(CONFIG_ARM_LPAE)
>
> ```
>
> Can you perhaps help test/verify that Akari?
I tested your suggested patch and confirmed that it fixes the issue.
Device: Lenovo YOGA Tablet 10 (Wi-Fi) (MT8125)
Toolchain: Clang/LLVM 22.1.8-2 (cachyos-v3)
Tested-by: Akari Tsuyukusa <akkun11.open at gmail.com>
Can you send your fix as PATCH?
I think your approach is better than mine.
Best Regards,
Akari
More information about the Linux-mediatek
mailing list