|  | @@ -1,8 +1,13 @@
 | 
	
		
			
				|  |  | -// aarch64 uses user_pt_regs instead of pt_regs
 | 
	
		
			
				|  |  | -#[cfg(not(any(bpf_target_arch = "aarch64", bpf_target_arch = "riscv64")))]
 | 
	
		
			
				|  |  | +#[cfg(any(
 | 
	
		
			
				|  |  | +    bpf_target_arch = "x86_64",
 | 
	
		
			
				|  |  | +    bpf_target_arch = "arm",
 | 
	
		
			
				|  |  | +    bpf_target_arch = "powerpc64"
 | 
	
		
			
				|  |  | +))]
 | 
	
		
			
				|  |  |  use crate::bindings::pt_regs;
 | 
	
		
			
				|  |  | -#[cfg(bpf_target_arch = "aarch64")]
 | 
	
		
			
				|  |  | +// aarch64 uses user_pt_regs instead of pt_regs
 | 
	
		
			
				|  |  | +#[cfg(any(bpf_target_arch = "aarch64", bpf_target_arch = "s390x"))]
 | 
	
		
			
				|  |  |  use crate::bindings::user_pt_regs as pt_regs;
 | 
	
		
			
				|  |  | +// riscv64 uses user_regs_struct instead of pt_regs
 | 
	
		
			
				|  |  |  #[cfg(bpf_target_arch = "riscv64")]
 | 
	
		
			
				|  |  |  use crate::bindings::user_regs_struct as pt_regs;
 | 
	
		
			
				|  |  |  use crate::{cty::c_void, helpers::bpf_probe_read};
 | 
	
	
		
			
				|  | @@ -168,6 +173,36 @@ impl<T> FromPtRegs for *const T {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#[cfg(bpf_target_arch = "powerpc64")]
 | 
	
		
			
				|  |  | +impl<T> FromPtRegs for *const T {
 | 
	
		
			
				|  |  | +    fn from_argument(ctx: &pt_regs, n: usize) -> Option<Self> {
 | 
	
		
			
				|  |  | +        if n <= 7 {
 | 
	
		
			
				|  |  | +            unsafe { bpf_probe_read(&ctx.gpr[3 + n]).map(|v| v as *const _).ok() }
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            None
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    fn from_retval(ctx: &pt_regs) -> Option<Self> {
 | 
	
		
			
				|  |  | +        unsafe { bpf_probe_read(&ctx.gpr[3]).map(|v| v as *const _).ok() }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#[cfg(bpf_target_arch = "s390x")]
 | 
	
		
			
				|  |  | +impl<T> FromPtRegs for *const T {
 | 
	
		
			
				|  |  | +    fn from_argument(ctx: &pt_regs, n: usize) -> Option<Self> {
 | 
	
		
			
				|  |  | +        if n <= 4 {
 | 
	
		
			
				|  |  | +            unsafe { bpf_probe_read(&ctx.gprs[2 + n]).map(|v| v as *const _).ok() }
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            None
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    fn from_retval(ctx: &pt_regs) -> Option<Self> {
 | 
	
		
			
				|  |  | +        unsafe { bpf_probe_read(&ctx.gprs[2]).map(|v| v as *const _).ok() }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  #[cfg(bpf_target_arch = "x86_64")]
 | 
	
		
			
				|  |  |  impl<T> FromPtRegs for *mut T {
 | 
	
		
			
				|  |  |      fn from_argument(ctx: &pt_regs, n: usize) -> Option<Self> {
 | 
	
	
		
			
				|  | @@ -238,6 +273,36 @@ impl<T> FromPtRegs for *mut T {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#[cfg(bpf_target_arch = "powerpc64")]
 | 
	
		
			
				|  |  | +impl<T> FromPtRegs for *mut T {
 | 
	
		
			
				|  |  | +    fn from_argument(ctx: &pt_regs, n: usize) -> Option<Self> {
 | 
	
		
			
				|  |  | +        if n <= 7 {
 | 
	
		
			
				|  |  | +            unsafe { bpf_probe_read(&ctx.gpr[3 + n]).map(|v| v as *mut _).ok() }
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            None
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    fn from_retval(ctx: &pt_regs) -> Option<Self> {
 | 
	
		
			
				|  |  | +        unsafe { bpf_probe_read(&ctx.gpr[3]).map(|v| v as *mut _).ok() }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#[cfg(bpf_target_arch = "s390x")]
 | 
	
		
			
				|  |  | +impl<T> FromPtRegs for *mut T {
 | 
	
		
			
				|  |  | +    fn from_argument(ctx: &pt_regs, n: usize) -> Option<Self> {
 | 
	
		
			
				|  |  | +        if n <= 4 {
 | 
	
		
			
				|  |  | +            unsafe { bpf_probe_read(&ctx.gprs[2 + n]).map(|v| v as *mut _).ok() }
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            None
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    fn from_retval(ctx: &pt_regs) -> Option<Self> {
 | 
	
		
			
				|  |  | +        unsafe { bpf_probe_read(&ctx.gprs[2]).map(|v| v as *mut _).ok() }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  /// Helper macro to implement [`FromPtRegs`] for a primitive type.
 | 
	
		
			
				|  |  |  macro_rules! impl_from_pt_regs {
 | 
	
		
			
				|  |  |      ($type:ident) => {
 | 
	
	
		
			
				|  | @@ -310,6 +375,36 @@ macro_rules! impl_from_pt_regs {
 | 
	
		
			
				|  |  |                  Some(ctx.ra as *const $type as _)
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        #[cfg(bpf_target_arch = "powerpc64")]
 | 
	
		
			
				|  |  | +        impl FromPtRegs for $type {
 | 
	
		
			
				|  |  | +            fn from_argument(ctx: &pt_regs, n: usize) -> Option<Self> {
 | 
	
		
			
				|  |  | +                if n <= 7 {
 | 
	
		
			
				|  |  | +                    Some(ctx.gpr[3 + n] as *const $type as _)
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    None
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            fn from_retval(ctx: &pt_regs) -> Option<Self> {
 | 
	
		
			
				|  |  | +                Some(ctx.gpr[3] as *const $type as _)
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        #[cfg(bpf_target_arch = "s390x")]
 | 
	
		
			
				|  |  | +        impl FromPtRegs for $type {
 | 
	
		
			
				|  |  | +            fn from_argument(ctx: &pt_regs, n: usize) -> Option<Self> {
 | 
	
		
			
				|  |  | +                if n <= 4 {
 | 
	
		
			
				|  |  | +                    Some(ctx.gprs[2 + n] as *const $type as _)
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    None
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            fn from_retval(ctx: &pt_regs) -> Option<Self> {
 | 
	
		
			
				|  |  | +                Some(ctx.gprs[2] as *const $type as _)
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |