diff --git a/src/acpi/hpet.rs b/src/acpi/hpet.rs new file mode 100644 index 0000000000000000000000000000000000000000..9f76caa6e7679f137d92a8fedf90d52af7e90e9d --- /dev/null +++ b/src/acpi/hpet.rs @@ -0,0 +1,39 @@ +use core::{mem, ptr}; + +use super::sdt::Sdt; + +#[repr(packed)] +#[derive(Clone, Copy, Debug, Default)] +pub struct GenericAddressStructure { + address_space: u8, + bit_width: u8, + bit_offset: u8, + access_size: u8, + address: u64, +} + +#[repr(packed)] +#[derive(Debug)] +pub struct Hpet { + pub header: Sdt, + + pub hw_rev_id: u8, + pub comparator_descriptor: u8, + pub pci_vendor_id: u16, + + pub base_address: GenericAddressStructure, + + pub hpet_number: u8, + pub min_periodic_clk_tick: u16, + pub oem_attribute: u8 +} + +impl Hpet { + pub fn new(sdt: &'static Sdt) -> Option<Hpet> { + if &sdt.signature == b"HPET" && sdt.length as usize >= mem::size_of::<Hpet>() { + Some(unsafe { ptr::read((sdt as *const Sdt) as *const Hpet) }) + } else { + None + } + } +} diff --git a/src/acpi/mod.rs b/src/acpi/mod.rs index 98d9ba9e66f5917a12503517e344bd9eb6551adf..7a564afe465e6b26b0642dade61ae521ea33271c 100644 --- a/src/acpi/mod.rs +++ b/src/acpi/mod.rs @@ -18,9 +18,11 @@ use self::madt::{Madt, MadtEntry}; use self::rsdt::Rsdt; use self::sdt::Sdt; use self::xsdt::Xsdt; +use self::hpet::Hpet; use self::aml::{is_aml_table, parse_aml_table, AmlNamespace, AmlError}; +mod hpet; mod dmar; mod fadt; mod madt; @@ -195,6 +197,8 @@ fn parse_sdt(sdt: &'static Sdt, active_table: &mut ActivePageTable) { _ => () } } + } else if let Some(hpet) = Hpet::new(sdt) { + println!(": {:#?}", hpet); } else if is_aml_table(sdt) { ACPI_TABLE.lock().namespace = match parse_aml_table(sdt) { Ok(res) => {