uefi_raw/protocol/device_path.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
mod device_path_gen;
use crate::{guid, Char16, Guid};
pub use device_path_gen::{acpi, bios_boot_spec, end, hardware, media, messaging};
/// Device path protocol.
///
/// A device path contains one or more device path instances made of up
/// variable-length nodes.
///
/// Note that the fields in this struct define the header at the start of each
/// node; a device path is typically larger than these four bytes.
#[derive(Debug)]
#[repr(C)]
pub struct DevicePathProtocol {
pub major_type: DeviceType,
pub sub_type: DeviceSubType,
pub length: [u8; 2],
// followed by payload (dynamically sized)
}
impl DevicePathProtocol {
pub const GUID: Guid = guid!("09576e91-6d3f-11d2-8e39-00a0c969723b");
}
newtype_enum! {
/// Type identifier for a device path node.
pub enum DeviceType: u8 => {
/// Hardware Device Path.
///
/// This Device Path defines how a device is attached to the resource domain of a system, where resource domain is
/// simply the shared memory, memory mapped I/ O, and I/O space of the system.
HARDWARE = 0x01,
/// ACPI Device Path.
///
/// This Device Path is used to describe devices whose enumeration is not described in an industry-standard fashion.
/// These devices must be described using ACPI AML in the ACPI namespace; this Device Path is a linkage to the ACPI
/// namespace.
ACPI = 0x02,
/// Messaging Device Path.
///
/// This Device Path is used to describe the connection of devices outside the resource domain of the system. This
/// Device Path can describe physical messaging information such as a SCSI ID, or abstract information such as
/// networking protocol IP addresses.
MESSAGING = 0x03,
/// Media Device Path.
///
/// This Device Path is used to describe the portion of a medium that is being abstracted by a boot service.
/// For example, a Media Device Path could define which partition on a hard drive was being used.
MEDIA = 0x04,
/// BIOS Boot Specification Device Path.
///
/// This Device Path is used to point to boot legacy operating systems; it is based on the BIOS Boot Specification
/// Version 1.01.
BIOS_BOOT_SPEC = 0x05,
/// End of Hardware Device Path.
///
/// Depending on the Sub-Type, this Device Path node is used to indicate the end of the Device Path instance or
/// Device Path structure.
END = 0x7F,
}}
/// Sub-type identifier for a device path node.
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
#[repr(transparent)]
pub struct DeviceSubType(pub u8);
impl DeviceSubType {
/// PCI Device Path.
pub const HARDWARE_PCI: Self = Self(1);
/// PCCARD Device Path.
pub const HARDWARE_PCCARD: Self = Self(2);
/// Memory-mapped Device Path.
pub const HARDWARE_MEMORY_MAPPED: Self = Self(3);
/// Vendor-Defined Device Path.
pub const HARDWARE_VENDOR: Self = Self(4);
/// Controller Device Path.
pub const HARDWARE_CONTROLLER: Self = Self(5);
/// BMC Device Path.
pub const HARDWARE_BMC: Self = Self(6);
/// ACPI Device Path.
pub const ACPI: Self = Self(1);
/// Expanded ACPI Device Path.
pub const ACPI_EXPANDED: Self = Self(2);
/// ACPI _ADR Device Path.
pub const ACPI_ADR: Self = Self(3);
/// NVDIMM Device Path.
pub const ACPI_NVDIMM: Self = Self(4);
/// ATAPI Device Path.
pub const MESSAGING_ATAPI: Self = Self(1);
/// SCSI Device Path.
pub const MESSAGING_SCSI: Self = Self(2);
/// Fibre Channel Device Path.
pub const MESSAGING_FIBRE_CHANNEL: Self = Self(3);
/// 1394 Device Path.
pub const MESSAGING_1394: Self = Self(4);
/// USB Device Path.
pub const MESSAGING_USB: Self = Self(5);
/// I2O Device Path.
pub const MESSAGING_I2O: Self = Self(6);
/// Infiniband Device Path.
pub const MESSAGING_INFINIBAND: Self = Self(9);
/// Vendor-Defined Device Path.
pub const MESSAGING_VENDOR: Self = Self(10);
/// MAC Address Device Path.
pub const MESSAGING_MAC_ADDRESS: Self = Self(11);
/// IPV4 Device Path.
pub const MESSAGING_IPV4: Self = Self(12);
/// IPV6 Device Path.
pub const MESSAGING_IPV6: Self = Self(13);
/// UART Device Path.
pub const MESSAGING_UART: Self = Self(14);
/// USB Class Device Path.
pub const MESSAGING_USB_CLASS: Self = Self(15);
/// USB WWID Device Path.
pub const MESSAGING_USB_WWID: Self = Self(16);
/// Device Logical Unit.
pub const MESSAGING_DEVICE_LOGICAL_UNIT: Self = Self(17);
/// SATA Device Path.
pub const MESSAGING_SATA: Self = Self(18);
/// iSCSI Device Path node (base information).
pub const MESSAGING_ISCSI: Self = Self(19);
/// VLAN Device Path node.
pub const MESSAGING_VLAN: Self = Self(20);
/// Fibre Channel Ex Device Path.
pub const MESSAGING_FIBRE_CHANNEL_EX: Self = Self(21);
/// Serial Attached SCSI (SAS) Ex Device Path.
pub const MESSAGING_SCSI_SAS_EX: Self = Self(22);
/// NVM Express Namespace Device Path.
pub const MESSAGING_NVME_NAMESPACE: Self = Self(23);
/// Uniform Resource Identifiers (URI) Device Path.
pub const MESSAGING_URI: Self = Self(24);
/// UFS Device Path.
pub const MESSAGING_UFS: Self = Self(25);
/// SD (Secure Digital) Device Path.
pub const MESSAGING_SD: Self = Self(26);
/// Bluetooth Device Path.
pub const MESSAGING_BLUETOOTH: Self = Self(27);
/// Wi-Fi Device Path.
pub const MESSAGING_WIFI: Self = Self(28);
/// eMMC (Embedded Multi-Media Card) Device Path.
pub const MESSAGING_EMMC: Self = Self(29);
/// BluetoothLE Device Path.
pub const MESSAGING_BLUETOOTH_LE: Self = Self(30);
/// DNS Device Path.
pub const MESSAGING_DNS: Self = Self(31);
/// NVDIMM Namespace Device Path.
pub const MESSAGING_NVDIMM_NAMESPACE: Self = Self(32);
/// REST Service Device Path.
pub const MESSAGING_REST_SERVICE: Self = Self(33);
/// NVME over Fabric (NVMe-oF) Namespace Device Path.
pub const MESSAGING_NVME_OF_NAMESPACE: Self = Self(34);
/// Hard Drive Media Device Path.
pub const MEDIA_HARD_DRIVE: Self = Self(1);
/// CD-ROM Media Device Path.
pub const MEDIA_CD_ROM: Self = Self(2);
/// Vendor-Defined Media Device Path.
pub const MEDIA_VENDOR: Self = Self(3);
/// File Path Media Device Path.
pub const MEDIA_FILE_PATH: Self = Self(4);
/// Media Protocol Device Path.
pub const MEDIA_PROTOCOL: Self = Self(5);
/// PIWG Firmware File.
pub const MEDIA_PIWG_FIRMWARE_FILE: Self = Self(6);
/// PIWG Firmware Volume.
pub const MEDIA_PIWG_FIRMWARE_VOLUME: Self = Self(7);
/// Relative Offset Range.
pub const MEDIA_RELATIVE_OFFSET_RANGE: Self = Self(8);
/// RAM Disk Device Path.
pub const MEDIA_RAM_DISK: Self = Self(9);
/// BIOS Boot Specification Device Path.
pub const BIOS_BOOT_SPECIFICATION: Self = Self(1);
/// End this instance of a Device Path and start a new one.
pub const END_INSTANCE: Self = Self(0x01);
/// End entire Device Path.
pub const END_ENTIRE: Self = Self(0xff);
}
#[derive(Debug)]
#[repr(C)]
pub struct DevicePathToTextProtocol {
pub convert_device_node_to_text: unsafe extern "efiapi" fn(
device_node: *const DevicePathProtocol,
display_only: bool,
allow_shortcuts: bool,
) -> *const Char16,
pub convert_device_path_to_text: unsafe extern "efiapi" fn(
device_path: *const DevicePathProtocol,
display_only: bool,
allow_shortcuts: bool,
) -> *const Char16,
}
impl DevicePathToTextProtocol {
pub const GUID: Guid = guid!("8b843e20-8132-4852-90cc-551a4e4a7f1c");
}
#[derive(Debug)]
#[repr(C)]
pub struct DevicePathFromTextProtocol {
pub convert_text_to_device_node:
unsafe extern "efiapi" fn(text_device_node: *const Char16) -> *const DevicePathProtocol,
pub convert_text_to_device_path:
unsafe extern "efiapi" fn(text_device_path: *const Char16) -> *const DevicePathProtocol,
}
impl DevicePathFromTextProtocol {
pub const GUID: Guid = guid!("05c99a21-c70f-4ad2-8a5f-35df3343f51e");
}