l2r0_profiler_guest/
lib.rs1#![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 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}