Skip to content

Commit 6867a50

Browse files
author
Sherry Fan
committed
Add additional size checks to ACPI
1 parent 37fb032 commit 6867a50

File tree

1 file changed

+64
-4
lines changed

1 file changed

+64
-4
lines changed

components/patina_acpi/src/signature.rs

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,25 @@ pub const MADT: u32 = signature!('M', 'A', 'D', 'T');
2828
pub const HPET: u32 = signature!('H', 'P', 'E', 'T');
2929
pub const MCFG: u32 = signature!('M', 'C', 'F', 'G');
3030
pub const BGRT: u32 = signature!('B', 'G', 'R', 'T');
31+
pub const SRAT: u32 = signature!('S', 'R', 'A', 'T');
32+
pub const SLIT: u32 = signature!('S', 'L', 'I', 'T');
33+
pub const CPEP: u32 = signature!('C', 'P', 'E', 'P');
34+
pub const MSCT: u32 = signature!('M', 'S', 'C', 'T');
35+
pub const RASF: u32 = signature!('R', 'A', 'S', 'F');
36+
pub const RAS2: u32 = signature!('R', 'A', 'S', '2');
37+
pub const MPST: u32 = signature!('M', 'P', 'S', 'T');
38+
pub const PMTT: u32 = signature!('P', 'M', 'T', 'T');
39+
pub const GTDT: u32 = signature!('G', 'T', 'D', 'T');
40+
pub const SBST: u32 = signature!('S', 'B', 'S', 'T');
41+
pub const ECDT: u32 = signature!('E', 'C', 'D', 'T');
42+
pub const NFIT: u32 = signature!('N', 'F', 'I', 'T');
43+
pub const NHLT: u32 = signature!('N', 'H', 'L', 'T');
44+
pub const HMAT: u32 = signature!('H', 'M', 'A', 'T');
45+
pub const PDTT: u32 = signature!('P', 'D', 'T', 'T');
46+
pub const VIOT: u32 = signature!('V', 'I', 'O', 'T');
47+
pub const CCEL: u32 = signature!('C', 'C', 'E', 'L');
48+
pub const SKVL: u32 = signature!('S', 'K', 'V', 'L');
49+
pub const RHCT: u32 = signature!('R', 'H', 'C', 'T');
3150

3251
pub const ACPI_TABLE_GUID: efi::Guid =
3352
efi::Guid::from_fields(0x8868E871, 0xE4F1, 0x11D3, 0xBC, 0x22, &[0x00, 0x80, 0xC7, 0x3C, 0x88, 0x81]);
@@ -49,13 +68,35 @@ pub const ACPI_VERSIONS_GTE_2: u32 = (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5);
4968

