Skip to content

Commit f71aedc

Browse files
authored
Merge pull request #119 from A0lson/efi_fix
multiboot2: Fix EFI Memory Map 'last_area' calculation
2 parents ec24c49 + ec18478 commit f71aedc

File tree

4 files changed

+25
-11
lines changed

4 files changed

+25
-11
lines changed

multiboot2-header/src/builder/information_request.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ pub struct InformationRequestHeaderTagBuilder {
2121
#[cfg(feature = "builder")]
2222
impl InformationRequestHeaderTagBuilder {
2323
/// New builder.
24-
pub fn new(flag: HeaderTagFlag) -> Self {
24+
pub const fn new(flag: HeaderTagFlag) -> Self {
2525
Self {
2626
irs: BTreeSet::new(),
2727
flag,

multiboot2-header/src/header.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ impl<'a> Multiboot2Header<'a> {
4747
assert_eq!(
4848
reference.header_magic(),
4949
MULTIBOOT2_HEADER_MAGIC,
50-
"The Multiboot2 header must contain the MULTIBOOT2_HEADER_MAGIC={:x}",
51-
MULTIBOOT2_HEADER_MAGIC
50+
"The Multiboot2 header must contain the MULTIBOOT2_HEADER_MAGIC={MULTIBOOT2_HEADER_MAGIC:x}"
5251
);
5352
assert!(
5453
reference.verify_checksum(),

multiboot2/src/lib.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1415,13 +1415,23 @@ mod tests {
14151415
assert!(efi_mmap.is_none());
14161416
}
14171417

1418+
#[test]
1419+
/// Compile time test for `MemoryMapTag`.
1420+
fn e820_memory_map_tag_size() {
1421+
use super::MemoryMapTag;
1422+
unsafe {
1423+
// `MemoryMapTag` is 16 bytes without the 1st entry
1424+
core::mem::transmute::<[u8; 16], MemoryMapTag>([0u8; 16]);
1425+
}
1426+
}
1427+
14181428
#[test]
14191429
/// Compile time test for `EFIMemoryMapTag`.
14201430
fn efi_memory_map_tag_size() {
14211431
use super::EFIMemoryMapTag;
14221432
unsafe {
1423-
// `EFIMemoryMapTag` is 16 bytes + `EFIMemoryDesc` is 40 bytes.
1424-
core::mem::transmute::<[u8; 56], EFIMemoryMapTag>([0u8; 56]);
1433+
// `EFIMemoryMapTag` is 16 bytes without the 1st entry
1434+
core::mem::transmute::<[u8; 16], EFIMemoryMapTag>([0u8; 16]);
14251435
}
14261436
}
14271437
}

multiboot2/src/memory_map.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pub struct MemoryMapTag {
1818
size: u32,
1919
entry_size: u32,
2020
entry_version: u32,
21-
first_area: MemoryArea,
21+
first_area: [MemoryArea; 0],
2222
}
2323

2424
impl MemoryMapTag {
@@ -31,10 +31,13 @@ impl MemoryMapTag {
3131
/// Return an iterator over all marked memory areas.
3232
pub fn all_memory_areas(&self) -> impl Iterator<Item = &MemoryArea> {
3333
let self_ptr = self as *const MemoryMapTag;
34-
let start_area = (&self.first_area) as *const MemoryArea;
34+
let start_area = self.first_area.as_ptr();
35+
3536
MemoryAreaIter {
3637
current_area: start_area as u64,
37-
last_area: (self_ptr as u64 + (self.size - self.entry_size) as u64),
38+
// NOTE: `last_area` is only a bound, it doesn't necessarily point exactly to the last element
39+
last_area: (self_ptr as u64
40+
+ (self.size as u64 - core::mem::size_of::<MemoryMapTag>() as u64)),
3841
entry_size: self.entry_size,
3942
phantom: PhantomData,
4043
}
@@ -127,7 +130,7 @@ pub struct EFIMemoryMapTag {
127130
size: u32,
128131
desc_size: u32,
129132
desc_version: u32,
130-
first_desc: EFIMemoryDesc,
133+
first_desc: [EFIMemoryDesc; 0],
131134
}
132135

133136
impl EFIMemoryMapTag {
@@ -137,10 +140,12 @@ impl EFIMemoryMapTag {
137140
/// available memory areas for tables and such.
138141
pub fn memory_areas(&self) -> EFIMemoryAreaIter {
139142
let self_ptr = self as *const EFIMemoryMapTag;
140-
let start_area = (&self.first_desc) as *const EFIMemoryDesc;
143+
let start_area = self.first_desc.as_ptr();
141144
EFIMemoryAreaIter {
142145
current_area: start_area as u64,
143-
last_area: (self_ptr as u64 + self.size as u64),
146+
// NOTE: `last_area` is only a bound, it doesn't necessarily point exactly to the last element
147+
last_area: (self_ptr as u64
148+
+ (self.size as u64 - core::mem::size_of::<EFIMemoryMapTag>() as u64)),
144149
entry_size: self.desc_size,
145150
phantom: PhantomData,
146151
}

0 commit comments

Comments
 (0)