On Tue, Sep 22, 2026 at 11:20:00AM +0530, Mukesh Kumar Chaurasiya (IBM) wrote:
> Verify that the __bug_table entry emitted by ARCH_WARN_ASM has a correct
> bug_addr displacement — i.e. the arch's trap label reference resolves to
> the trap instruction — by calling find_bug() with the exact virtual address
> of the trap, mirroring what the real trap handler does.
>
> To support all architectures, each arch that implements ARCH_WARN_ASM now
> defines ARCH_WARN_ASM_TRAP_LABEL, a string constant naming the local label
> at which the trap instruction is placed:
>
> x86 "1" (ud2 at label 1:)
> powerpc "1" (twi at label 1:)
> riscv "1" (ebreak at label 1:)
> arm64 "14471" (brk placed at 14471: by __BUG_ENTRY_END)
> s390 "0" (mc at label 0:)
>
> The label is used consistently: in ARCH_WARN_ASM itself, in the
> bug_addr back-reference inside __BUG_ENTRY / _EMIT_BUG_ENTRY,
> diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h
> index 23ab05438269..6cca8880660e 100644
> --- a/arch/x86/include/asm/bug.h
> +++ b/arch/x86/include/asm/bug.h
> @@ -62,8 +62,9 @@ extern void __WARN_trap(struct bug_entry *bug, ...);
> #define HAVE_ARCH_BUG_FORMAT_ARGS
> #endif
>
> +#define ARCH_WARN_ASM_TRAP_LABEL "1"
> #define __BUG_ENTRY(format, file, line, flags)
> \
> - "\t.long 1b - ." "\t# bug_entry::bug_addr\n" \
> + "\t.long " ARCH_WARN_ASM_TRAP_LABEL "b - ." "\t# bug_entry::bug_addr\n"
> \
> __BUG_ENTRY_FORMAT(format) \
> __BUG_ENTRY_VERBOSE(file, line) \
> "\t.word " flags "\t# bug_entry::flags\n"
> @@ -101,7 +102,7 @@ do {
> \
> "99:\n" \
> "\t.string \"\"\n" \
> ".popsection\n" \
> - "1:\t " ASM_UD2 "\n" \
> + ARCH_WARN_ASM_TRAP_LABEL ":\t " ASM_UD2 "\n" \
> _BUG_FLAGS_ASM("99b", file, line, flags, size, "")
>
> #else
Not really a fan of that. And I can't really tell what you're doing with
it either. The kunit is in Rust and thus unreadable :-(
I would rather you fix up is_valid_bugaddr(), some architectures seem to
have an always true stub because of the callchains always being from the
break instruction.