diff --git a/src/madt.rs b/src/madt.rs index 9c9d777..154305a 100644 --- a/src/madt.rs +++ b/src/madt.rs @@ -17,6 +17,11 @@ type U16 = byteorder::U16; type U32 = byteorder::U32; type U64 = byteorder::U64; +#[repr(u32)] +enum MadtFlags { + PcAtCompat = 1 << 0, +} + #[repr(u8)] enum MadtStructureType { ProcessorLocalApic = 0x0, @@ -98,6 +103,20 @@ impl MADT { } } + pub fn pc_at_compat(mut self) -> Self { + self.set_flag(MadtFlags::PcAtCompat); + self + } + + fn set_flag(&mut self, flag: MadtFlags) { + let old_flags = self.header.flags.get(); + self.header.flags |= flag as u32; + + self.checksum.delete(old_flags.as_bytes()); + self.checksum.append(self.header.flags.as_bytes()); + self.header.table_header.checksum = self.checksum.value(); + } + fn update_header(&mut self, data: &[u8]) { let len = data.len() as u32; let old_len = self.header.table_header.length.get(); @@ -671,7 +690,8 @@ mod tests { *b"DECAFCOF", 0xdead_beef, LocalInterruptController::Riscv, - ); + ) + .pc_at_compat(); check_checksum(&madt); assert_eq!(Header::len(), get_size(&madt)); }