1use core::ops::RangeInclusive;
4
5use crate::memory::PhysicalAddress;
6use crate::prelude::*;
7
8pub type FvbAttributes2 = u32;
10
11pub type FvAttributes = u64;
13
14#[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#[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#[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#[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#[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#[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#[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 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}