5069
// Sizing information for known ACPI table formats.
5170
// Note that for many these are minimum sizes since many tables contain a variable-length portion at the end.
71+
//
72+
// Each minimum size is computed as: (last fixed-field byte offset) + (last fixed-field byte length).
73+
// Variable-length trailing fields (arrays, strings, etc.) are excluded.
5274
pub const FADT_SIZE: usize = mem::size_of::<AcpiFadt>();
5375
pub const FACS_SIZE: usize = mem::size_of::<AcpiFacs>();
5476
pub const DSDT_SIZE: usize = mem::size_of::<AcpiDsdt>();
55-
pub const MADT_SIZE: usize = 44;
56-
pub const HPET_SIZE: usize = 56;
57-
pub const MCFG_SIZE: usize = 44;
58-
pub const BGRT_SIZE: usize = 56;
77+
pub const MADT_SIZE: usize = 44; // Header(36) + Local IC Address(4) + Flags(4)
78+
pub const HPET_SIZE: usize = 56; // Defined by IA-PC HPET spec
79+
pub const MCFG_SIZE: usize = 44; // Defined by PCI Firmware spec
80+
pub const BGRT_SIZE: usize = 56; // Header(36) + Version(2) + Status(1) + ImageType(1) + ImageAddress(8) + ImageOffsetX(4) + ImageOffsetY(4)
81+
pub const GTDT_SIZE: usize = 104; // Header(36) + fixed timer fields through Virtual EL2 Timer Flags(@100, 4)
82+
pub const SBST_SIZE: usize = 48; // Header(36) + Warning(4) + Low(4) + Critical(4)
83+
pub const ECDT_SIZE: usize = 65; // Header(36) + EC_CONTROL GAS(12) + EC_DATA GAS(12) + UID(4) + GPE_BIT(1); EC_ID string follows
84+
pub const SRAT_SIZE: usize = 48; // Header(36) + Reserved(4) + Reserved(8)
85+
pub const SLIT_SIZE: usize = 44; // Header(36) + Number of System Localities(8)
86+
pub const CPEP_SIZE: usize = 44; // Header(36) + Reserved(8)
87+
pub const MSCT_SIZE: usize = 56; // Header(36) + OffsetProxDomInfo(4) + MaxProxDomains(4) + MaxClockDomains(4) + MaxPhysAddr(8)
88+
pub const RASF_SIZE: usize = 48; // Header(36) + PCC Identifier(12)
89+
pub const RAS2_SIZE: usize = 40; // Header(36) + Reserved(2) + Number of PCC Descriptors(2)
90+
pub const MPST_SIZE: usize = 42; // Header(36) + PCC Identifier(1) + Reserved(3) + Memory Power Node Count(2)
91+
pub const PMTT_SIZE: usize = 40; // Header(36) + Number of Memory Devices(4)
92+
pub const NFIT_SIZE: usize = 40; // Header(36) + Reserved(4)
93+
pub const NHLT_SIZE: usize = 37; // Header(36) + Endpoints Count(1)
94+
pub const HMAT_SIZE: usize = 40; // Header(36) + Reserved(4)
95+
pub const PDTT_SIZE: usize = 44; // Header(36) + Trigger Count(1) + Reserved(3) + Trigger ID Array Offset(4)
96+
pub const VIOT_SIZE: usize = 48; // Header(36) + Node Count(2) + Node Offset(2) + Reserved(8)
97+
pub const CCEL_SIZE: usize = 56; // Header(36) + CC Type(1) + CC Subtype(1) + Reserved(2) + LAML(8) + LASA(8)
98+
pub const SKVL_SIZE: usize = 40; // Header(36) + Key Count(4)
99+
pub const RHCT_SIZE: usize = 56; // Header(36) + Flags(4) + Time Base Frequency(8) + Node Count(4) + Node Array Offset(4)
59100

60101
pub fn acpi_table_min_size(signature: u32) -> usize {
61102
match signature {
@@ -66,6 +107,25 @@ pub fn acpi_table_min_size(signature: u32) -> usize {
66107
HPET => HPET_SIZE,
67108
MCFG => MCFG_SIZE,
68109
BGRT => BGRT_SIZE,
110+
GTDT => GTDT_SIZE,
111+
SBST => SBST_SIZE,
112+
ECDT => ECDT_SIZE,
113+
SRAT => SRAT_SIZE,
114+
SLIT => SLIT_SIZE,
115+
CPEP => CPEP_SIZE,
116+
MSCT => MSCT_SIZE,
117+
RASF => RASF_SIZE,
118+
RAS2 => RAS2_SIZE,
119+
MPST => MPST_SIZE,
120+
PMTT => PMTT_SIZE,
121+
NFIT => NFIT_SIZE,
122+
NHLT => NHLT_SIZE,
123+
HMAT => HMAT_SIZE,
124+
PDTT => PDTT_SIZE,
125+
VIOT => VIOT_SIZE,
126+
CCEL => CCEL_SIZE,
127+
SKVL => SKVL_SIZE,
128+
RHCT => RHCT_SIZE,
69129
_ => ACPI_HEADER_LEN, // Default to the header size for unknown signatures, or tables without additional size information.
70130
}
71131
}

0 commit comments

Comments
 (0)