l2r0_profiler_guest/
lib.rs

1#![allow(unused_imports)]
2pub use self::inner::*;
3
4#[macro_use]
5#[cfg(all(target_os = "zkvm", feature = "print-trace"))]
6pub mod inner {
7    #[repr(align(4))]
8    pub struct MsgChannel(pub [u8; 512]);
9
10    #[no_mangle]
11    pub static mut TRACE_MSG_CHANNEL: MsgChannel = MsgChannel([0u8; 512]);
12    #[no_mangle]
13    pub static mut TRACE_MSG_LEN_CHANNEL: u32 = 0;
14    #[no_mangle]
15    pub static mut TRACE_SIGNAL_CHANNEL: u32 = 0;
16
17    #[inline(always)]
18    pub fn init_trace_logger() {
19        unsafe {
20            core::arch::asm!(
21                r#"
22                nop
23                li x0, 0xCDCDCDCD
24                la x0, TRACE_MSG_CHANNEL
25                la x0, TRACE_MSG_LEN_CHANNEL
26                la x0, TRACE_SIGNAL_CHANNEL
27                nop
28            "#
29            );
30        }
31    }
32
33    #[macro_export]
34    macro_rules! start_timer {
35        ($msg: expr) => {{
36            unsafe {
37                let len = $msg.len();
38                core::ptr::copy($msg.as_ptr(), TRACE_MSG_CHANNEL.0.as_mut_ptr(), len);
39                // prevent out-of-order execution
40                core::arch::asm!(
41                    r#"
42                        nop
43                    "#
44                );
45                core::ptr::write_volatile((&mut TRACE_MSG_LEN_CHANNEL) as *mut u32, len as u32);
46            }
47        }};
48    }
49
50    #[macro_export]
51    macro_rules! stop_timer {
52        () => {{
53            unsafe {
54                core::ptr::write_volatile((&mut TRACE_SIGNAL_CHANNEL) as *mut u32, 0u32);
55                core::arch::asm!(
56                    r#"
57                        nop
58                    "#
59                );
60            }
61        }};
62    }
63
64    #[macro_export]
65    macro_rules! stop_start_timer {
66        ($msg: expr) => {{
67            stop_timer!();
68            start_timer!($msg);
69        }};
70    }
71}
72
73#[macro_use]
74#[cfg(any(not(target_os = "zkvm"), not(feature = "print-trace")))]
75pub mod inner {
76    #[inline(always)]
77    pub fn init_trace_logger() {}
78
79    #[macro_export]
80    macro_rules! start_timer {
81        ($msg: expr) => {{
82            let _ = $msg;
83        }};
84    }
85
86    #[macro_export]
87    macro_rules! stop_timer {
88        () => {{}};
89    }
90    #[macro_export]
91    macro_rules! stop_start_timer {
92        ($msg: expr) => {{
93            let _ = $msg;
94        }};
95    }
96}