Selaa lähdekoodia

bpf: Add PtRegs wrapper

This adds a portable wrapper around pt_regs and user_pt_regs.
It makes writing Raw Tracepoint or KProbe programs easier when the
arguments are one of these types while also ensuring code is portable
across architectures

Signed-off-by: Dave Tucker <dave@dtucker.co.uk>
Dave Tucker 2 vuotta sitten
vanhempi
commit
4acd996cb8
2 muutettua tiedostoa jossa 27 lisäystä ja 0 poistoa
  1. 26 0
      bpf/aya-bpf/src/args.rs
  2. 1 0
      bpf/aya-bpf/src/lib.rs

+ 26 - 0
bpf/aya-bpf/src/args.rs

@@ -56,6 +56,32 @@ unsafe_impl_from_btf_argument!(i64);
 unsafe_impl_from_btf_argument!(usize);
 unsafe_impl_from_btf_argument!(usize);
 unsafe_impl_from_btf_argument!(isize);
 unsafe_impl_from_btf_argument!(isize);
 
 
+pub struct PtRegs {
+    regs: *mut pt_regs,
+}
+
+/// A portable wrapper around pt_regs and user_pt_regs.
+impl PtRegs {
+    pub fn new(regs: *mut pt_regs) -> Self {
+        PtRegs { regs }
+    }
+
+    /// Returns the value of the register used to pass arg `n`.
+    pub fn arg<T: FromPtRegs>(&self, n: usize) -> Option<T> {
+        T::from_argument(unsafe { &*self.regs }, n)
+    }
+
+    /// Returns the value of the register used to pass the return value.
+    pub fn ret<T: FromPtRegs>(&self) -> Option<T> {
+        T::from_retval(unsafe { &*self.regs })
+    }
+
+    /// Returns a pointer to the wrapped value.
+    pub fn as_ptr(&self) -> *mut pt_regs {
+        self.regs
+    }
+}
+
 /// A trait that indicates a valid type for an argument which can be coerced from
 /// A trait that indicates a valid type for an argument which can be coerced from
 /// a pt_regs context.
 /// a pt_regs context.
 ///
 ///

+ 1 - 0
bpf/aya-bpf/src/lib.rs

@@ -5,6 +5,7 @@
 pub use aya_bpf_bindings::bindings;
 pub use aya_bpf_bindings::bindings;
 
 
 mod args;
 mod args;
+pub use args::PtRegs;
 pub mod helpers;
 pub mod helpers;
 pub mod maps;
 pub mod maps;
 pub mod programs;
 pub mod programs;