Skip to content

Commit 5e7126c

Browse files
committed
multiboot2: Support setting the image handle pointer
1 parent 6b3589d commit 5e7126c

File tree

2 files changed

+59
-3
lines changed

2 files changed

+59
-3
lines changed

multiboot2/src/builder/information.rs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
use crate::builder::traits::StructAsBytes;
33
use crate::{
44
BasicMemoryInfoTag, BootInformationInner, BootLoaderNameTag, CommandLineTag,
5-
EFISdt32, EFISdt64, EFIBootServicesNotExited, EFIMemoryMapTag,
6-
ElfSectionsTag, EndTag, FramebufferTag, MemoryMapTag, ModuleTag, RsdpV1Tag,
7-
RsdpV2Tag, SmbiosTag,
5+
EFIImageHandle32, EFIImageHandle64, EFIBootServicesNotExited,
6+
EFIMemoryMapTag, EFISdt32, EFISdt64, ElfSectionsTag, EndTag, FramebufferTag,
7+
MemoryMapTag, ModuleTag, RsdpV1Tag, RsdpV2Tag, SmbiosTag,
88
};
99

1010
use alloc::boxed::Box;
@@ -20,6 +20,8 @@ pub struct Multiboot2InformationBuilder {
2020
boot_loader_name_tag: Option<Box<BootLoaderNameTag>>,
2121
command_line_tag: Option<Box<CommandLineTag>>,
2222
efi_boot_services_not_exited: Option<EFIBootServicesNotExited>,
23+
efi_image_handle32: Option<EFIImageHandle32>,
24+
efi_image_handle64: Option<EFIImageHandle64>,
2325
efi_memory_map_tag: Option<Box<EFIMemoryMapTag>>,
2426
elf_sections_tag: Option<Box<ElfSectionsTag>>,
2527
framebuffer_tag: Option<Box<FramebufferTag>>,
@@ -41,6 +43,8 @@ impl Multiboot2InformationBuilder {
4143
efisdt32: None,
4244
efisdt64: None,
4345
efi_boot_services_not_exited: None,
46+
efi_image_handle32: None,
47+
efi_image_handle64: None,
4448
efi_memory_map_tag: None,
4549
elf_sections_tag: None,
4650
framebuffer_tag: None,
@@ -91,6 +95,12 @@ impl Multiboot2InformationBuilder {
9195
if let Some(tag) = &self.efi_boot_services_not_exited {
9296
len += Self::size_or_up_aligned(tag.byte_size())
9397
}
98+
if let Some(tag) = &self.efi_image_handle32 {
99+
len += Self::size_or_up_aligned(tag.byte_size())
100+
}
101+
if let Some(tag) = &self.efi_image_handle64 {
102+
len += Self::size_or_up_aligned(tag.byte_size())
103+
}
94104
if let Some(tag) = &self.efi_memory_map_tag {
95105
len += Self::size_or_up_aligned(tag.byte_size())
96106
}
@@ -165,6 +175,12 @@ impl Multiboot2InformationBuilder {
165175
if let Some(tag) = self.efi_boot_services_not_exited.as_ref() {
166176
Self::build_add_bytes(&mut data, &tag.struct_as_bytes(), false)
167177
}
178+
if let Some(tag) = self.efi_image_handle32.as_ref() {
179+
Self::build_add_bytes(&mut data, &tag.struct_as_bytes(), false)
180+
}
181+
if let Some(tag) = self.efi_image_handle64.as_ref() {
182+
Self::build_add_bytes(&mut data, &tag.struct_as_bytes(), false)
183+
}
168184
if let Some(tag) = self.efi_memory_map_tag.as_ref() {
169185
Self::build_add_bytes(&mut data, &tag.struct_as_bytes(), false)
170186
}
@@ -219,6 +235,14 @@ impl Multiboot2InformationBuilder {
219235
self.efi_boot_services_not_exited = Some(EFIBootServicesNotExited::new());
220236
}
221237

238+
pub fn efi_image_handle32(&mut self, efi_image_handle32: EFIImageHandle32) {
239+
self.efi_image_handle32 = Some(efi_image_handle32);
240+
}
241+
242+
pub fn efi_image_handle64(&mut self, efi_image_handle64: EFIImageHandle64) {
243+
self.efi_image_handle64 = Some(efi_image_handle64);
244+
}
245+
222246
pub fn efi_memory_map_tag(&mut self, efi_memory_map_tag: Box<EFIMemoryMapTag>) {
223247
self.efi_memory_map_tag = Some(efi_memory_map_tag);
224248
}

multiboot2/src/efi.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,28 @@ pub struct EFIImageHandle32 {
8181
}
8282

8383
impl EFIImageHandle32 {
84+
#[cfg(feature = "builder")]
85+
pub fn new(pointer: u32) -> Self {
86+
Self {
87+
typ: TagType::Efi32Ih,
88+
size: size_of::<Self>().try_into().unwrap(),
89+
pointer
90+
}
91+
}
92+
8493
/// Returns the physical address of the EFI image handle.
8594
pub fn image_handle(&self) -> usize {
8695
self.pointer as usize
8796
}
8897
}
8998

99+
#[cfg(feature = "builder")]
100+
impl StructAsBytes for EFIImageHandle32 {
101+
fn byte_size(&self) -> usize {
102+
size_of::<Self>()
103+
}
104+
}
105+
90106
/// Contains pointer to boot loader image handle.
91107
#[derive(Debug)]
92108
#[repr(C)]
@@ -97,8 +113,24 @@ pub struct EFIImageHandle64 {
97113
}
98114

99115
impl EFIImageHandle64 {
116+
#[cfg(feature = "builder")]
117+
pub fn new(pointer: u64) -> Self {
118+
Self {
119+
typ: TagType::Efi64Ih,
120+
size: size_of::<Self>().try_into().unwrap(),
121+
pointer
122+
}
123+
}
124+
100125
/// Returns the physical address of the EFI image handle.
101126
pub fn image_handle(&self) -> usize {
102127
self.pointer as usize
103128
}
104129
}
130+
131+
#[cfg(feature = "builder")]
132+
impl StructAsBytes for EFIImageHandle64 {
133+
fn byte_size(&self) -> usize {
134+
size_of::<Self>()
135+
}
136+
}

0 commit comments

Comments
 (0)