use acpi::AcpiTables;
use core::{ffi::c_void, ptr::NonNull};
pub mod cpu;
pub(crate) mod earlycon;
mod handle;
pub mod power;
use crate::mem::phys_to_virt;
pub(crate) use handle::AcpiHandle;
static mut RSDP: usize = 0;
#[allow(unused)]
pub(crate) fn set_rsdp(addr: *const c_void) {
unsafe {
RSDP = addr as usize;
}
}
#[allow(unused)]
fn rsdp() -> Option<NonNull<u8>> {
let rsdp = unsafe { RSDP };
if rsdp == 0 {
return None;
}
let ptr = phys_to_virt(rsdp);
NonNull::new(ptr)
}
pub fn tables() -> Result<AcpiTables<AcpiHandle>, acpi::AcpiError> {
unsafe {
let rsdp = if RSDP == 0 {
return Err(acpi::AcpiError::NoValidRsdp);
} else {
RSDP
};
let h = AcpiHandle;
::acpi::AcpiTables::from_rsdp(h, rsdp)
}
}
pub fn cpu_id_list() -> Option<impl Iterator<Item = usize>> {
cpu::cpu_id_list()
}