diff --git a/lib/rust/main.c b/lib/rust/main.c index a5fa648cbd1dce5..ba75f92ed4de3ab 100644 --- a/lib/rust/main.c +++ b/lib/rust/main.c @@ -16,4 +16,12 @@ int main(void) return 0; } +/* On most arches, panic is entirely macros resulting in some kind of inline assembly. Create this + * wrapper so the Rust panic handler can call the same kind of panic. + */ +void rust_panic_wrap(void) +{ + k_panic(); +} + #endif diff --git a/lib/rust/zephyr/src/lib.rs b/lib/rust/zephyr/src/lib.rs index 80bf18a05902a42..ce71e46f93aaea8 100644 --- a/lib/rust/zephyr/src/lib.rs +++ b/lib/rust/zephyr/src/lib.rs @@ -33,7 +33,13 @@ fn panic(info :&PanicInfo) -> ! { printkln!("panic: {}", info); } let _ = info; - loop { + + // Call into the wrapper for the system panic function. + unsafe { + extern "C" { + fn rust_panic_wrap() -> !; + } + rust_panic_wrap(); } }