Re: [PATCH V3] powerpc/bug: Add ARCH_WARN_ASM and refactor _EMIT_BUG_ENTRY for Rust support
From: FUJITA Tomonori
Date: Thu Sep 10 2026 - 09:28:45 EST
On Thu, 10 Sep 2026 13:05:27 +0100
"Gary Guo" <gary@xxxxxxxxxxx> wrote:
> On Thu Sep 10, 2026 at 11:08 AM BST, Mukesh Kumar Chaurasiya (IBM) wrote:
>> The Rust kernel infrastructure generates inline asm for WARN() via
>> ARCH_WARN_ASM(file, line, flags, size), expanding it through a C
>> preprocessor pass (generated_arch_warn_asm.rs.S) to produce an
>> arch-specific asm template string for use in Rust's core::arch macros.
>>
>> powerpc currently lacks ARCH_WARN_ASM and ARCH_WARN_REACHABLE, causing
>> Rust builds to fail on powerpc with
>> ```
>> error: no rules expected `ARCH_WARN_ASM`
>> --> /home/linkmauve/dev/linux/wii/rust/kernel/generated_arch_warn_asm.rs:1:28
>> |
>> 1 | ::kernel::concat_literals!(ARCH_WARN_ASM("{file}", "{line}", "{flags}", "{size}"))
>
> I think we probably want to catch this earlier by have something like
>
> #ifndef ARCH_WARN_ASM
> #error "ARCH_WARM_ASM is not defined"
> #endif
>
> in generated_arch_warn_asm.rs.S.
Good idea.
One thing needs to be fixed first. arm and loongarch do not define
ARCH_WARN_ASM. rust/kernel/bug.rs uses bindings::WARN_ON() on those
architectures, so it never includes generated_arch_warn_asm.rs. But
rust/Makefile still generates the file for them. With #error, their
builds would break.
I think we should add a condition to rust/Makefile to stop generating
the file for arm and loongarch. Then #error can be unconditional.
Does that sound reasonable? I can send patches.
>> arch/powerpc/include/asm/bug.h | 36 +++++++++++++++++++---------------
>> 1 file changed, 20 insertions(+), 16 deletions(-)
>>
>> diff --git a/arch/powerpc/include/asm/bug.h b/arch/powerpc/include/asm/bug.h
>> index 0db48977c70c..df2183c35945 100644
>> --- a/arch/powerpc/include/asm/bug.h
>> +++ b/arch/powerpc/include/asm/bug.h
>> @@ -32,34 +32,38 @@
>> #endif /* verbose */
>>
>> #else /* !__ASSEMBLER__ */
>> -/* _EMIT_BUG_ENTRY expects args %0,%1,%2,%3 to be FILE, LINE, flags and
>> - sizeof(struct bug_entry), respectively */
>> #ifdef CONFIG_DEBUG_BUGVERBOSE
>> -#define _EMIT_BUG_ENTRY \
>> - ".section __bug_table,\"aw\"\n" \
>> - "2: .4byte 1b - .\n" \
>> - " .4byte %0 - .\n" \
>> - " .short %1, %2\n" \
>> - ".org 2b+%3\n" \
>> - ".previous\n"
>> +#define _EMIT_BUG_ENTRY(label, file, line, flags) \
>> + ".section __bug_table,\"aw\"\n" \
>> + "2: .4byte " label "b - .\n" \
>
> "b" is part of the label. "1b" itself is a label and "1" is just an integer.
>
> If the code uses
>
> _EMIT_BUG_ENTRY(..)
> "1: ..."
>
> then the correct label would be "1f".
Agreed.
I think keeping the label fixed, as v2 did, would be fine too. x86,
arm64 and riscv all hardcode it. A comment that says the caller must
put the trap at 1: might be enough.