Skip to content

Commit 064c488

Browse files
committed
multiboot2: add test for custom tags
1 parent b24f54d commit 064c488

File tree

1 file changed

+70
-3
lines changed

1 file changed

+70
-3
lines changed

multiboot2/src/lib.rs

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ impl Reader {
475475
#[cfg(test)]
476476
mod tests {
477477
use super::*;
478-
use std::ffi::{c_char, CStr};
478+
use std::{mem, slice};
479479

480480
#[test]
481481
fn no_tags() {
@@ -581,6 +581,73 @@ mod tests {
581581
assert!(bi.command_line_tag().is_none());
582582
}
583583

584+
#[test]
585+
fn custom_tag() {
586+
const CUSTOM_TAG_ID: u32 = 0x1337;
587+
588+
#[repr(C, align(8))]
589+
struct Bytes([u8; 32]);
590+
let bytes: Bytes = Bytes([
591+
32,
592+
0,
593+
0,
594+
0, // total_size
595+
0,
596+
0,
597+
0,
598+
0, // reserved
599+
// my custom tag
600+
CUSTOM_TAG_ID.to_ne_bytes()[0],
601+
CUSTOM_TAG_ID.to_ne_bytes()[1],
602+
CUSTOM_TAG_ID.to_ne_bytes()[2],
603+
CUSTOM_TAG_ID.to_ne_bytes()[3],
604+
13,
605+
0,
606+
0,
607+
0, // tag size
608+
110,
609+
97,
610+
109,
611+
101, // ASCII string 'name'
612+
0,
613+
0,
614+
0,
615+
0, // null byte + padding
616+
0,
617+
0,
618+
0,
619+
0, // end tag type
620+
8,
621+
0,
622+
0,
623+
0, // end tag size
624+
]);
625+
let addr = bytes.0.as_ptr() as usize;
626+
let bi = unsafe { load(addr) };
627+
let bi = bi.unwrap();
628+
assert_eq!(addr, bi.start_address());
629+
assert_eq!(addr + bytes.0.len(), bi.end_address());
630+
assert_eq!(bytes.0.len(), bi.total_size());
631+
632+
#[repr(C, align(8))]
633+
struct CustomTag {
634+
tag: SpecifiedOrCustomTagTypeSerialized,
635+
size: u32,
636+
name: u8,
637+
}
638+
639+
let tag = bi
640+
.get_tag(CUSTOM_TAG_ID.into())
641+
.unwrap()
642+
.cast_tag::<CustomTag>();
643+
644+
// strlen without null byte
645+
let strlen = tag.size as usize - mem::size_of::<CommandLineTag>();
646+
let bytes = unsafe { slice::from_raw_parts((&tag.name) as *const u8, strlen) };
647+
let name = core::str::from_utf8(bytes).unwrap();
648+
assert_eq!(name, "name");
649+
}
650+
584651
#[test]
585652
/// Compile time test for `BootLoaderNameTag`.
586653
fn name_tag_size() {
@@ -1362,7 +1429,7 @@ mod tests {
13621429
let bi = bi.unwrap();
13631430
assert_eq!(addr, bi.start_address());
13641431
assert_eq!(addr + bytes.0.len(), bi.end_address());
1365-
assert_eq!(bytes.0.len(), bi.total_size() as usize);
1432+
assert_eq!(bytes.0.len(), bi.total_size());
13661433
let es = bi.elf_sections_tag().unwrap();
13671434
let mut s = es.sections();
13681435
let s1 = s.next().unwrap();
@@ -1416,7 +1483,7 @@ mod tests {
14161483
let bi = bi.unwrap();
14171484
assert_eq!(addr, bi.start_address());
14181485
assert_eq!(addr + bytes.0.len(), bi.end_address());
1419-
assert_eq!(bytes.0.len(), bi.total_size() as usize);
1486+
assert_eq!(bytes.0.len(), bi.total_size());
14201487
let efi_memory_map = bi.efi_memory_map_tag().unwrap();
14211488
let mut efi_mmap_iter = efi_memory_map.memory_areas();
14221489
let desc = efi_mmap_iter.next().unwrap();

0 commit comments

Comments
 (0)