diff --git a/ebpf/aya-ebpf/src/programs/mod.rs b/ebpf/aya-ebpf/src/programs/mod.rs index 498b0d1c..557e688f 100644 --- a/ebpf/aya-ebpf/src/programs/mod.rs +++ b/ebpf/aya-ebpf/src/programs/mod.rs @@ -5,6 +5,7 @@ pub mod lsm; pub mod perf_event; pub mod probe; pub mod raw_tracepoint; +pub mod retprobe; pub mod sk_buff; pub mod sk_lookup; pub mod sk_msg; @@ -25,6 +26,7 @@ pub use lsm::LsmContext; pub use perf_event::PerfEventContext; pub use probe::ProbeContext; pub use raw_tracepoint::RawTracePointContext; +pub use retprobe::RetProbeContext; pub use sk_buff::SkBuffContext; pub use sk_lookup::SkLookupContext; pub use sk_msg::SkMsgContext; diff --git a/ebpf/aya-ebpf/src/programs/probe.rs b/ebpf/aya-ebpf/src/programs/probe.rs index 330ac0ae..3f9b965b 100644 --- a/ebpf/aya-ebpf/src/programs/probe.rs +++ b/ebpf/aya-ebpf/src/programs/probe.rs @@ -43,25 +43,6 @@ impl ProbeContext { pub fn arg(&self, n: usize) -> Option { T::from_argument(unsafe { &*self.regs }, n) } - - /// Returns the return value of the probed function. - /// - /// # Examples - /// - /// ```no_run - /// # #![allow(dead_code)] - /// # use aya_ebpf::{programs::ProbeContext, cty::c_int}; - /// unsafe fn try_kretprobe_try_to_wake_up(ctx: ProbeContext) -> Result { - /// let retval: c_int = ctx.ret().ok_or(1u32)?; - /// - /// // Do something with retval - /// - /// Ok(0) - /// } - /// ``` - pub fn ret(&self) -> Option { - T::from_retval(unsafe { &*self.regs }) - } } impl EbpfContext for ProbeContext { diff --git a/ebpf/aya-ebpf/src/programs/retprobe.rs b/ebpf/aya-ebpf/src/programs/retprobe.rs new file mode 100644 index 00000000..2cff9b55 --- /dev/null +++ b/ebpf/aya-ebpf/src/programs/retprobe.rs @@ -0,0 +1,46 @@ +use core::ffi::c_void; + +#[cfg(not(any(bpf_target_arch = "aarch64", bpf_target_arch = "riscv64")))] +use crate::bindings::pt_regs; +#[cfg(bpf_target_arch = "aarch64")] +use crate::bindings::user_pt_regs as pt_regs; +#[cfg(bpf_target_arch = "riscv64")] +use crate::bindings::user_regs_struct as pt_regs; +use crate::{args::FromPtRegs, EbpfContext}; + +pub struct RetProbeContext { + pub regs: *mut pt_regs, +} + +impl RetProbeContext { + pub fn new(ctx: *mut c_void) -> RetProbeContext { + RetProbeContext { + regs: ctx as *mut pt_regs, + } + } + + /// Returns the return value of the probed function. + /// + /// # Examples + /// + /// ```no_run + /// # #![allow(dead_code)] + /// # use aya_ebpf::{programs::RetProbeContext, cty::c_int}; + /// unsafe fn try_kretprobe_try_to_wake_up(ctx: RetProbeContext) -> Result { + /// let retval: c_int = ctx.ret().ok_or(1u32)?; + /// + /// // Do something with retval + /// + /// Ok(0) + /// } + /// ``` + pub fn ret(&self) -> Option { + T::from_retval(unsafe { &*self.regs }) + } +} + +impl EbpfContext for RetProbeContext { + fn as_ptr(&self) -> *mut c_void { + self.regs as *mut c_void + } +}