| //! Raw interface for working with UEFI. |
| //! |
| //! This crate is intended for implementing UEFI services. It is also used for |
| //! implementing the [`uefi`] crate, which provides a safe wrapper around UEFI. |
| //! |
| //! For creating UEFI applications and drivers, consider using the [`uefi`] |
| //! crate instead of `uefi-raw`. |
| //! |
| //! [`uefi`]: https://crates.io/crates/uefi |
| |
| #![no_std] |
| #![cfg_attr(docsrs, feature(doc_auto_cfg))] |
| #![deny( |
| clippy::all, |
| clippy::missing_const_for_fn, |
| clippy::must_use_candidate, |
| clippy::ptr_as_ptr, |
| clippy::use_self, |
| missing_debug_implementations, |
| unused |
| )] |
| |
| #[macro_use] |
| mod enums; |
| |
| pub mod capsule; |
| pub mod firmware_storage; |
| pub mod protocol; |
| pub mod table; |
| pub mod time; |
| |
| mod status; |
| |
| use core::ffi::c_void; |
| use core::fmt::{self, Debug, Formatter}; |
| pub use status::Status; |
| pub use uguid::{guid, Guid}; |
| |
| /// Handle to an event structure. |
| pub type Event = *mut c_void; |
| |
| /// Handle to a UEFI entity (protocol, image, etc). |
| pub type Handle = *mut c_void; |
| |
| /// One-byte character. |
| /// |
| /// Most strings in UEFI use [`Char16`], but a few places use one-byte |
| /// characters. Unless otherwise noted, these are encoded as 8-bit ASCII using |
| /// the ISO-Latin-1 character set. |
| pub type Char8 = u8; |
| |
| /// Two-byte character. |
| /// |
| /// Unless otherwise noted, the encoding is UCS-2. The UCS-2 encoding was |
| /// defined by Unicode 2.1 and ISO/IEC 10646 standards, but is no longer part of |
| /// the modern Unicode standards. It is essentially UTF-16 without support for |
| /// surrogate pairs. |
| pub type Char16 = u16; |
| |
| /// Physical memory address. This is always a 64-bit value, regardless |
| /// of target platform. |
| pub type PhysicalAddress = u64; |
| |
| /// Virtual memory address. This is always a 64-bit value, regardless |
| /// of target platform. |
| pub type VirtualAddress = u64; |
| |
| /// An IPv4 internet protocol address. |
| #[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Ord, PartialOrd, Hash)] |
| #[repr(transparent)] |
| pub struct Ipv4Address(pub [u8; 4]); |
| |
| /// An IPv6 internet protocol address. |
| #[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Ord, PartialOrd, Hash)] |
| #[repr(transparent)] |
| pub struct Ipv6Address(pub [u8; 16]); |
| |
| /// An IPv4 or IPv6 internet protocol address. |
| /// |
| /// Corresponds to the `EFI_IP_ADDRESS` type in the UEFI specification. This |
| /// type is defined in the same way as edk2 for compatibility with C code. Note |
| /// that this is an untagged union, so there's no way to tell which type of |
| /// address an `IpAddress` value contains without additional context. |
| #[derive(Clone, Copy)] |
| #[repr(C)] |
| pub union IpAddress { |
| /// This member serves to align the whole type to a 4 bytes as required by |
| /// the spec. Note that this is slightly different from `repr(align(4))`, |
| /// which would prevent placing this type in a packed structure. |
| pub addr: [u32; 4], |
| |
| /// An IPv4 internet protocol address. |
| pub v4: Ipv4Address, |
| |
| /// An IPv6 internet protocol address. |
| pub v6: Ipv6Address, |
| } |
| |
| impl IpAddress { |
| /// Construct a new IPv4 address. |
| #[must_use] |
| pub const fn new_v4(ip_addr: [u8; 4]) -> Self { |
| Self { |
| v4: Ipv4Address(ip_addr), |
| } |
| } |
| |
| /// Construct a new IPv6 address. |
| #[must_use] |
| pub const fn new_v6(ip_addr: [u8; 16]) -> Self { |
| Self { |
| v6: Ipv6Address(ip_addr), |
| } |
| } |
| } |
| |
| impl Debug for IpAddress { |
| fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { |
| // The type is an untagged union, so we don't know whether it contains |
| // an IPv4 or IPv6 address. It's also not safe to just print the whole |
| // 16 bytes, since they might not all be initialized. |
| f.debug_struct("IpAddress").finish() |
| } |
| } |
| |
| impl Default for IpAddress { |
| fn default() -> Self { |
| Self { addr: [0u32; 4] } |
| } |
| } |
| |
| /// A Media Access Control (MAC) address. |
| #[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Ord, PartialOrd, Hash)] |
| #[repr(transparent)] |
| pub struct MacAddress(pub [u8; 32]); |