1#![no_std]
8
9#[macro_export]
12macro_rules! resolve_string {
13 ($string:ident) => {
14 $string
15 };
16 ($string:literal) => {{
17 #[unsafe(link_section = "__fxt_interned_string_table")]
18 #[used]
19 static STRING: ::ktrace_rs::InternedString =
20 unsafe { ::ktrace_rs::InternedString::new_raw(concat!($string, "\0").as_ptr()) };
21 &STRING
22 }};
23}
24
25#[macro_export]
28macro_rules! resolve_category {
29 ($category:ident) => {
30 $category
31 };
32 ($category:literal) => {{
33 ::ktrace_rs::declare_interned_category!(CATEGORY, $category, extern);
34 CATEGORY
35 }};
36}
37
38#[macro_export]
45macro_rules! instant {
46 ($category:tt, $label:tt, $context:expr $(, $key:tt => $val:expr)* $(,)?) => {
47 {
48 let category = $crate::resolve_category!($category);
49 let ktrace = ::ktrace_rs::KTrace::get_instance();
50 if ktrace.is_category_enabled(category) {
51 ktrace.emit_event(
52 ::ktrace_rs::EventType::Instant,
53 category,
54 $crate::resolve_string!($label),
55 ::ktrace_rs::timer_current_boot_ticks(),
56 $context,
57 None,
58 &[
59 $(::ktrace_rs::Argument::new($crate::resolve_string!($key), $val)),*
60 ],
61 );
62 }
63 }
64 };
65 ($category:tt, $label:tt $(, $key:tt => $val:expr)* $(,)?) => {
66 $crate::instant!($category, $label, ::ktrace_rs::Context::Thread $(, $key => $val)*)
67 };
68}
69
70#[macro_export]
73macro_rules! cpu_instant {
74 ($category:tt, $label:tt $(, $key:tt => $val:expr)* $(,)?) => {
75 $crate::instant!($category, $label, ::ktrace_rs::Context::Cpu $(, $key => $val)*)
76 };
77}
78
79#[macro_export]
87macro_rules! duration_begin {
88 ($category:tt, $label:tt, $context:expr $(, $key:tt => $val:expr)* $(,)?) => {
89 {
90 let category = $crate::resolve_category!($category);
91 let ktrace = ::ktrace_rs::KTrace::get_instance();
92 if ktrace.is_category_enabled(category) {
93 ktrace.emit_event(
94 ::ktrace_rs::EventType::DurationBegin,
95 category,
96 $crate::resolve_string!($label),
97 ::ktrace_rs::timer_current_boot_ticks(),
98 $context,
99 None,
100 &[
101 $(::ktrace_rs::Argument::new($crate::resolve_string!($key), $val)),*
102 ],
103 );
104 }
105 }
106 };
107 ($category:tt, $label:tt $(, $key:tt => $val:expr)* $(,)?) => {
108 $crate::duration_begin!($category, $label, ::ktrace_rs::Context::Thread $(, $key => $val)*)
109 };
110}
111
112#[macro_export]
115macro_rules! cpu_duration_begin {
116 ($category:tt, $label:tt $(, $key:tt => $val:expr)* $(,)?) => {
117 $crate::duration_begin!($category, $label, ::ktrace_rs::Context::Cpu $(, $key => $val)*)
118 };
119}
120
121#[macro_export]
129macro_rules! duration_end {
130 ($category:tt, $label:tt, $context:expr $(, $key:tt => $val:expr)* $(,)?) => {
131 {
132 let category = $crate::resolve_category!($category);
133 let ktrace = ::ktrace_rs::KTrace::get_instance();
134 if ktrace.is_category_enabled(category) {
135 ktrace.emit_event(
136 ::ktrace_rs::EventType::DurationEnd,
137 category,
138 $crate::resolve_string!($label),
139 ::ktrace_rs::timer_current_boot_ticks(),
140 $context,
141 None,
142 &[
143 $(::ktrace_rs::Argument::new($crate::resolve_string!($key), $val)),*
144 ],
145 );
146 }
147 }
148 };
149 ($category:tt, $label:tt $(, $key:tt => $val:expr)* $(,)?) => {
150 $crate::duration_end!($category, $label, ::ktrace_rs::Context::Thread $(, $key => $val)*)
151 };
152}
153
154#[macro_export]
157macro_rules! cpu_duration_end {
158 ($category:tt, $label:tt $(, $key:tt => $val:expr)* $(,)?) => {
159 $crate::duration_end!($category, $label, ::ktrace_rs::Context::Cpu $(, $key => $val)*)
160 };
161}
162
163#[macro_export]
173macro_rules! counter {
174 ($category:tt, $label:tt, $counter_id:expr $(, $key:tt => $val:expr)* $(,)?) => {
175 {
176 let category = $crate::resolve_category!($category);
177 let ktrace = ::ktrace_rs::KTrace::get_instance();
178 if ktrace.is_category_enabled(category) {
179 ktrace.emit_event(
180 ::ktrace_rs::EventType::Counter,
181 category,
182 $crate::resolve_string!($label),
183 ::ktrace_rs::timer_current_boot_ticks(),
184 ::ktrace_rs::Context::Thread,
185 Some($counter_id as u64),
186 &[
187 $(::ktrace_rs::Argument::new($crate::resolve_string!($key), $val)),*
188 ],
189 );
190 }
191 }
192 };
193}
194
195#[macro_export]
203macro_rules! flow_begin {
204 ($category:tt, $label:tt, $flow_id:expr $(, $key:tt => $val:expr)* $(,)?) => {
205 {
206 let category = $crate::resolve_category!($category);
207 let ktrace = ::ktrace_rs::KTrace::get_instance();
208 if ktrace.is_category_enabled(category) {
209 ktrace.emit_event(
210 ::ktrace_rs::EventType::FlowBegin,
211 category,
212 $crate::resolve_string!($label),
213 ::ktrace_rs::timer_current_boot_ticks(),
214 ::ktrace_rs::Context::Thread,
215 Some($flow_id as u64),
216 &[
217 $(::ktrace_rs::Argument::new($crate::resolve_string!($key), $val)),*
218 ],
219 );
220 }
221 }
222 };
223}
224
225#[macro_export]
233macro_rules! flow_step {
234 ($category:tt, $label:tt, $flow_id:expr $(, $key:tt => $val:expr)* $(,)?) => {
235 {
236 let category = $crate::resolve_category!($category);
237 let ktrace = ::ktrace_rs::KTrace::get_instance();
238 if ktrace.is_category_enabled(category) {
239 ktrace.emit_event(
240 ::ktrace_rs::EventType::FlowStep,
241 category,
242 $crate::resolve_string!($label),
243 ::ktrace_rs::timer_current_boot_ticks(),
244 ::ktrace_rs::Context::Thread,
245 Some($flow_id as u64),
246 &[
247 $(::ktrace_rs::Argument::new($crate::resolve_string!($key), $val)),*
248 ],
249 );
250 }
251 }
252 };
253}
254
255#[macro_export]
263macro_rules! flow_end {
264 ($category:tt, $label:tt, $flow_id:expr $(, $key:tt => $val:expr)* $(,)?) => {
265 {
266 let category = $crate::resolve_category!($category);
267 let ktrace = ::ktrace_rs::KTrace::get_instance();
268 if ktrace.is_category_enabled(category) {
269 ktrace.emit_event(
270 ::ktrace_rs::EventType::FlowEnd,
271 category,
272 $crate::resolve_string!($label),
273 ::ktrace_rs::timer_current_boot_ticks(),
274 ::ktrace_rs::Context::Thread,
275 Some($flow_id as u64),
276 &[
277 $(::ktrace_rs::Argument::new($crate::resolve_string!($key), $val)),*
278 ],
279 );
280 }
281 }
282 };
283}
284
285#[macro_export]
295macro_rules! begin_scope {
296 ($category:tt, $label:tt $(, $key:tt => $val:expr)* $(,)?) => {
297 ::ktrace_rs::KTraceScope::begin(
298 $crate::resolve_category!($category),
299 $crate::resolve_string!($label),
300 ::ktrace_rs::Context::Thread,
301 &[$(::ktrace_rs::Argument::new($crate::resolve_string!($key), $val)),*],
302 )
303 };
304}
305
306#[macro_export]
309macro_rules! cpu_begin_scope {
310 ($category:tt, $label:tt $(, $key:tt => $val:expr)* $(,)?) => {
311 ::ktrace_rs::KTraceScope::begin(
312 $crate::resolve_category!($category),
313 $crate::resolve_string!($label),
314 ::ktrace_rs::Context::Cpu,
315 &[$(::ktrace_rs::Argument::new($crate::resolve_string!($key), $val)),*],
316 )
317 };
318}
319
320#[macro_export]
323macro_rules! begin_scope_cond {
324 ($cond:expr, $category:tt, $label:tt $(, $key:tt => $val:expr)* $(,)?) => {
325 {
326 let category = $crate::resolve_category!($category);
327 let ktrace = ::ktrace_rs::KTrace::get_instance();
328 if $cond && ktrace.is_category_enabled(category) {
329 Some(::ktrace_rs::KTraceScope::begin(
330 category,
331 $crate::resolve_string!($label),
332 ::ktrace_rs::Context::Thread,
333 &[$(::ktrace_rs::Argument::new($crate::resolve_string!($key), $val)),*],
334 ))
335 } else {
336 None
337 }
338 }
339 };
340}
341
342#[macro_export]
351macro_rules! complete {
352 ($category:tt, $label:tt, $start_timestamp:expr, $context:expr $(, $key:tt => $val:expr)* $(,)?) => {
353 {
354 let category = $crate::resolve_category!($category);
355 let ktrace = ::ktrace_rs::KTrace::get_instance();
356 if ktrace.is_category_enabled(category) {
357 ktrace.emit_event(
358 ::ktrace_rs::EventType::DurationComplete,
359 category,
360 $crate::resolve_string!($label),
361 $start_timestamp,
362 $context,
363 Some(::ktrace_rs::timer_current_boot_ticks().0 as u64),
364 &[
365 $(::ktrace_rs::Argument::new($crate::resolve_string!($key), $val)),*
366 ],
367 );
368 }
369 }
370 };
371 ($category:tt, $label:tt, $start_timestamp:expr $(, $key:tt => $val:expr)* $(,)?) => {
372 $crate::complete!($category, $label, $start_timestamp, ::ktrace_rs::Context::Thread $(, $key => $val)*)
373 };
374}
375
376#[macro_export]
379macro_rules! cpu_complete {
380 ($category:tt, $label:tt, $start_timestamp:expr $(, $key:tt => $val:expr)* $(,)?) => {
381 $crate::complete!($category, $label, $start_timestamp, ::ktrace_rs::Context::Cpu $(, $key => $val)*)
382 };
383}
384
385#[macro_export]
394macro_rules! kernel_object {
395 ($category:tt, $koid:expr, $obj_type:expr, $name:tt $(, $key:tt => $val:expr)* $(,)?) => {
396 {
397 let category = $crate::resolve_category!($category);
398 let ktrace = ::ktrace_rs::KTrace::get_instance();
399 if ktrace.is_category_enabled(category) {
400 ktrace.emit_kernel_object_outlined(
401 $koid as u64,
402 $obj_type as u32,
403 $crate::resolve_string!($name),
404 &[
405 $(::ktrace_rs::Argument::new($crate::resolve_string!($key), $val)),*
406 ],
407 );
408 }
409 }
410 };
411}
412
413#[macro_export]
422macro_rules! kernel_object_always {
423 ($koid:expr, $obj_type:expr, $name:tt $(, $key:tt => $val:expr)* $(,)?) => {
424 {
425 let ktrace = ::ktrace_rs::KTrace::get_instance();
426 ktrace.emit_kernel_object_outlined(
427 $koid as u64,
428 $obj_type as u32,
429 $crate::resolve_string!($name),
430 &[
431 $(::ktrace_rs::Argument::new($crate::resolve_string!($key), $val)),*
432 ],
433 );
434 }
435 };
436}