use ax_memory_addr::VirtAddr;
use ax_task::current;
use ddebug::{ControlFile, DebugOps};
pub struct DynamicDebugOps;
impl DebugOps for DynamicDebugOps {
fn write_kernel_text(addr: *mut u8, data: &[u8]) {
crate::mm::write_kernel_text(VirtAddr::from_mut_ptr_of(addr), data)
.expect("Failed to write kernel text");
}
fn emit(line: &str) {
ax_print!("{}", line);
}
fn thread_id() -> u64 {
current().id().as_u64()
}
}
#[cfg(feature = "dynamic_debug")]
#[macro_export]
macro_rules! debug {
($fmt:literal $(, $arg:expr)* $(,)?) => {{
ddebug::pr_debug!($crate::dyn_debug::DynamicDebugOps, $fmt $(, $arg)*);
}};
}
#[cfg(feature = "dynamic_debug")]
#[macro_export]
macro_rules! debug_fn {
($fmt:literal $(, $arg:expr)* $(,)?) => {{
ddebug::pr_debug_fn!($crate::dyn_debug::DynamicDebugOps, $fmt $(, $arg)*);
}};
}
#[cfg(not(feature = "dynamic_debug"))]
#[macro_export]
macro_rules! debug_fn {
($fmt:literal $(, $arg:expr)* $(,)?) => {{
ax_log::debug!($fmt $(, $arg)*);
}};
}
pub fn dynamic_debug_init() -> ControlFile<DynamicDebugOps> {
info!("debug_init: initializing dynamic debug sites");
let ctl = ddebug::dynamic_debug_init::<DynamicDebugOps>();
let site_count = ctl.site_count();
info!("debug_init: found {site_count} dynamic debug sites");
ctl
}