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");
}