uefi/
firmware_volume.rs

1// SPDX-License-Identifier: MIT
2
3use core::ops::RangeInclusive;
4
5use crate::memory::PhysicalAddress;
6use crate::prelude::*;
7
8/// EFI_FVB_ATTRIBUTES_2
9pub type FvbAttributes2 = u32;
10
11/// EFI_FV_ATTRIBUTES
12pub type FvAttributes = u64;
13
14/// EFI_FV_FILE_ATTRIBUTES
15#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
16#[repr(transparent)]
17pub struct FvFileAttributes(pub u32);
18
19impl FvFileAttributes {
20    pub const ALIGNMENT: Self = Self(0x1F);
21    pub const FIXED: Self = Self(1 << 8);
22    pub const MEMORY_MAPPED: Self = Self(1 << 9);
23}
24
25/// EFI_FV_WRITE_POLICY
26#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
27#[repr(transparent)]
28pub struct FvWritePolicy(pub u32);
29
30impl FvWritePolicy {
31    pub const UNRELIABLE_WRITE: Self = Self(0);
32    pub const RELIABLE_WRITE: Self = Self(1);
33}
34
35/// EFI_FV_FILETYPE
36#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
37#[repr(transparent)]
38pub struct FvFiletype(pub u8);
39
40impl FvFiletype {
41    pub const ALL: Self = Self(0x00);
42    pub const RAW: Self = Self(0x01);
43    pub const FREEFORM: Self = Self(0x02);
44    pub const SECURITY_CORE: Self = Self(0x03);
45    pub const PEI_CORE: Self = Self(0x04);
46    pub const DXE_CORE: Self = Self(0x05);
47    pub const PEIM: Self = Self(0x06);
48    pub const DRIVER: Self = Self(0x07);
49    pub const COMBINED_PEIM_DRIVER: Self = Self(0x08);
50    pub const APPLICATION: Self = Self(0x09);
51    pub const MM: Self = Self(0x0A);
52    pub const FIRMWARE_VOLUME_IMAGE: Self = Self(0x0B);
53    pub const COMBINED_MM_DXE: Self = Self(0x0C);
54    pub const MM_CORE: Self = Self(0x0D);
55    pub const MM_STANDALONE: Self = Self(0x0E);
56    pub const MM_CORE_STANDALONE: Self = Self(0x0F);
57    pub const FFS_PAD: Self = Self(0xF0);
58
59    pub const OEM_RANGE: RangeInclusive<u8> = 0xC0..=0xDF;
60    pub const DEBUG_RANGE: RangeInclusive<u8> = 0xE0..=0xEF;
61    pub const FFS_RANGE: RangeInclusive<u8> = 0xF0..=0xFF;
62}
63
64/// EFI_SECTION_TYPE
65#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
66#[repr(transparent)]
67pub struct SectionType(pub u8);
68
69impl SectionType {
70    pub const ALL: Self = Self(0x00);
71    pub const COMPRESSION: Self = Self(0x01);
72    pub const GUID_DEFINED: Self = Self(0x02);
73    pub const DISPOSABLE: Self = Self(0x03);
74    pub const PE32: Self = Self(0x10);
75    pub const PIC: Self = Self(0x11);
76    pub const TE: Self = Self(0x12);
77    pub const DXE_DEPEX: Self = Self(0x13);
78    pub const VERSION: Self = Self(0x14);
79    pub const USER_INTERFACE: Self = Self(0x15);
80    pub const COMPATIBILITY16: Self = Self(0x16);
81    pub const FIRMWARE_VOLUME_IMAGE: Self = Self(0x17);
82    pub const FREEFORM_SUBTYPE_GUID: Self = Self(0x18);
83    pub const RAW: Self = Self(0x19);
84    pub const PEI_DEPEX: Self = Self(0x1B);
85    pub const MM_DEPEX: Self = Self(0x1C);
86}
87
88/// EFI_FV_WRITE_FILE_DATA
89#[derive(Debug)]
90#[repr(C)]
91pub struct FvWriteFileData {
92    pub NameGuid: *const Guid,
93    pub Type: FvFiletype,
94    pub FileAttributes: FvFileAttributes,
95    pub Buffer: *const u8,
96    pub BufferSize: u32,
97}
98
99/// EFI_FIRMWARE_VOLUME2_PROTOCOL
100#[derive(Debug)]
101#[repr(C)]
102pub struct FirmwareVolume2 {
103    pub GetVolumeAttributes:
104        extern "efiapi" fn(This: &Self, FvAttributes: &mut FvAttributes) -> Status,
105    pub SetVolumeAttributes:
106        extern "efiapi" fn(This: &Self, FvAttributes: &mut FvAttributes) -> Status,
107    pub ReadFile: extern "efiapi" fn(
108        This: &Self,
109        NameGuid: &Guid,
110        Buffer: &mut *mut u8,
111        BufferSize: &mut usize,
112        FoundType: &mut FvFiletype,
113        FileAttributes: &mut FvFileAttributes,
114        AuthenticationStatus: &mut u32,
115    ) -> Status,
116    pub ReadSection: extern "efiapi" fn(
117        This: &Self,
118        NameGuid: &Guid,
119        SectionType: SectionType,
120        SectionInstance: usize,
121        Buffer: &mut *mut u8,
122        BufferSize: &mut usize,
123        AuthenticationStatus: &mut u32,
124    ) -> Status,
125    pub WriteFile: extern "efiapi" fn(
126        This: &Self,
127        NumberOfFiles: u32,
128        WritePolicy: FvWritePolicy,
129        FileData: &FvWriteFileData,
130    ) -> Status,
131    pub GetNextFile: extern "efiapi" fn(
132        This: &Self,
133        Key: *mut u8,
134        FileType: &mut FvFiletype,
135        NameGuid: &mut Guid,
136        Attributes: &mut FvFileAttributes,
137        Size: &mut usize,
138    ) -> Status,
139    pub KeySize: u32,
140    pub ParentHandle: Handle,
141    pub GetInfo: extern "efiapi" fn(
142        This: &Self,
143        InformationType: &Guid,
144        BufferSize: &mut usize,
145        Buffer: *mut u8,
146    ) -> Status,
147    pub SetInfo: extern "efiapi" fn(
148        This: &Self,
149        InformationType: &Guid,
150        BufferSize: usize,
151        Buffer: *const u8,
152    ) -> Status,
153}
154
155impl FirmwareVolume2 {
156    pub const GUID: Guid = guid!("220e73b6-6bdb-4413-8405-b974b108619a");
157}
158
159/// EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL
160#[derive(Debug)]
161#[repr(C)]
162pub struct FirmwareVolumeBlock2 {
163    pub GetAttributes: extern "efiapi" fn(This: &Self, Attributes: &mut FvbAttributes2) -> Status,
164    pub SetAttributes: extern "efiapi" fn(This: &Self, Attributes: &mut FvbAttributes2) -> Status,
165    pub GetPhysicalAddress:
166        extern "efiapi" fn(This: &Self, Address: &mut PhysicalAddress) -> Status,
167    pub GetBlockSize: extern "efiapi" fn(
168        This: &Self,
169        Lba: u64,
170        BlockSize: &mut usize,
171        NumberOfBlocks: &mut usize,
172    ) -> Status,
173    pub Read: extern "efiapi" fn(
174        This: &Self,
175        Lba: u64,
176        Offset: usize,
177        NumBytes: &mut usize,
178        Buffer: *mut u8,
179    ) -> Status,
180    pub Write: extern "efiapi" fn(
181        This: &Self,
182        Lba: u64,
183        Offset: usize,
184        NumBytes: &mut usize,
185        Buffer: *mut u8,
186    ) -> Status,
187    // TODO: Change to efiapi
188    EraseBlocks: extern "C" fn(This: &Self, ...) -> Status,
189    pub ParentHandle: Handle,
190}
191
192impl FirmwareVolumeBlock2 {
193    pub const GUID: Guid = guid!("8f644fa9-e850-4db1-9ce2-0b44698e8da4");
194    pub const LBA_LIST_TERMINATOR: u64 = u64::MAX;
195}