@ -149,6 +149,67 @@ impl BtfType {
} )
}
pub ( crate ) fn to_bytes ( & self ) -> Vec < u8 > {
fn bytes_of < T > ( val : & T ) -> & [ u8 ] {
// Safety: all btf types are POD
unsafe { crate ::util ::bytes_of ( val ) }
}
match self {
BtfType ::Fwd ( btf_type )
| BtfType ::Const ( btf_type )
| BtfType ::Volatile ( btf_type )
| BtfType ::Restrict ( btf_type )
| BtfType ::Ptr ( btf_type )
| BtfType ::Typedef ( btf_type )
| BtfType ::Func ( btf_type )
| BtfType ::Float ( btf_type ) = > bytes_of ::< btf_type > ( btf_type ) . to_vec ( ) ,
BtfType ::Int ( btf_type , len ) = > {
let mut buf = bytes_of ::< btf_type > ( btf_type ) . to_vec ( ) ;
buf . append ( & mut len . to_ne_bytes ( ) . to_vec ( ) ) ;
buf
}
BtfType ::Enum ( btf_type , enums ) = > {
let mut buf = bytes_of ::< btf_type > ( btf_type ) . to_vec ( ) ;
for en in enums {
buf . append ( & mut bytes_of ::< btf_enum > ( en ) . to_vec ( ) ) ;
}
buf
}
BtfType ::Array ( btf_type , btf_array ) = > {
let mut buf = bytes_of ::< btf_type > ( btf_type ) . to_vec ( ) ;
buf . append ( & mut bytes_of ::< btf_array > ( btf_array ) . to_vec ( ) ) ;
buf
}
BtfType ::Struct ( btf_type , btf_members ) | BtfType ::Union ( btf_type , btf_members ) = > {
let mut buf = bytes_of ::< btf_type > ( btf_type ) . to_vec ( ) ;
for m in btf_members {
buf . append ( & mut bytes_of ::< btf_member > ( m ) . to_vec ( ) ) ;
}
buf
}
BtfType ::FuncProto ( btf_type , btf_params ) = > {
let mut buf = bytes_of ::< btf_type > ( btf_type ) . to_vec ( ) ;
for p in btf_params {
buf . append ( & mut bytes_of ::< btf_param > ( p ) . to_vec ( ) ) ;
}
buf
}
BtfType ::Var ( btf_type , btf_var ) = > {
let mut buf = bytes_of ::< btf_type > ( btf_type ) . to_vec ( ) ;
buf . append ( & mut bytes_of ::< btf_var > ( btf_var ) . to_vec ( ) ) ;
buf
}
BtfType ::DataSec ( btf_type , btf_var_secinfo ) = > {
let mut buf = bytes_of ::< btf_type > ( btf_type ) . to_vec ( ) ;
for s in btf_var_secinfo {
buf . append ( & mut bytes_of ::< btf_var_secinfo > ( s ) . to_vec ( ) ) ;
}
buf
}
BtfType ::Unknown = > vec! [ ] ,
}
}
pub ( crate ) fn type_info_size ( & self ) -> usize {
let ty_size = mem ::size_of ::< btf_type > ( ) ;
@ -406,7 +467,8 @@ mod tests {
0x01 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x08 , 0x00 , 0x00 , 0x00 , 0x40 , 0x00 ,
0x00 , 0x00 ,
] ;
match unsafe { BtfType ::read ( data , endianness ) } {
let got = unsafe { BtfType ::read ( data , endianness ) } ;
match got {
Ok ( BtfType ::Int ( ty , nr_bits ) ) = > {
assert_eq! ( ty . name_off , 1 ) ;
assert_eq! ( nr_bits , 64 ) ;
@ -414,6 +476,8 @@ mod tests {
Ok ( t ) = > panic! ( "expected int type, got {:#?}" , t ) ,
Err ( _ ) = > panic! ( "unexpected error" ) ,
}
let data2 = got . unwrap ( ) . to_bytes ( ) ;
assert_eq! ( data , data2 . as_slice ( ) )
}
#[ test ]
@ -422,11 +486,14 @@ mod tests {
let data : & [ u8 ] = & [
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02 , 0x06 , 0x00 , 0x00 , 0x00 ,
] ;
match unsafe { BtfType ::read ( data , endianness ) } {
let got = unsafe { BtfType ::read ( data , endianness ) } ;
match got {
Ok ( BtfType ::Ptr ( _ ) ) = > { }
Ok ( t ) = > panic! ( "expected ptr type, got {:#?}" , t ) ,
Err ( _ ) = > panic! ( "unexpected error" ) ,
}
let data2 = got . unwrap ( ) . to_bytes ( ) ;
assert_eq! ( data , data2 . as_slice ( ) )
}
#[ test ]
@ -436,11 +503,14 @@ mod tests {
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x03 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 ,
0x00 , 0x00 , 0x12 , 0x00 , 0x00 , 0x00 , 0x02 , 0x00 , 0x00 , 0x00 ,
] ;
match unsafe { BtfType ::read ( data , endianness ) } {
let got = unsafe { BtfType ::read ( data , endianness ) } ;
match got {
Ok ( BtfType ::Array ( _ , _ ) ) = > { }
Ok ( t ) = > panic! ( "expected array type, got {:#?}" , t ) ,
Err ( _ ) = > panic! ( "unexpected error" ) ,
}
let data2 = got . unwrap ( ) . to_bytes ( ) ;
assert_eq! ( data , data2 . as_slice ( ) )
}
#[ test ]
@ -450,11 +520,14 @@ mod tests {
0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x04 , 0x04 , 0x00 , 0x00 , 0x00 , 0x47 , 0x02 ,
0x00 , 0x00 , 0x12 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
] ;
match unsafe { BtfType ::read ( data , endianness ) } {
let got = unsafe { BtfType ::read ( data , endianness ) } ;
match got {
Ok ( BtfType ::Struct ( _ , _ ) ) = > { }
Ok ( t ) = > panic! ( "expected struct type, got {:#?}" , t ) ,
Err ( _ ) = > panic! ( "unexpected error" ) ,
}
let data2 = got . unwrap ( ) . to_bytes ( ) ;
assert_eq! ( data , data2 . as_slice ( ) )
}
#[ test ]
@ -464,11 +537,14 @@ mod tests {
0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x05 , 0x04 , 0x00 , 0x00 , 0x00 , 0x0d , 0x04 ,
0x00 , 0x00 , 0x68 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
] ;
match unsafe { BtfType ::read ( data , endianness ) } {
let got = unsafe { BtfType ::read ( data , endianness ) } ;
match got {
Ok ( BtfType ::Union ( _ , _ ) ) = > { }
Ok ( t ) = > panic! ( "expected union type, got {:#?}" , t ) ,
Err ( _ ) = > panic! ( "unexpected error" ) ,
}
let data2 = got . unwrap ( ) . to_bytes ( ) ;
assert_eq! ( data , data2 . as_slice ( ) )
}
#[ test ]
@ -478,11 +554,14 @@ mod tests {
0x00 , 0x00 , 0x00 , 0x00 , 0x02 , 0x00 , 0x00 , 0x06 , 0x04 , 0x00 , 0x00 , 0x00 , 0xc9 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xcf , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 ,
] ;
match unsafe { BtfType ::read ( data , endianness ) } {
let got = unsafe { BtfType ::read ( data , endianness ) } ;
match got {
Ok ( BtfType ::Enum ( _ , _ ) ) = > { }
Ok ( t ) = > panic! ( "expected enum type, got {:#?}" , t ) ,
Err ( _ ) = > panic! ( "unexpected error" ) ,
}
let data2 = got . unwrap ( ) . to_bytes ( ) ;
assert_eq! ( data , data2 . as_slice ( ) )
}
#[ test ]
@ -491,11 +570,14 @@ mod tests {
let data : & [ u8 ] = & [
0x0b , 0x55 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x07 , 0x00 , 0x00 , 0x00 , 0x00 ,
] ;
match unsafe { BtfType ::read ( data , endianness ) } {
let got = unsafe { BtfType ::read ( data , endianness ) } ;
match got {
Ok ( BtfType ::Fwd ( _ ) ) = > { }
Ok ( t ) = > panic! ( "expected fwd type, got {:#?}" , t ) ,
Err ( _ ) = > panic! ( "unexpected error" ) ,
}
let data2 = got . unwrap ( ) . to_bytes ( ) ;
assert_eq! ( data , data2 . as_slice ( ) )
}
#[ test ]
@ -504,11 +586,14 @@ mod tests {
let data : & [ u8 ] = & [
0x31 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x08 , 0x0b , 0x00 , 0x00 , 0x00 ,
] ;
match unsafe { BtfType ::read ( data , endianness ) } {
let got = unsafe { BtfType ::read ( data , endianness ) } ;
match got {
Ok ( BtfType ::Typedef ( _ ) ) = > { }
Ok ( t ) = > panic! ( "expected typedef type, got {:#?}" , t ) ,
Err ( _ ) = > panic! ( "unexpected error" ) ,
}
let data2 = got . unwrap ( ) . to_bytes ( ) ;
assert_eq! ( data , data2 . as_slice ( ) )
}
#[ test ]
@ -517,11 +602,14 @@ mod tests {
let data : & [ u8 ] = & [
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09 , 0x24 , 0x00 , 0x00 , 0x00 ,
] ;
match unsafe { BtfType ::read ( data , endianness ) } {
let got = unsafe { BtfType ::read ( data , endianness ) } ;
match got {
Ok ( BtfType ::Volatile ( _ ) ) = > { }
Ok ( t ) = > panic! ( "expected volatile type, got {:#?}" , t ) ,
Err ( _ ) = > panic! ( "unexpected error" ) ,
}
let data2 = got . unwrap ( ) . to_bytes ( ) ;
assert_eq! ( data , data2 . as_slice ( ) )
}
#[ test ]
@ -530,11 +618,14 @@ mod tests {
let data : & [ u8 ] = & [
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0a , 0x01 , 0x00 , 0x00 , 0x00 ,
] ;
match unsafe { BtfType ::read ( data , endianness ) } {
let got = unsafe { BtfType ::read ( data , endianness ) } ;
match got {
Ok ( BtfType ::Const ( _ ) ) = > { }
Ok ( t ) = > panic! ( "expected const type, got {:#?}" , t ) ,
Err ( _ ) = > panic! ( "unexpected error" ) ,
}
let data2 = got . unwrap ( ) . to_bytes ( ) ;
assert_eq! ( data , data2 . as_slice ( ) )
}
#[ test ]
@ -543,11 +634,14 @@ mod tests {
let data : & [ u8 ] = & [
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0b , 0x04 , 0x00 , 0x00 , 0x00 ,
] ;
match unsafe { BtfType ::read ( data , endianness ) } {
let got = unsafe { BtfType ::read ( data , endianness ) } ;
match got {
Ok ( BtfType ::Restrict ( _ ) ) = > { }
Ok ( t ) = > panic! ( "expected restrict type gpt {:#?}" , t ) ,
Err ( _ ) = > panic! ( "unexpected error" ) ,
}
let data2 = got . unwrap ( ) . to_bytes ( ) ;
assert_eq! ( data , data2 . as_slice ( ) )
}
#[ test ]
@ -556,11 +650,14 @@ mod tests {
let data : & [ u8 ] = & [
0x17 , 0x8b , 0x0f , 0x00 , 0x00 , 0x00 , 0x00 , 0x0c , 0xf0 , 0xe4 , 0x00 , 0x00 ,
] ;
match unsafe { BtfType ::read ( data , endianness ) } {
let got = unsafe { BtfType ::read ( data , endianness ) } ;
match got {
Ok ( BtfType ::Func ( _ ) ) = > { }
Ok ( t ) = > panic! ( "expected func type gpt {:#?}" , t ) ,
Err ( _ ) = > panic! ( "unexpected error" ) ,
}
let data2 = got . unwrap ( ) . to_bytes ( ) ;
assert_eq! ( data , data2 . as_slice ( ) )
}
#[ test ]
@ -570,11 +667,14 @@ mod tests {
0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x0d , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x12 , 0x00 , 0x00 , 0x00 ,
] ;
match unsafe { BtfType ::read ( data , endianness ) } {
let got = unsafe { BtfType ::read ( data , endianness ) } ;
match got {
Ok ( BtfType ::FuncProto ( _ , _ ) ) = > { }
Ok ( t ) = > panic! ( "expected func_proto type, got {:#?}" , t ) ,
Err ( _ ) = > panic! ( "unexpected error" ) ,
}
let data2 = got . unwrap ( ) . to_bytes ( ) ;
assert_eq! ( data , data2 . as_slice ( ) )
}
#[ test ]
@ -585,11 +685,14 @@ mod tests {
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0e , 0xf0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 ,
] ;
match unsafe { BtfType ::read ( data , endianness ) } {
let got = unsafe { BtfType ::read ( data , endianness ) } ;
match got {
Ok ( BtfType ::Var ( _ , _ ) ) = > { }
Ok ( t ) = > panic! ( "expected var type, got {:#?}" , t ) ,
Err ( _ ) = > panic! ( "unexpected error" ) ,
}
} ;
let data2 = got . unwrap ( ) . to_bytes ( ) ;
assert_eq! ( data , data2 . as_slice ( ) )
}
#[ test ]
@ -600,11 +703,14 @@ mod tests {
0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x0f , 0xf0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
] ;
match unsafe { BtfType ::read ( data , endianness ) } {
let got = unsafe { BtfType ::read ( data , endianness ) } ;
match got {
Ok ( BtfType ::DataSec ( _ , _ ) ) = > { }
Ok ( t ) = > panic! ( "expected datasec type, got {:#?}" , t ) ,
Err ( _ ) = > panic! ( "unexpected error" ) ,
}
let data2 = got . unwrap ( ) . to_bytes ( ) ;
assert_eq! ( data , data2 . as_slice ( ) )
}
#[ test ]
@ -613,10 +719,13 @@ mod tests {
let data : & [ u8 ] = & [
0x78 , 0xfd , 0x02 , 0x00 , 0x00 , 0x00 , 0x00 , 0x10 , 0x08 , 0x00 , 0x00 , 0x00 ,
] ;
match unsafe { BtfType ::read ( data , endianness ) } {
let got = unsafe { BtfType ::read ( data , endianness ) } ;
match got {
Ok ( BtfType ::Float ( _ ) ) = > { }
Ok ( t ) = > panic! ( "expected float type, got {:#?}" , t ) ,
Err ( _ ) = > panic! ( "unexpected error" ) ,
}
let data2 = got . unwrap ( ) . to_bytes ( ) ;
assert_eq! ( data , data2 . as_slice ( ) )
}
}