Re: [PATCH V3] powerpc/bug: Add ARCH_WARN_ASM and refactor _EMIT_BUG_ENTRY for Rust support

From: Mukesh Kumar Chaurasiya

Date: Fri Sep 11 2026 - 01:24:25 EST


On Thu, Sep 10, 2026 at 10:24:17PM +0900, FUJITA Tomonori wrote:
> 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.
>
Hey,

Sounds fair to me.
>
> >> 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.
>
Enforcing the label would be a better idea so that we can avoid
mistakes. I'll fix these and send out a new one.

Regards,
Mukesh