//! Standard UEFI tables. pub mod cfg; mod header; pub use header::Header; pub use uefi_raw::table::Revision; use core::ptr::{self, NonNull}; use core::sync::atomic::{AtomicPtr, Ordering}; /// Global system table pointer. This is only modified by [`set_system_table`]. static SYSTEM_TABLE: AtomicPtr = AtomicPtr::new(ptr::null_mut()); /// Get the raw system table pointer. /// /// If called before `set_system_table` has been called, this will return `None`. pub fn system_table_raw() -> Option> { let ptr = SYSTEM_TABLE.load(Ordering::Acquire); NonNull::new(ptr) } /// Get the raw system table pointer. This may only be called after /// `set_system_table` has been used to set the global pointer. /// /// # Panics /// /// Panics if the global system table pointer is null. #[track_caller] pub(crate) fn system_table_raw_panicking() -> NonNull { system_table_raw().expect("global system table pointer is not set") } /// Update the global system table pointer. /// /// This is called automatically in the `main` entry point as part of /// [`uefi::entry`]. /// /// It is also called by [`set_virtual_address_map`] to transition from a /// physical address to a virtual address. /// /// This function should not be called at any other point in time, unless the /// executable does not use [`uefi::entry`], in which case it should be called /// once before calling any other API in this crate. /// /// # Safety /// /// This function should only be called as described above, and the /// `ptr` must be a valid [`SystemTable`]. /// /// [`SystemTable`]: uefi_raw::table::system::SystemTable /// [`set_virtual_address_map`]: uefi::runtime::set_virtual_address_map pub unsafe fn set_system_table(ptr: *const uefi_raw::table::system::SystemTable) { SYSTEM_TABLE.store(ptr.cast_mut(), Ordering::Release); } /// Common trait implemented by all standard UEFI tables. pub trait Table { /// A unique number assigned by the UEFI specification /// to the standard tables. const SIGNATURE: u64; }