uefi_specs/uefi/
boot.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Definitions related to UEFI boot entries
5
6use guid::Guid;
7use zerocopy::FromBytes;
8use zerocopy::Immutable;
9use zerocopy::IntoBytes;
10use zerocopy::KnownLayout;
11
12open_enum::open_enum! {
13    /// From UEFI spec 7.2.1
14    #[derive(IntoBytes, FromBytes, Immutable, KnownLayout)]
15    pub enum EfiMemoryType: u32 {
16        EFI_RESERVED_MEMORY_TYPE = 0,
17        EFI_LOADER_CODE = 1,
18        EFI_LOADER_DATA = 2,
19        EFI_BOOT_SERVICES_CODE = 3,
20        EFI_BOOT_SERVICES_DATA = 4,
21        EFI_RUNTIME_SERVICES_CODE = 5,
22        EFI_RUNTIME_SERVICES_DATA = 6,
23        EFI_CONVENTIONAL_MEMORY = 7,
24        EFI_UNUSABLE_MEMORY = 8,
25        EFI_ACPI_RECLAIM_MEMORY = 9,
26        EFI_ACPI_MEMORY_NVS = 10,
27        EFI_MEMORY_MAPPED_IO = 11,
28        EFI_MEMORY_MAPPED_IOPORT_SPACE = 12,
29        EFI_PAL_CODE = 13,
30        EFI_PERSISTENT_MEMORY = 14,
31        EFI_UNACCEPTED_MEMORY_TYPE = 15,
32        EFI_MAX_MEMORY_TYPE = 16,
33    }
34}
35
36/// From UEFI spec 10.2
37#[repr(C, packed)]
38#[derive(IntoBytes, FromBytes, Immutable, KnownLayout)]
39pub struct EfiDevicePathProtocol {
40    pub device_type: EfiDeviceType,
41    pub sub_type: u8,
42    pub length: [u8; 2],
43}
44
45/// From UEFI spec 3.1.3
46#[repr(C, packed)]
47#[derive(IntoBytes, FromBytes, Immutable, KnownLayout)]
48pub struct EfiLoadOption {
49    pub attributes: u32,
50    pub file_path_list_length: u16,
51}
52
53open_enum::open_enum! {
54    #[derive(IntoBytes, FromBytes, Immutable, KnownLayout)]
55    pub enum EfiDeviceType: u8 {
56        HARDWARE = 0x01,
57        ACPI = 0x02,
58        MESSAGING = 0x03,
59        MEDIA = 0x04,
60        BIOS_BOOT_SPEC = 0x05,
61        END = 0x7F,
62    }
63}
64
65open_enum::open_enum! {
66    #[derive(IntoBytes, FromBytes, Immutable, KnownLayout)]
67    pub enum EfiEndDeviceSubType: u8 {
68        INSTANCE = 0x01,
69        ENTIRE = 0xFF,
70    }
71}
72
73open_enum::open_enum! {
74    #[derive(IntoBytes, FromBytes, Immutable, KnownLayout)]
75    pub enum EfiHardwareDeviceSubType: u8 {
76        PCI = 1,
77        PCCARD = 2,
78        MEMORY_MAPPED = 3,
79        VENDOR = 4,
80        CONTROLLER = 5,
81        BMC = 6,
82    }
83}
84
85open_enum::open_enum! {
86    #[derive(IntoBytes, FromBytes, Immutable, KnownLayout)]
87    pub enum EfiAcpiDeviceSubType: u8 {
88        ACPI = 1,
89        EXPANDED_ACPI = 2,
90        ADR = 3,
91        NVDIMM = 4,
92    }
93}
94
95open_enum::open_enum! {
96    #[derive(IntoBytes, FromBytes, Immutable, KnownLayout)]
97    pub enum EfiMessagingDeviceSubType: u8 {
98        ATAPI = 1,
99        SCSI = 2,
100        FIBRE_CHANNEL = 3,
101        FIBRE_CHANNEL_EX = 21,
102        IEEE_1394 = 4,
103        USB = 5,
104        SATA = 18,
105        USB_WWID = 16,
106        LOGICAL_UNIT =  17,
107        USB_CLASS = 15,
108        I20_RANDOM_BLOCK_STORAGE_CLASS = 6,
109        MAC_ADDRESS = 11,
110        IPV4 = 12,
111        IPV6 = 13,
112        VLAN = 20,
113        INFINIBAND = 9,
114        UART = 14,
115        SAS = 10,
116        SAS_EX = 22,
117        ISCSI = 19,
118        NVME_NAMESPACE = 23,
119        URI = 24,
120        UFS = 25,
121        SD = 26,
122        BLUETOOTH = 27,
123        WIFI = 28,
124        EMMC = 29,
125        BLUETOOTH_LE = 30,
126        DNS = 31,
127        NVDIMM = 32,
128        REST_SERVICE = 33,
129        NVME_OF = 34,
130    }
131}
132
133open_enum::open_enum! {
134    #[derive(IntoBytes, FromBytes, Immutable, KnownLayout)]
135    pub enum EfiMediaDeviceSubType: u8 {
136        HARD_DRIVE = 0x01,
137        CD_ROM = 0x02,
138        VENDOR = 0x03,
139        FILE = 0x04,
140        MEDIA_PROTOCOL = 0x05,
141        PIWG_FIRMWARE_FILE = 0x06,
142        PIWG_FIRMWARE_VOLUME = 0x07,
143        RELATIVE_OFFSET_RANGE = 0x08,
144        RAM_DISK = 0x09,
145    }
146}
147
148open_enum::open_enum! {
149    #[derive(IntoBytes, FromBytes, Immutable, KnownLayout)]
150    pub enum EfiPartitionFormat: u8 {
151        MBR = 0x01,
152        GUID = 0x02,
153    }
154}
155
156open_enum::open_enum! {
157    #[derive(IntoBytes, FromBytes, Immutable, KnownLayout)]
158    pub enum EfiSignatureType: u8 {
159        NONE = 0x00,
160        MBR = 0x01,
161        GUID = 0x02,
162    }
163}
164
165#[repr(C, packed)]
166#[derive(IntoBytes, FromBytes, Immutable, KnownLayout, Debug, PartialEq)]
167pub struct EfiHardDriveDevice {
168    pub partition_number: u32,
169    pub partition_start: u64,
170    pub partition_size: u64,
171    pub partition_signature: Guid,
172    pub partition_format: EfiPartitionFormat,
173    pub partition_type: EfiSignatureType,
174}
175
176#[repr(C, packed)]
177#[derive(IntoBytes, FromBytes, Immutable, KnownLayout, Debug, PartialEq)]
178pub struct EfiScsiDevice {
179    pub target_id: u16,
180    pub logical_unit_num: u16,
181}
182
183#[repr(C, packed)]
184#[derive(IntoBytes, FromBytes, Immutable, KnownLayout, Debug, PartialEq)]
185pub struct EfiMemoryMappedDevice {
186    pub memory_type: EfiMemoryType,
187    pub start_address: u64,
188    pub end_address: u64,
189}
190
191#[repr(C, packed)]
192#[derive(IntoBytes, FromBytes, Immutable, KnownLayout, Debug, PartialEq)]
193pub struct EfiExpandedAcpiDevice {
194    pub hid: u32,
195    pub cid: u32,
196    pub uid: u32,
197}