|
9 | 9 | #![allow(rustdoc::private_doc_tests)]
|
10 | 10 | // --- END STYLE CHECKS ---
|
11 | 11 |
|
12 |
| -//! Library that helps you to parse the multiboot information structure (mbi) from |
| 12 | +//! Library that assists parsing the Multiboot2 Information Structure (MBI) from |
13 | 13 | //! Multiboot2-compliant bootloaders, like GRUB. It supports all tags from the specification
|
14 | 14 | //! including full support for the sections of ELF-64. This library is `no_std` and can be
|
15 | 15 | //! used in a Multiboot2-kernel.
|
@@ -98,12 +98,16 @@ pub mod builder;
|
98 | 98 | /// that the Rust compiler output changes `eax` before you can access it.
|
99 | 99 | pub const MAGIC: u32 = 0x36d76289;
|
100 | 100 |
|
| 101 | +/// # Safety |
| 102 | +/// Deprecated. Please use BootInformation::load() instead. |
101 | 103 | #[deprecated = "Please use BootInformation::load() instead."]
|
102 | 104 | pub unsafe fn load<'a>(address: usize) -> Result<BootInformation<'a>, MbiLoadError> {
|
103 | 105 | let ptr = address as *const u8;
|
104 | 106 | BootInformation::load(ptr)
|
105 | 107 | }
|
106 | 108 |
|
| 109 | +/// # Safety |
| 110 | +/// Deprecated. Please use BootInformation::load() instead. |
107 | 111 | #[deprecated = "Please use BootInformation::load() instead."]
|
108 | 112 | pub unsafe fn load_with_offset<'a>(
|
109 | 113 | address: usize,
|
@@ -135,6 +139,42 @@ pub enum MbiLoadError {
|
135 | 139 | #[cfg(feature = "unstable")]
|
136 | 140 | impl core::error::Error for MbiLoadError {}
|
137 | 141 |
|
| 142 | +#[repr(C, align(8))] |
| 143 | +struct BootInformationInner { |
| 144 | + total_size: u32, |
| 145 | + _reserved: u32, |
| 146 | + // followed by various, dynamically sized multiboot2 tags |
| 147 | + tags: [Tag; 0], |
| 148 | +} |
| 149 | + |
| 150 | +impl BootInformationInner { |
| 151 | + #[cfg(feature = "builder")] |
| 152 | + fn new(total_size: u32) -> Self { |
| 153 | + Self { |
| 154 | + total_size, |
| 155 | + _reserved: 0, |
| 156 | + tags: [], |
| 157 | + } |
| 158 | + } |
| 159 | + |
| 160 | + fn has_valid_end_tag(&self) -> bool { |
| 161 | + let end_tag_prototype = EndTag::default(); |
| 162 | + |
| 163 | + let self_ptr = self as *const _; |
| 164 | + let end_tag_addr = self_ptr as usize + (self.total_size - end_tag_prototype.size) as usize; |
| 165 | + let end_tag = unsafe { &*(end_tag_addr as *const Tag) }; |
| 166 | + |
| 167 | + end_tag.typ == end_tag_prototype.typ && end_tag.size == end_tag_prototype.size |
| 168 | + } |
| 169 | +} |
| 170 | + |
| 171 | +#[cfg(feature = "builder")] |
| 172 | +impl StructAsBytes for BootInformationInner { |
| 173 | + fn byte_size(&self) -> usize { |
| 174 | + core::mem::size_of::<Self>() |
| 175 | + } |
| 176 | +} |
| 177 | + |
138 | 178 | /// A Multiboot 2 Boot Information (MBI) accessor.
|
139 | 179 | #[repr(transparent)]
|
140 | 180 | pub struct BootInformation<'a>(&'a BootInformationInner);
|
@@ -185,35 +225,7 @@ impl BootInformation<'_> {
|
185 | 225 |
|
186 | 226 | Ok(Self(mbi))
|
187 | 227 | }
|
188 |
| -} |
189 |
| - |
190 |
| -#[repr(C, align(8))] |
191 |
| -struct BootInformationInner { |
192 |
| - total_size: u32, |
193 |
| - _reserved: u32, |
194 |
| - // followed by various, dynamically sized multiboot2 tags |
195 |
| - tags: [Tag; 0], |
196 |
| -} |
197 |
| - |
198 |
| -impl BootInformationInner { |
199 |
| - #[cfg(feature = "builder")] |
200 |
| - fn new(total_size: u32) -> Self { |
201 |
| - Self { |
202 |
| - total_size, |
203 |
| - _reserved: 0, |
204 |
| - tags: [], |
205 |
| - } |
206 |
| - } |
207 |
| -} |
208 |
| - |
209 |
| -#[cfg(feature = "builder")] |
210 |
| -impl StructAsBytes for BootInformationInner { |
211 |
| - fn byte_size(&self) -> usize { |
212 |
| - core::mem::size_of::<Self>() |
213 |
| - } |
214 |
| -} |
215 | 228 |
|
216 |
| -impl BootInformation<'_> { |
217 | 229 | /// Get the start address of the boot info.
|
218 | 230 | pub fn start_address(&self) -> usize {
|
219 | 231 | core::ptr::addr_of!(*self.0) as usize
|
@@ -427,18 +439,6 @@ impl BootInformation<'_> {
|
427 | 439 | }
|
428 | 440 | }
|
429 | 441 |
|
430 |
| -impl BootInformationInner { |
431 |
| - fn has_valid_end_tag(&self) -> bool { |
432 |
| - let end_tag_prototype = EndTag::default(); |
433 |
| - |
434 |
| - let self_ptr = self as *const _; |
435 |
| - let end_tag_addr = self_ptr as usize + (self.total_size - end_tag_prototype.size) as usize; |
436 |
| - let end_tag = unsafe { &*(end_tag_addr as *const Tag) }; |
437 |
| - |
438 |
| - end_tag.typ == end_tag_prototype.typ && end_tag.size == end_tag_prototype.size |
439 |
| - } |
440 |
| -} |
441 |
| - |
442 | 442 | // SAFETY: BootInformation contains a const ptr to memory that is never mutated.
|
443 | 443 | // Sending this pointer to other threads is sound.
|
444 | 444 | unsafe impl Send for BootInformation<'_> {}
|
|
0 commit comments