@ -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   _ )  
		
	
		
			
				             }  
		
	
		
			
				         }  
		
	
		
			
				     } ;  
		
	
		
			
				}