[PATCH] rust: arm64: set uwtable llvm module flag for CONFIG_UNWIND_TABLES

Alice Ryhl posted 1 patch 1 week, 4 days ago
arch/arm64/Makefile | 3 +++
1 file changed, 3 insertions(+)
[PATCH] rust: arm64: set uwtable llvm module flag for CONFIG_UNWIND_TABLES
Posted by Alice Ryhl 1 week, 4 days ago
Due to a rustc bug [1] the -Cforce-unwind-tables=y flag only emits the
uwtable annotation for functions, but not for the module. This means
that compiler-generated functions such as 'asan.module_ctor' do not
receive the uwtable annotation.

When CONFIG_UNWIND_PATCH_PAC_INTO_SCS is enabled, this leads to boot
failures because the dwarf information emitted for the kasan
constructors is wrong, which causes the SCS boot patching code to
patch the constructor in an illegal manner. Specifically, the paciasp
instruction is patched, but the autiasp instruction is not. This
mismatch leads to a crash when the constructor is called during boot.

	==================================================================
	BUG: KASAN: global-out-of-bounds in do_basic_setup+0x4c/0x90
	Read of size 8 at addr ffffffe3cc7eb488 by task swapper/0/1

Specifically the faulting instruction is the (*fn)() to invoke the
constructor in do_ctors() of the init/main.c file.

Once the fix lands in rustc, this flag can be made conditional on the
rustc version. Note that passing the flag on a rustc with the fix
present has no effect.

Fixes: d077242d68a3 ("rust: support for shadow call stack sanitizer")
Cc: stable@kernel.org
Link: https://github.com/rust-lang/rust/pull/156980 [1]
Reported-by: Bo Ye <bo.ye@mediatek.com>
Debugged-by: Isaac Manjarres <isaacmanjarres@google.com>
Debugged-by: Sami Tolvanen <samitolvanen@google.com>
Tested-by: Isaac Manjarres <isaacmanjarres@google.com>
Signed-off-by: Alice Ryhl <aliceryhl@google.com>
---
 arch/arm64/Makefile | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
index 73a10f65ce8b..5b21941b5c8d 100644
--- a/arch/arm64/Makefile
+++ b/arch/arm64/Makefile
@@ -63,6 +63,9 @@ else
 KBUILD_CFLAGS	+= -fasynchronous-unwind-tables
 KBUILD_AFLAGS	+= -fasynchronous-unwind-tables
 KBUILD_RUSTFLAGS += -Cforce-unwind-tables=y -Zuse-sync-unwind=n
+# Work around rustc bug on compilers without below change:
+# https://github.com/rust-lang/rust/pull/156973
+KBUILD_RUSTFLAGS += -Zllvm_module_flag=uwtable:u32:2:max
 endif
 
 ifeq ($(CONFIG_STACKPROTECTOR_PER_TASK),y)

---
base-commit: 7fd2df204f342fc17d1a0bfcd474b24232fb0f32
change-id: 20260527-uwtable-module-flag-6a0595bf0e97

Best regards,
-- 
Alice Ryhl <aliceryhl@google.com>
Re: [PATCH] rust: arm64: set uwtable llvm module flag for CONFIG_UNWIND_TABLES
Posted by Miguel Ojeda 1 week, 2 days ago
On Wed, May 27, 2026 at 8:18 PM Alice Ryhl <aliceryhl@google.com> wrote:
>
> Due to a rustc bug [1] the -Cforce-unwind-tables=y flag only emits the
> uwtable annotation for functions, but not for the module. This means
> that compiler-generated functions such as 'asan.module_ctor' do not
> receive the uwtable annotation.
>
> When CONFIG_UNWIND_PATCH_PAC_INTO_SCS is enabled, this leads to boot
> failures because the dwarf information emitted for the kasan
> constructors is wrong, which causes the SCS boot patching code to
> patch the constructor in an illegal manner. Specifically, the paciasp
> instruction is patched, but the autiasp instruction is not. This
> mismatch leads to a crash when the constructor is called during boot.
>
>         ==================================================================
>         BUG: KASAN: global-out-of-bounds in do_basic_setup+0x4c/0x90
>         Read of size 8 at addr ffffffe3cc7eb488 by task swapper/0/1
>
> Specifically the faulting instruction is the (*fn)() to invoke the
> constructor in do_ctors() of the init/main.c file.
>
> Once the fix lands in rustc, this flag can be made conditional on the
> rustc version. Note that passing the flag on a rustc with the fix
> present has no effect.
>
> Fixes: d077242d68a3 ("rust: support for shadow call stack sanitizer")
> Cc: stable@kernel.org
> Link: https://github.com/rust-lang/rust/pull/156980 [1]
> Reported-by: Bo Ye <bo.ye@mediatek.com>
> Debugged-by: Isaac Manjarres <isaacmanjarres@google.com>
> Debugged-by: Sami Tolvanen <samitolvanen@google.com>
> Tested-by: Isaac Manjarres <isaacmanjarres@google.com>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>

Applied to `rust-fixes` -- thanks everyone!

    [ The fix [1] has landed for Rust 1.98.0 (expected release on
      2026-08-20).

      Thus add a version check as discussed.

        - Miguel ]

    [ Adjusted link and comment. - Miguel ]

Cheers,
Miguel
Re: [PATCH] rust: arm64: set uwtable llvm module flag for CONFIG_UNWIND_TABLES
Posted by Miguel Ojeda 1 week, 4 days ago
On Wed, May 27, 2026 at 8:18 PM Alice Ryhl <aliceryhl@google.com> wrote:
>
> Once the fix lands in rustc, this flag can be made conditional on the
> rustc version. Note that passing the flag on a rustc with the fix
> present has no effect.

Already landed now, so if the uwtable one is enough, we could already
do that since it will be 1.98. But since it has no effect, we can keep
the fix as-is and do that on top too.

Added and linked both issues (i.e. `uwtable` and the `frame-pointer` one) to:

  https://github.com/Rust-for-Linux/linux/issues/355

I have to send a fixes PR in the coming days, so I can pick this one
up, but if arm64 will do so then:

Acked-by: Miguel Ojeda <ojeda@kernel.org>

Thanks!

Cheers,
Miguel
Re: [PATCH] rust: arm64: set uwtable llvm module flag for CONFIG_UNWIND_TABLES
Posted by Alice Ryhl 1 week, 3 days ago
On Thu, May 28, 2026 at 07:26:07AM +0200, Miguel Ojeda wrote:
> On Wed, May 27, 2026 at 8:18 PM Alice Ryhl <aliceryhl@google.com> wrote:
> >
> > Once the fix lands in rustc, this flag can be made conditional on the
> > rustc version. Note that passing the flag on a rustc with the fix
> > present has no effect.
> 
> Already landed now, so if the uwtable one is enough, we could already
> do that since it will be 1.98. But since it has no effect, we can keep
> the fix as-is and do that on top too.

Hrm, is there a way to perform the version check in the Makefile, or do
I need a Kconfig for whether the fix is needed?

Alice
Re: [PATCH] rust: arm64: set uwtable llvm module flag for CONFIG_UNWIND_TABLES
Posted by Miguel Ojeda 1 week, 3 days ago
On Fri, May 29, 2026 at 8:32 AM Alice Ryhl <aliceryhl@google.com> wrote:
>
> Hrm, is there a way to perform the version check in the Makefile, or do
> I need a Kconfig for whether the fix is needed?

We shouldn't need a Kconfig -- we can do e.g.

  KBUILD_RUSTFLAGS += $(if $(call
rustc-min-version,109800),,-Zllvm_module_flag=uwtable:u32:2:max)

I tested with 1.96 and nightly -- I can apply it to the Rust tree if
arm64 prefers.

I hope that helps!

Cheers,
Miguel
Re: [PATCH] rust: arm64: set uwtable llvm module flag for CONFIG_UNWIND_TABLES
Posted by Catalin Marinas 1 week, 3 days ago
On Fri, May 29, 2026 at 04:29:26PM +0200, Miguel Ojeda wrote:
> On Fri, May 29, 2026 at 8:32 AM Alice Ryhl <aliceryhl@google.com> wrote:
> > Hrm, is there a way to perform the version check in the Makefile, or do
> > I need a Kconfig for whether the fix is needed?
> 
> We shouldn't need a Kconfig -- we can do e.g.
> 
>   KBUILD_RUSTFLAGS += $(if $(call
> rustc-min-version,109800),,-Zllvm_module_flag=uwtable:u32:2:max)
> 
> I tested with 1.96 and nightly -- I can apply it to the Rust tree if
> arm64 prefers.

Please do.

-- 
Catalin
Re: [PATCH] rust: arm64: set uwtable llvm module flag for CONFIG_UNWIND_TABLES
Posted by Alice Ryhl 1 week, 3 days ago
On Fri, May 29, 2026 at 04:29:26PM +0200, Miguel Ojeda wrote:
> On Fri, May 29, 2026 at 8:32 AM Alice Ryhl <aliceryhl@google.com> wrote:
> >
> > Hrm, is there a way to perform the version check in the Makefile, or do
> > I need a Kconfig for whether the fix is needed?
> 
> We shouldn't need a Kconfig -- we can do e.g.
> 
>   KBUILD_RUSTFLAGS += $(if $(call rustc-min-version,109800),,-Zllvm_module_flag=uwtable:u32:2:max)

Ah, right we can do it like that! LGTM.

Alice
Re: [PATCH] rust: arm64: set uwtable llvm module flag for CONFIG_UNWIND_TABLES
Posted by Alice Ryhl 1 week, 4 days ago
On Thu, May 28, 2026 at 7:26 AM Miguel Ojeda
<miguel.ojeda.sandonis@gmail.com> wrote:
>
> On Wed, May 27, 2026 at 8:18 PM Alice Ryhl <aliceryhl@google.com> wrote:
> >
> > Once the fix lands in rustc, this flag can be made conditional on the
> > rustc version. Note that passing the flag on a rustc with the fix
> > present has no effect.
>
> Already landed now, so if the uwtable one is enough, we could already
> do that since it will be 1.98. But since it has no effect, we can keep
> the fix as-is and do that on top too.

Ah, yes, let's just add the version check.

With regards to the frame-pointer one, it's probably a good idea to do
the same for that one. It's not necessary to fix the boot crash I
encountered, but may help with other issues such as backtraces of
ftrace.

> Added and linked both issues (i.e. `uwtable` and the `frame-pointer` one) to:
>
>   https://github.com/Rust-for-Linux/linux/issues/355
>
> I have to send a fixes PR in the coming days, so I can pick this one
> up, but if arm64 will do so then:
>
> Acked-by: Miguel Ojeda <ojeda@kernel.org>
>
> Thanks!
>
> Cheers,
> Miguel
Re: [PATCH] rust: arm64: set uwtable llvm module flag for CONFIG_UNWIND_TABLES
Posted by Alice Ryhl 1 week, 4 days ago
On Wed, May 27, 2026 at 8:18 PM Alice Ryhl <aliceryhl@google.com> wrote:
> Link: https://github.com/rust-lang/rust/pull/156980 [1]

Oops, should be 156973.