multiboot2_header/
console.rs1use crate::{HeaderTagFlag, HeaderTagHeader, HeaderTagType};
2use multiboot2_common::{MaybeDynSized, Tag};
3
4multiboot2_common::raw_type! {
5 pub struct ConsoleHeaderTagFlagsRaw(u32);
10
11 pub enum ConsoleHeaderTagFlags {
15 ConsoleRequired = 1,
19 EgaTextSupported = 2,
21 }
22}
23
24#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
27#[repr(C, align(8))]
28pub struct ConsoleHeaderTag {
29 header: HeaderTagHeader,
30 console_flags: ConsoleHeaderTagFlagsRaw,
31}
32
33impl ConsoleHeaderTag {
34 #[must_use]
36 pub const fn new(flags: HeaderTagFlag, console_flags: ConsoleHeaderTagFlags) -> Self {
37 let header =
38 HeaderTagHeader::new(HeaderTagType::ConsoleFlags, flags, Self::BASE_SIZE as u32);
39 Self {
40 header,
41 console_flags: ConsoleHeaderTagFlagsRaw::new(console_flags.val()),
42 }
43 }
44
45 #[must_use]
47 pub const fn typ(&self) -> HeaderTagType {
48 self.header.typ()
49 }
50
51 #[must_use]
53 pub const fn flags(&self) -> HeaderTagFlag {
54 self.header.flags()
55 }
56
57 #[must_use]
59 pub const fn size(&self) -> u32 {
60 self.header.size()
61 }
62
63 #[must_use]
65 pub const fn console_flags(&self) -> ConsoleHeaderTagFlags {
66 ConsoleHeaderTagFlags::from_val(self.console_flags.get())
67 }
68}
69
70unsafe impl MaybeDynSized for ConsoleHeaderTag {
73 type Header = HeaderTagHeader;
74
75 const BASE_SIZE: usize = size_of::<HeaderTagHeader>() + size_of::<u32>();
76}
77
78impl Tag for ConsoleHeaderTag {
79 type IDType = HeaderTagType;
80 const ID: HeaderTagType = HeaderTagType::ConsoleFlags;
81}
82
83#[cfg(test)]
84mod tests {
85 use super::*;
86 use crate::GenericHeaderTag;
87 use core::borrow::Borrow;
88 use multiboot2_common::test_utils::AlignedBytes;
89
90 #[test]
93 fn console_flags_match_spec_values() {
94 assert_eq!(ConsoleHeaderTagFlags::ConsoleRequired.val(), 1);
95 assert_eq!(ConsoleHeaderTagFlags::EgaTextSupported.val(), 2);
96 }
97
98 #[test]
101 fn unknown_console_flags_are_not_ub() {
102 #[rustfmt::skip]
103 let bytes = AlignedBytes::new([
104 4, 0,
106 0, 0,
108 12, 0, 0, 0,
110 3, 0, 0, 0,
112 0, 0, 0, 0,
114 ]);
115 let tag = GenericHeaderTag::ref_from_slice(bytes.borrow())
116 .unwrap()
117 .cast::<ConsoleHeaderTag>();
118
119 assert_eq!(tag.console_flags(), ConsoleHeaderTagFlags::Custom(3));
120 }
121}