starry_kernel/
dyn_debug.rs1use ax_memory_addr::VirtAddr;
2use ddebug::{ControlFile, DebugOps};
3
4use crate::task::current_user_task;
5
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 current_user_task().as_thread().tid().get() as u64
20 }
21}
22
23#[cfg(feature = "dynamic_debug")]
30#[macro_export]
31macro_rules! debug {
32 ($fmt:literal $(, $arg:expr)* $(,)?) => {{
33 ddebug::pr_debug!($crate::dyn_debug::DynamicDebugOps, $fmt $(, $arg)*);
34 }};
35}
36
37#[cfg(feature = "dynamic_debug")]
44#[macro_export]
45macro_rules! debug_fn {
46 ($fmt:literal $(, $arg:expr)* $(,)?) => {{
47 ddebug::pr_debug_fn!($crate::dyn_debug::DynamicDebugOps, $fmt $(, $arg)*);
48 }};
49}
50
51#[cfg(not(feature = "dynamic_debug"))]
53#[macro_export]
54macro_rules! debug_fn {
55 ($fmt:literal $(, $arg:expr)* $(,)?) => {{
56 ax_log::debug!($fmt $(, $arg)*);
57 }};
58}
59
60pub fn dynamic_debug_init() -> ControlFile<DynamicDebugOps> {
63 info!("debug_init: initializing dynamic debug sites");
64 let ctl = ddebug::dynamic_debug_init::<DynamicDebugOps>();
65 let site_count = ctl.site_count();
66 info!("debug_init: found {site_count} dynamic debug sites");
67 ctl
68}