Skip to content

Commit

Permalink
multiboot2: streamline API of ElfSectionsTag
Browse files Browse the repository at this point in the history
  • Loading branch information
phip1611 committed Oct 21, 2024
1 parent 09acee9 commit a537d24
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 13 deletions.
3 changes: 2 additions & 1 deletion integration-test/bins/multiboot2_payload/src/verify/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,9 @@ pub(self) fn print_memory_map(mbi: &BootInformation) -> anyhow::Result<()> {

pub(self) fn print_elf_info(mbi: &BootInformation) -> anyhow::Result<()> {
let sections_iter = mbi
.elf_sections()
.elf_sections_tag()
.ok_or("Should have elf sections")
.map(|tag| tag.sections())
.map_err(anyhow::Error::msg)?;
println!("ELF sections:");
for s in sections_iter {
Expand Down
3 changes: 3 additions & 0 deletions multiboot2/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
## v0.23.1 (2024-10-21)

- Fix wrong tag ID when using `BootdevTag::new`
- `BootInformation::elf_sections` is now deprecated and replaced by the newly
- added `BootInformation::elf_sections_tag`. On the returned type, you can call
`.sections()` to iterate the sections

## v0.23.0 (2024-09-17)

Expand Down
11 changes: 9 additions & 2 deletions multiboot2/src/boot_information.rs
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ impl<'a> BootInformation<'a> {
/// # use multiboot2::{BootInformation, BootInformationHeader};
/// # let ptr = 0xdeadbeef as *const BootInformationHeader;
/// # let boot_info = unsafe { BootInformation::load(ptr).unwrap() };
/// if let Some(sections) = boot_info.elf_sections() {
/// if let Some(sections) = boot_info.elf_sections_tag().map(|tag| tag.sections()) {
/// let mut total = 0;
/// for section in sections {
/// println!("Section: {:?}", section);
Expand All @@ -263,14 +263,21 @@ impl<'a> BootInformation<'a> {
/// }
/// ```
#[must_use]
#[deprecated = "Use elf_sections_tag() instead and corresponding getters"]
pub fn elf_sections(&self) -> Option<ElfSectionIter> {
let tag = self.get_tag::<ElfSectionsTag>();
tag.map(|t| {
assert!((t.entry_size() * t.shndx()) <= t.header().size);
t.sections_iter()
t.sections()
})
}

/// Search for the [`ElfSectionsTag`].
#[must_use]
pub fn elf_sections_tag(&self) -> Option<&ElfSectionsTag> {
self.get_tag()
}

/// Search for the [`FramebufferTag`]. The result is `Some(Err(e))`, if the
/// framebuffer type is unknown, while the framebuffer tag is present.
#[must_use]
Expand Down
8 changes: 4 additions & 4 deletions multiboot2/src/elf_sections.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ impl ElfSectionsTag {
)
}

/// Get an iterator of loaded ELF sections.
/// Get an iterator over the ELF sections.
#[must_use]
pub(crate) const fn sections_iter(&self) -> ElfSectionIter {
pub const fn sections(&self) -> ElfSectionIter {
let string_section_offset = (self.shndx * self.entry_size) as isize;
let string_section_ptr =
unsafe { self.sections.as_ptr().offset(string_section_offset) as *const _ };
Expand Down Expand Up @@ -96,12 +96,12 @@ impl Debug for ElfSectionsTag {
.field("number_of_sections", &self.number_of_sections)
.field("entry_size", &self.entry_size)
.field("shndx", &self.shndx)
.field("sections", &self.sections_iter())
.field("sections", &self.sections())
.finish()
}
}

/// An iterator over some ELF sections.
/// An iterator over [`ElfSection`]s.
#[derive(Clone)]
pub struct ElfSectionIter<'a> {
current_section: *const u8,
Expand Down
12 changes: 6 additions & 6 deletions multiboot2/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ mod tests {
assert_eq!(addr, bi.start_address());
assert_eq!(addr + bytes.0.len(), bi.end_address());
assert_eq!(bytes.0.len(), bi.total_size());
assert!(bi.elf_sections().is_none());
assert!(bi.elf_sections_tag().is_none());
assert!(bi.memory_map_tag().is_none());
assert!(bi.module_tags().next().is_none());
assert!(bi.boot_loader_name_tag().is_none());
Expand All @@ -191,7 +191,7 @@ mod tests {
assert_eq!(addr, bi.start_address());
assert_eq!(addr + bytes.0.len(), bi.end_address());
assert_eq!(bytes.0.len(), bi.total_size());
assert!(bi.elf_sections().is_none());
assert!(bi.elf_sections_tag().is_none());
assert!(bi.memory_map_tag().is_none());
assert!(bi.module_tags().next().is_none());
assert!(bi.boot_loader_name_tag().is_none());
Expand All @@ -214,7 +214,7 @@ mod tests {
assert_eq!(addr, bi.start_address());
assert_eq!(addr + bytes.0.len(), bi.end_address());
assert_eq!(bytes.0.len(), bi.total_size());
assert!(bi.elf_sections().is_none());
assert!(bi.elf_sections_tag().is_none());
assert!(bi.memory_map_tag().is_none());
assert!(bi.module_tags().next().is_none());
assert!(bi.boot_loader_name_tag().is_none());
Expand All @@ -240,7 +240,7 @@ mod tests {
assert_eq!(addr, bi.start_address());
assert_eq!(addr + bytes.0.len(), bi.end_address());
assert_eq!(bytes.0.len(), bi.total_size());
assert!(bi.elf_sections().is_none());
assert!(bi.elf_sections_tag().is_none());
assert!(bi.memory_map_tag().is_none());
assert!(bi.module_tags().next().is_none());
assert_eq!(
Expand Down Expand Up @@ -834,7 +834,7 @@ mod tests {
assert_eq!(addr, bi.start_address());
assert_eq!(addr + bytes.len(), bi.end_address());
assert_eq!(bytes.len(), bi.total_size());
let mut es = bi.elf_sections().unwrap();
let mut es = bi.elf_sections_tag().unwrap().sections();
let s1 = es.next().expect("Should have one more section");
assert_eq!(".rodata", s1.name().expect("Should be valid utf-8"));
assert_eq!(0xFFFF_8000_0010_0000, s1.start_address());
Expand Down Expand Up @@ -1022,7 +1022,7 @@ mod tests {
assert_eq!(addr, bi.start_address());
assert_eq!(addr + bytes.0.len(), bi.end_address());
assert_eq!(bytes.0.len(), bi.total_size());
let mut es = bi.elf_sections().unwrap();
let mut es = bi.elf_sections_tag().unwrap().sections();
let s1 = es.next().expect("Should have one more section");
assert_eq!(".shstrtab", s1.name().expect("Should be valid utf-8"));
assert_eq!(string_addr, s1.start_address());
Expand Down

0 comments on commit a537d24

Please sign in to comment.