@@ -472,6 +472,7 @@ impl Reader {
472
472
#[ cfg( test) ]
473
473
mod tests {
474
474
use super :: * ;
475
+ use std:: { mem, slice} ;
475
476
476
477
#[ test]
477
478
fn no_tags ( ) {
@@ -1358,7 +1359,7 @@ mod tests {
1358
1359
let bi = bi. unwrap ( ) ;
1359
1360
assert_eq ! ( addr, bi. start_address( ) ) ;
1360
1361
assert_eq ! ( addr + bytes. 0 . len( ) , bi. end_address( ) ) ;
1361
- assert_eq ! ( bytes. 0 . len( ) , bi. total_size( ) as usize ) ;
1362
+ assert_eq ! ( bytes. 0 . len( ) , bi. total_size( ) ) ;
1362
1363
let es = bi. elf_sections_tag ( ) . unwrap ( ) ;
1363
1364
let mut s = es. sections ( ) ;
1364
1365
let s1 = s. next ( ) . unwrap ( ) ;
@@ -1412,7 +1413,7 @@ mod tests {
1412
1413
let bi = bi. unwrap ( ) ;
1413
1414
assert_eq ! ( addr, bi. start_address( ) ) ;
1414
1415
assert_eq ! ( addr + bytes. 0 . len( ) , bi. end_address( ) ) ;
1415
- assert_eq ! ( bytes. 0 . len( ) , bi. total_size( ) as usize ) ;
1416
+ assert_eq ! ( bytes. 0 . len( ) , bi. total_size( ) ) ;
1416
1417
let efi_memory_map = bi. efi_memory_map_tag ( ) . unwrap ( ) ;
1417
1418
let mut efi_mmap_iter = efi_memory_map. memory_areas ( ) ;
1418
1419
let desc = efi_mmap_iter. next ( ) . unwrap ( ) ;
@@ -1459,4 +1460,71 @@ mod tests {
1459
1460
core:: mem:: transmute :: < [ u8 ; 56 ] , EFIMemoryMapTag > ( [ 0u8 ; 56 ] ) ;
1460
1461
}
1461
1462
}
1463
+
1464
+ #[ test]
1465
+ fn custom_tag ( ) {
1466
+ const CUSTOM_TAG_ID : u32 = 0x1337 ;
1467
+
1468
+ #[ repr( C , align( 8 ) ) ]
1469
+ struct Bytes ( [ u8 ; 32 ] ) ;
1470
+ let bytes: Bytes = Bytes ( [
1471
+ 32 ,
1472
+ 0 ,
1473
+ 0 ,
1474
+ 0 , // total_size
1475
+ 0 ,
1476
+ 0 ,
1477
+ 0 ,
1478
+ 0 , // reserved
1479
+ // my custom tag
1480
+ CUSTOM_TAG_ID . to_ne_bytes ( ) [ 0 ] ,
1481
+ CUSTOM_TAG_ID . to_ne_bytes ( ) [ 1 ] ,
1482
+ CUSTOM_TAG_ID . to_ne_bytes ( ) [ 2 ] ,
1483
+ CUSTOM_TAG_ID . to_ne_bytes ( ) [ 3 ] ,
1484
+ 13 ,
1485
+ 0 ,
1486
+ 0 ,
1487
+ 0 , // tag size
1488
+ 110 ,
1489
+ 97 ,
1490
+ 109 ,
1491
+ 101 , // ASCII string 'name'
1492
+ 0 ,
1493
+ 0 ,
1494
+ 0 ,
1495
+ 0 , // null byte + padding
1496
+ 0 ,
1497
+ 0 ,
1498
+ 0 ,
1499
+ 0 , // end tag type
1500
+ 8 ,
1501
+ 0 ,
1502
+ 0 ,
1503
+ 0 , // end tag size
1504
+ ] ) ;
1505
+ let addr = bytes. 0 . as_ptr ( ) as usize ;
1506
+ let bi = unsafe { load ( addr) } ;
1507
+ let bi = bi. unwrap ( ) ;
1508
+ assert_eq ! ( addr, bi. start_address( ) ) ;
1509
+ assert_eq ! ( addr + bytes. 0 . len( ) , bi. end_address( ) ) ;
1510
+ assert_eq ! ( bytes. 0 . len( ) , bi. total_size( ) ) ;
1511
+
1512
+ #[ repr( C , align( 8 ) ) ]
1513
+ struct CustomTag {
1514
+ tag : TagTypeId ,
1515
+ size : u32 ,
1516
+ name : u8 ,
1517
+ }
1518
+
1519
+ let tag = bi
1520
+ . get_tag ( CUSTOM_TAG_ID . into ( ) )
1521
+ . unwrap ( )
1522
+ . cast_tag :: < CustomTag > ( ) ;
1523
+
1524
+ // strlen without null byte
1525
+ let strlen = tag. size as usize - mem:: size_of :: < CommandLineTag > ( ) ;
1526
+ let bytes = unsafe { slice:: from_raw_parts ( ( & tag. name ) as * const u8 , strlen) } ;
1527
+ let name = core:: str:: from_utf8 ( bytes) . unwrap ( ) ;
1528
+ assert_eq ! ( name, "name" ) ;
1529
+ }
1462
1530
}
0 commit comments