use alloc::sync::Arc;
use ax_task::current;
use kprobe::{ProbeBuilder, Uprobe};
use crate::{
kprobe::{KernelKprobeOps, KernelRawMutex, ptregs_write_back, trapframe_to_ptregs},
task::AsThread,
};
pub type KernelUprobe = Uprobe<KernelRawMutex, KernelKprobeOps>;
pub fn register_uprobe(builder: ProbeBuilder<KernelKprobeOps>) -> Arc<KernelUprobe> {
let curr = current();
let thread = curr.as_thread();
let manager = &thread.proc_data.uprobe_manager;
let mut point_list = thread.proc_data.uprobe_point_list.lock();
kprobe::register_uprobe(manager, &mut point_list, builder).unwrap()
}
pub fn unregister_uprobe(uprobe: Arc<KernelUprobe>) {
let curr = current();
let thread = curr.as_thread();
let manager = &thread.proc_data.uprobe_manager;
let mut point_list = thread.proc_data.uprobe_point_list.lock();
kprobe::unregister_uprobe(manager, &mut point_list, uprobe);
}
pub fn break_uprobe_handler(tf: &mut ax_runtime::hal::cpu::TrapFrame) -> Option<()> {
let curr = current();
let manager = &curr.as_thread().proc_data.uprobe_manager;
let mut pt_regs = trapframe_to_ptregs(tf);
let res = kprobe::uprobe_handler_from_break(manager, &mut pt_regs);
ptregs_write_back(&pt_regs, tf);
res
}
#[cfg(target_arch = "x86_64")]
pub fn debug_uprobe_handler(tf: &mut ax_runtime::hal::cpu::TrapFrame) -> Option<()> {
let curr = current();
let manager = &curr.as_thread().proc_data.uprobe_manager;
let mut pt_regs = trapframe_to_ptregs(tf);
let res = kprobe::uprobe_handler_from_debug(manager, &mut pt_regs);
ptregs_write_back(&pt_regs, tf);
res
}