about summary refs log tree commit diff
path: root/library/panic_abort/src/zkvm.rs
blob: 7b1e89c6a8e63d478873f266ede0151b68864053 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
use alloc::string::String;
use core::panic::PanicPayload;

// Forward the abort message to zkVM's sys_panic. This is implemented by RISC Zero's
// platform crate which exposes system calls specifically for the zkVM.
pub(crate) unsafe fn zkvm_set_abort_message(payload: &mut dyn PanicPayload) {
    let payload = payload.get();
    let msg = match payload.downcast_ref::<&'static str>() {
        Some(msg) => msg.as_bytes(),
        None => match payload.downcast_ref::<String>() {
            Some(msg) => msg.as_bytes(),
            None => &[],
        },
    };
    if msg.is_empty() {
        return;
    }

    unsafe extern "C" {
        fn sys_panic(msg_ptr: *const u8, len: usize) -> !;
    }

    unsafe {
        sys_panic(msg.as_ptr(), msg.len());
    }
}