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 mut manager = thread.proc_data.uprobe_manager.lock();
let mut point_list = thread.proc_data.uprobe_point_list.lock();
kprobe::register_uprobe(&mut manager, &mut point_list, builder)
}
pub fn unregister_uprobe(uprobe: Arc<KernelUprobe>) {
let curr = current();
let thread = curr.as_thread();
let mut manager = thread.proc_data.uprobe_manager.lock();
let mut point_list = thread.proc_data.uprobe_point_list.lock();
kprobe::unregister_uprobe(&mut manager, &mut point_list, uprobe);
}
pub fn break_uprobe_handler(tf: &mut ax_runtime::hal::cpu::TrapFrame) -> Option<()> {
let curr = current();
let mut manager = curr.as_thread().proc_data.uprobe_manager.try_lock()?;
let mut pt_regs = trapframe_to_ptregs(tf);
let res = kprobe::uprobe_handler_from_break(&mut 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 mut manager = curr.as_thread().proc_data.uprobe_manager.try_lock()?;
let mut pt_regs = trapframe_to_ptregs(tf);
let res = kprobe::uprobe_handler_from_debug(&mut manager, &mut pt_regs);
ptregs_write_back(&pt_regs, tf);
res
}