From aff81bea06f716b511a1d6f68f3db30e47e253fa Mon Sep 17 00:00:00 2001 From: Mark Date: Tue, 15 Sep 2020 11:35:23 +0300 Subject: [PATCH] Add configuration table iterator --- crates/efi/src/base.rs | 1 + crates/efi/src/lib.rs | 57 +++++++++++++++++++++++++++++++++++++++++- src/main.rs | 2 +- 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/crates/efi/src/base.rs b/crates/efi/src/base.rs index 88ba067..6898d6a 100644 --- a/crates/efi/src/base.rs +++ b/crates/efi/src/base.rs @@ -77,6 +77,7 @@ impl Termination for Result { } } +#[derive(Eq, PartialEq)] pub struct Guid { pub data1: u32, pub data2: u16, diff --git a/crates/efi/src/lib.rs b/crates/efi/src/lib.rs index a5b19df..93dd348 100644 --- a/crates/efi/src/lib.rs +++ b/crates/efi/src/lib.rs @@ -41,7 +41,62 @@ pub struct SystemTable { pub runtime_services: &'static mut RuntimeServices, pub boot_services: &'static mut BootServices, number_of_table_entries: usize, - configuration_table: *mut c_void // TODO + configuration_table: *mut ConfigurationTableRaw +} + +#[repr(C)] +struct ConfigurationTableRaw { + vendor_guid: Guid, + vendor_table: *mut c_void +} + +pub enum ConfigurationTableEntry { + Acpi10Table(*mut c_void), // RSDP + NotImplemented(*mut c_void) +} + +pub struct ConfigurationTableIterator<'a> { + index: usize, + st: &'a SystemTable +} + +const EFI_ACPI_10_TABLE_GUID: Guid = Guid { + data1: 0xeb9d2d30, + data2: 0x2d88, + data3: 0x11d3, + data4: [0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d] +}; +impl From<&ConfigurationTableRaw> for ConfigurationTableEntry { + fn from(raw: &ConfigurationTableRaw) -> Self { + use ConfigurationTableEntry::*; + match &raw.vendor_guid { + &EFI_ACPI_10_TABLE_GUID => Acpi10Table(raw.vendor_table), + _ => NotImplemented(raw.vendor_table) + } + } +} + +impl<'a> Iterator for ConfigurationTableIterator<'a> { + type Item = ConfigurationTableEntry; + + fn next(&mut self) -> Option { + if self.index >= self.st.number_of_table_entries { + None + } else { + let raw = unsafe {&*self.st.configuration_table.offset(self.index as isize)}; + self.index += 1; + Some(ConfigurationTableEntry::from(raw)) + } + } +} + +impl SystemTable { + pub fn config_iter(&self) -> ConfigurationTableIterator { + ConfigurationTableIterator { + st: self, + index: 0 + } + } } static mut SYSTEM_TABLE: *mut SystemTable = null_mut(); diff --git a/src/main.rs b/src/main.rs index 4941cdb..0a8613e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,7 @@ extern crate efi; extern crate core_rt; -use efi::{Status, Handle, SystemTable, system_table}; +use efi::{Status, Handle, SystemTable, ConfigurationTableEntry, system_table}; #[macro_use] mod println;