starry_kernel/
dyn_debug.rs1use ax_memory_addr::VirtAddr;
2use ax_task::current;
3use ddebug::{ControlFile, DebugOps};
4
5use crate::task::AsThread;
6pub struct DynamicDebugOps;
7
8impl DebugOps for DynamicDebugOps {
9 fn write_kernel_text(addr: *mut u8, data: &[u8]) {
10 crate::mm::write_kernel_text(VirtAddr::from_mut_ptr_of(addr), data)
11 .expect("Failed to write kernel text");
12 }
13
14 fn emit(line: &str) {
15 ax_print!("{}", line);
16 }
17
18 fn thread_id() -> u64 {
19 let task = current();
20 task.try_as_thread()
21 .map_or_else(|| task.id().as_u64(), |thread| thread.tid().get() as u64)
22 }
23}
24
25#[cfg(feature = "dynamic_debug")]
32#[macro_export]
33macro_rules! debug {
34 ($fmt:literal $(, $arg:expr)* $(,)?) => {{
35 ddebug::pr_debug!($crate::dyn_debug::DynamicDebugOps, $fmt $(, $arg)*);
36 }};
37}
38
39#[cfg(feature = "dynamic_debug")]
46#[macro_export]
47macro_rules! debug_fn {
48 ($fmt:literal $(, $arg:expr)* $(,)?) => {{
49 ddebug::pr_debug_fn!($crate::dyn_debug::DynamicDebugOps, $fmt $(, $arg)*);
50 }};
51}
52
53#[cfg(not(feature = "dynamic_debug"))]
55#[macro_export]
56macro_rules! debug_fn {
57 ($fmt:literal $(, $arg:expr)* $(,)?) => {{
58 ax_log::debug!($fmt $(, $arg)*);
59 }};
60}
61
62pub fn dynamic_debug_init() -> ControlFile<DynamicDebugOps> {
65 info!("debug_init: initializing dynamic debug sites");
66 let ctl = ddebug::dynamic_debug_init::<DynamicDebugOps>();
67 let site_count = ctl.site_count();
68 info!("debug_init: found {site_count} dynamic debug sites");
69 ctl
70}