1use crate::{TagHeader, TagType};
4use core::mem;
5use multiboot2_common::{MaybeDynSized, Tag};
6
7#[derive(Debug)]
9#[repr(C, align(8))]
10pub struct ApmTag {
11 header: TagHeader,
12 version: u16,
13 cseg: u16,
14 offset: u32,
15 cset_16: u16,
16 dseg: u16,
17 flags: u16,
18 cseg_len: u16,
19 cseg_16_len: u16,
20 dseg_len: u16,
21}
22
23impl ApmTag {
24 #[allow(clippy::too_many_arguments)]
26 #[must_use]
27 pub fn new(
28 version: u16,
29 cseg: u16,
30 offset: u32,
31 cset_16: u16,
32 dset: u16,
33 flags: u16,
34 cseg_len: u16,
35 cseg_16_len: u16,
36 dseg_len: u16,
37 ) -> Self {
38 Self {
39 header: TagHeader::new(Self::ID, mem::size_of::<Self>() as u32),
40 version,
41 cseg,
42 offset,
43 cset_16,
44 dseg: dset,
45 flags,
46 cseg_len,
47 cseg_16_len,
48 dseg_len,
49 }
50 }
51
52 #[must_use]
54 pub const fn version(&self) -> u16 {
55 self.version
56 }
57
58 #[must_use]
60 pub const fn cseg(&self) -> u16 {
61 self.cseg
62 }
63
64 #[must_use]
67 pub const fn offset(&self) -> u32 {
68 self.offset
69 }
70
71 #[must_use]
74 pub const fn cset_16(&self) -> u16 {
75 self.cset_16
76 }
77
78 #[must_use]
81 pub const fn dseg(&self) -> u16 {
82 self.dseg
83 }
84
85 #[must_use]
88 pub const fn flags(&self) -> u16 {
89 self.flags
90 }
91
92 #[must_use]
95 pub const fn cseg_len(&self) -> u16 {
96 self.cseg_len
97 }
98
99 #[must_use]
102 pub const fn cseg_16_len(&self) -> u16 {
103 self.cseg_16_len
104 }
105
106 #[must_use]
109 pub const fn dseg_len(&self) -> u16 {
110 self.dseg_len
111 }
112}
113
114impl MaybeDynSized for ApmTag {
115 type Header = TagHeader;
116
117 const BASE_SIZE: usize = mem::size_of::<Self>();
118
119 fn dst_len(_: &TagHeader) {}
120}
121
122impl Tag for ApmTag {
123 type IDType = TagType;
124
125 const ID: TagType = TagType::Apm;
126}