From 387cd41e5ebb96517e344a4a2e5b3046617771fc Mon Sep 17 00:00:00 2001 From: Connor Wood <connorwood71@gmail.com> Date: Fri, 14 Jul 2017 10:36:27 +0100 Subject: [PATCH] Implemented ACPI table --- src/acpi/hpet.rs | 39 +++++++++++++++++++++++++++++++++++++++ src/acpi/mod.rs | 4 ++++ 2 files changed, 43 insertions(+) create mode 100644 src/acpi/hpet.rs diff --git a/src/acpi/hpet.rs b/src/acpi/hpet.rs new file mode 100644 index 00000000..9f76caa6 --- /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 98d9ba9e..7a564afe 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) => { -- GitLab