rust: Add warn_on macro
authorFUJITA Tomonori <fujita.tomonori@gmail.com>
Fri, 2 May 2025 09:45:36 +0000 (18:45 +0900)
committerMiguel Ojeda <ojeda@kernel.org>
Wed, 23 Jul 2025 00:05:58 +0000 (02:05 +0200)
commitdff64b072708ffef23c117fa1ee1ea59eb417807
tree99ed37fa488992927df083ec1bd40243d61339e5
parent826230970a44a50227d4884835ea8a0f8825fe03
rust: Add warn_on macro

Add warn_on macro, uses the BUG/WARN feature (lib/bug.c) via assembly
for x86_64/arm64/riscv.

The current Rust code simply wraps BUG() macro but doesn't provide the
proper debug information. The BUG/WARN feature can only be used from
assembly.

This uses the assembly code exported by the C side via ARCH_WARN_ASM
macro. To avoid duplicating the assembly code, this approach follows
the same strategy as the static branch code: it generates the assembly
code for Rust using the C preprocessor at compile time.

Similarly, ARCH_WARN_REACHABLE is also used at compile time to
generate the assembly code; objtool's reachable annotation code. It's
used for only architectures that use objtool.

For now, Loongarch and arm just use a wrapper for WARN macro.

UML doesn't use the assembly BUG/WARN feature; just wrapping generic
BUG/WARN functions implemented in C works.

Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com>
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Link: https://lore.kernel.org/r/20250502094537.231725-5-fujita.tomonori@gmail.com
[ Avoid evaluating the condition twice (a good idea in general,
  but it also matches the C side). Simplify with `as_char_ptr()`
  to avoid a cast. Cast to `ffi` integer types for
  `warn_slowpath_fmt`. Avoid cast for `null()`. - Miguel ]
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
rust/Makefile
rust/helpers/bug.c
rust/kernel/.gitignore
rust/kernel/bug.rs [new file with mode: 0644]
rust/kernel/generated_arch_reachable_asm.rs.S [new file with mode: 0644]
rust/kernel/generated_arch_warn_asm.rs.S [new file with mode: 0644]
rust/kernel/lib.rs