@@ -28,6 +28,25 @@ pub const MADT: u32 = signature!('M', 'A', 'D', 'T');
2828pub const HPET : u32 = signature ! ( 'H' , 'P' , 'E' , 'T' ) ;
2929pub const MCFG : u32 = signature ! ( 'M' , 'C' , 'F' , 'G' ) ;
3030pub 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
3251pub 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.
5274pub const FADT_SIZE : usize = mem:: size_of :: < AcpiFadt > ( ) ;
5375pub const FACS_SIZE : usize = mem:: size_of :: < AcpiFacs > ( ) ;
5476pub 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
60101pub 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