Skip to content

Commit dfbc89c

Browse files
committed
multiboot2: add Tag::cast_tag to prevent code duplication
1 parent 930fc48 commit dfbc89c

File tree

2 files changed

+19
-12
lines changed

2 files changed

+19
-12
lines changed

multiboot2/src/lib.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ impl BootInformation {
224224
/// Search for the Memory map tag.
225225
pub fn memory_map_tag(&self) -> Option<&MemoryMapTag> {
226226
self.get_tag(TagType::Mmap)
227-
.map(|tag| unsafe { &*(tag as *const Tag as *const MemoryMapTag) })
227+
.map(|tag| tag.cast_tag::<MemoryMapTag>())
228228
}
229229

230230
/// Get an iterator of all module tags.
@@ -235,13 +235,13 @@ impl BootInformation {
235235
/// Search for the BootLoader name tag.
236236
pub fn boot_loader_name_tag(&self) -> Option<&BootLoaderNameTag> {
237237
self.get_tag(TagType::BootLoaderName)
238-
.map(|tag| unsafe { &*(tag as *const Tag as *const BootLoaderNameTag) })
238+
.map(|tag| tag.cast_tag::<BootLoaderNameTag>())
239239
}
240240

241241
/// Search for the Command line tag.
242242
pub fn command_line_tag(&self) -> Option<&CommandLineTag> {
243243
self.get_tag(TagType::Cmdline)
244-
.map(|tag| unsafe { &*(tag as *const Tag as *const CommandLineTag) })
244+
.map(|tag| tag.cast_tag::<CommandLineTag>())
245245
}
246246

247247
/// Search for the VBE framebuffer tag.
@@ -253,25 +253,25 @@ impl BootInformation {
253253
/// Search for the EFI 32-bit SDT tag.
254254
pub fn efi_sdt_32_tag(&self) -> Option<&EFISdt32> {
255255
self.get_tag(TagType::Efi32)
256-
.map(|tag| unsafe { &*(tag as *const Tag as *const EFISdt32) })
256+
.map(|tag| tag.cast_tag::<EFISdt32>())
257257
}
258258

259259
/// Search for the EFI 64-bit SDT tag.
260260
pub fn efi_sdt_64_tag(&self) -> Option<&EFISdt64> {
261261
self.get_tag(TagType::Efi64)
262-
.map(|tag| unsafe { &*(tag as *const Tag as *const EFISdt64) })
262+
.map(|tag| tag.cast_tag::<EFISdt64>())
263263
}
264264

265265
/// Search for the (ACPI 1.0) RSDP tag.
266266
pub fn rsdp_v1_tag(&self) -> Option<&RsdpV1Tag> {
267267
self.get_tag(TagType::AcpiV1)
268-
.map(|tag| unsafe { &*(tag as *const Tag as *const RsdpV1Tag) })
268+
.map(|tag| tag.cast_tag::<RsdpV1Tag>())
269269
}
270270

271271
/// Search for the (ACPI 2.0 or later) RSDP tag.
272272
pub fn rsdp_v2_tag(&self) -> Option<&RsdpV2Tag> {
273273
self.get_tag(TagType::AcpiV2)
274-
.map(|tag| unsafe { &*(tag as *const Tag as *const RsdpV2Tag) })
274+
.map(|tag| tag.cast_tag::<RsdpV2Tag>())
275275
}
276276

277277
/// Search for the EFI Memory map tag.
@@ -282,32 +282,32 @@ impl BootInformation {
282282
Some(_tag) => None,
283283
None => self
284284
.get_tag(TagType::EfiMmap)
285-
.map(|tag| unsafe { &*(tag as *const Tag as *const EFIMemoryMapTag) }),
285+
.map(|tag| tag.cast_tag::<EFIMemoryMapTag>()),
286286
}
287287
}
288288

289289
/// Search for the EFI 32-bit image handle pointer.
290290
pub fn efi_32_ih(&self) -> Option<&EFIImageHandle32> {
291291
self.get_tag(TagType::Efi32Ih)
292-
.map(|tag| unsafe { &*(tag as *const Tag as *const EFIImageHandle32) })
292+
.map(|tag| tag.cast_tag::<EFIImageHandle32>())
293293
}
294294

295295
/// Search for the EFI 64-bit image handle pointer.
296296
pub fn efi_64_ih(&self) -> Option<&EFIImageHandle64> {
297297
self.get_tag(TagType::Efi64Ih)
298-
.map(|tag| unsafe { &*(tag as *const Tag as *const EFIImageHandle64) })
298+
.map(|tag| tag.cast_tag::<EFIImageHandle64>())
299299
}
300300

301301
/// Search for the Image Load Base Physical Address.
302302
pub fn load_base_addr(&self) -> Option<&ImageLoadPhysAddr> {
303303
self.get_tag(TagType::LoadBaseAddr)
304-
.map(|tag| unsafe { &*(tag as *const Tag as *const ImageLoadPhysAddr) })
304+
.map(|tag| tag.cast_tag::<ImageLoadPhysAddr>())
305305
}
306306

307307
/// Search for the VBE information tag.
308308
pub fn vbe_info_tag(&self) -> Option<&'static VBEInfoTag> {
309309
self.get_tag(TagType::Vbe)
310-
.map(|tag| unsafe { &*(tag as *const Tag as *const VBEInfoTag) })
310+
.map(|tag| tag.cast_tag::<VBEInfoTag>())
311311
}
312312

313313
fn get(&self) -> &BootInformationInner {

multiboot2/src/tag_type.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,13 @@ pub struct Tag {
114114
// tag specific fields
115115
}
116116

117+
impl Tag {
118+
/// Casts the base tag to the specific tag type.
119+
pub fn cast_tag<'a, T>(&self) -> &'a T {
120+
unsafe { &*(self as *const Tag as *const T) }
121+
}
122+
}
123+
117124
impl Debug for Tag {
118125
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
119126
f.debug_struct("Tag")

0 commit comments

Comments
 (0)