blob: 57f4d7c6a37e2fde98c5e87154bfb2c33851c5ad [file] [log] [blame]
//! 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<uefi_raw::table::system::SystemTable> =
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<NonNull<uefi_raw::table::system::SystemTable>> {
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<uefi_raw::table::system::SystemTable> {
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;
}