]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/Include/Common/PiFirmwareFile.h
BaseTools/PiFirmwareFile: fix undefined behavior in SECTION_SIZE
[mirror_edk2.git] / BaseTools / Source / C / Include / Common / PiFirmwareFile.h
CommitLineData
30fdf114
LG
1/** @file\r
2 The firmware file related definitions in PI.\r
f7496d71 3\r
97fa0ee9 4 @par Revision Reference:\r
6eff5d22 5 Version 1.4.\r
30fdf114 6\r
f7496d71 7 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
30fdf114 8\r
2e351cbe 9 SPDX-License-Identifier: BSD-2-Clause-Patent\r
30fdf114 10\r
30fdf114
LG
11**/\r
12\r
13#ifndef __PI_FIRMWARE_FILE_H__\r
14#define __PI_FIRMWARE_FILE_H__\r
15\r
16#pragma pack(1)\r
17//\r
18// Used to verify the integrity of the file.\r
f7496d71 19//\r
30fdf114
LG
20typedef union {\r
21 struct {\r
22 UINT8 Header;\r
23 UINT8 File;\r
24 } Checksum;\r
25 UINT16 Checksum16;\r
26} EFI_FFS_INTEGRITY_CHECK;\r
27\r
28typedef UINT8 EFI_FV_FILETYPE;\r
29typedef UINT8 EFI_FFS_FILE_ATTRIBUTES;\r
30typedef UINT8 EFI_FFS_FILE_STATE;\r
31\r
32//\r
33// File Types Definitions\r
f7496d71 34//\r
30fdf114
LG
35#define EFI_FV_FILETYPE_ALL 0x00\r
36#define EFI_FV_FILETYPE_RAW 0x01\r
37#define EFI_FV_FILETYPE_FREEFORM 0x02\r
38#define EFI_FV_FILETYPE_SECURITY_CORE 0x03\r
39#define EFI_FV_FILETYPE_PEI_CORE 0x04\r
40#define EFI_FV_FILETYPE_DXE_CORE 0x05\r
41#define EFI_FV_FILETYPE_PEIM 0x06\r
42#define EFI_FV_FILETYPE_DRIVER 0x07\r
43#define EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER 0x08\r
44#define EFI_FV_FILETYPE_APPLICATION 0x09\r
b303ea72 45#define EFI_FV_FILETYPE_SMM 0x0A\r
30fdf114 46#define EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE 0x0B\r
b303ea72
LG
47#define EFI_FV_FILETYPE_COMBINED_SMM_DXE 0x0C\r
48#define EFI_FV_FILETYPE_SMM_CORE 0x0D\r
116f23e8
SV
49#define EFI_FV_FILETYPE_MM_STANDALONE 0x0E\r
50#define EFI_FV_FILETYPE_MM_CORE_STANDALONE 0x0F\r
30fdf114
LG
51#define EFI_FV_FILETYPE_OEM_MIN 0xc0\r
52#define EFI_FV_FILETYPE_OEM_MAX 0xdf\r
53#define EFI_FV_FILETYPE_DEBUG_MIN 0xe0\r
54#define EFI_FV_FILETYPE_DEBUG_MAX 0xef\r
55#define EFI_FV_FILETYPE_FFS_MIN 0xf0\r
56#define EFI_FV_FILETYPE_FFS_MAX 0xff\r
57#define EFI_FV_FILETYPE_FFS_PAD 0xf0\r
f7496d71 58//\r
30fdf114 59// FFS File Attributes.\r
f7496d71 60//\r
e8a47801 61#define FFS_ATTRIB_LARGE_FILE 0x01\r
e921f58d 62#define FFS_ATTRIB_DATA_ALIGNMENT2 0x02\r
30fdf114
LG
63#define FFS_ATTRIB_FIXED 0x04\r
64#define FFS_ATTRIB_DATA_ALIGNMENT 0x38\r
65#define FFS_ATTRIB_CHECKSUM 0x40\r
66//\r
52302d4d 67// FFS_FIXED_CHECKSUM is the checksum value used when the\r
30fdf114 68// FFS_ATTRIB_CHECKSUM attribute bit is clear\r
30fdf114 69//\r
52302d4d 70#define FFS_FIXED_CHECKSUM 0xAA\r
30fdf114 71\r
f7496d71 72//\r
30fdf114 73// FFS File State Bits.\r
f7496d71 74//\r
30fdf114
LG
75#define EFI_FILE_HEADER_CONSTRUCTION 0x01\r
76#define EFI_FILE_HEADER_VALID 0x02\r
77#define EFI_FILE_DATA_VALID 0x04\r
78#define EFI_FILE_MARKED_FOR_UPDATE 0x08\r
79#define EFI_FILE_DELETED 0x10\r
80#define EFI_FILE_HEADER_INVALID 0x20\r
81\r
82#define EFI_FILE_ALL_STATE_BITS (EFI_FILE_HEADER_CONSTRUCTION | \\r
83 EFI_FILE_HEADER_VALID | \\r
84 EFI_FILE_DATA_VALID | \\r
85 EFI_FILE_MARKED_FOR_UPDATE | \\r
86 EFI_FILE_DELETED | \\r
87 EFI_FILE_HEADER_INVALID \\r
88 )\r
89\r
90//\r
f7496d71 91// Each file begins with the header that describe the\r
30fdf114 92// contents and state of the files.\r
f7496d71 93//\r
30fdf114
LG
94typedef struct {\r
95 EFI_GUID Name;\r
96 EFI_FFS_INTEGRITY_CHECK IntegrityCheck;\r
97 EFI_FV_FILETYPE Type;\r
98 EFI_FFS_FILE_ATTRIBUTES Attributes;\r
99 UINT8 Size[3];\r
100 EFI_FFS_FILE_STATE State;\r
101} EFI_FFS_FILE_HEADER;\r
102\r
e8a47801
LG
103typedef struct {\r
104 EFI_GUID Name;\r
105 EFI_FFS_INTEGRITY_CHECK IntegrityCheck;\r
106 EFI_FV_FILETYPE Type;\r
107 EFI_FFS_FILE_ATTRIBUTES Attributes;\r
108 UINT8 Size[3];\r
109 EFI_FFS_FILE_STATE State;\r
6eff5d22 110 UINT64 ExtendedSize;\r
e8a47801
LG
111} EFI_FFS_FILE_HEADER2;\r
112\r
113#define MAX_FFS_SIZE 0x1000000\r
30fdf114
LG
114\r
115typedef UINT8 EFI_SECTION_TYPE;\r
116\r
117//\r
118// Pseudo type. It is\r
119// used as a wild card when retrieving sections. The section\r
120// type EFI_SECTION_ALL matches all section types.\r
121//\r
122#define EFI_SECTION_ALL 0x00\r
123\r
124//\r
125// Encapsulation section Type values\r
126//\r
127#define EFI_SECTION_COMPRESSION 0x01\r
128\r
129#define EFI_SECTION_GUID_DEFINED 0x02\r
130\r
131//\r
132// Leaf section Type values\r
133//\r
134#define EFI_SECTION_PE32 0x10\r
135#define EFI_SECTION_PIC 0x11\r
136#define EFI_SECTION_TE 0x12\r
137#define EFI_SECTION_DXE_DEPEX 0x13\r
138#define EFI_SECTION_VERSION 0x14\r
139#define EFI_SECTION_USER_INTERFACE 0x15\r
140#define EFI_SECTION_COMPATIBILITY16 0x16\r
141#define EFI_SECTION_FIRMWARE_VOLUME_IMAGE 0x17\r
142#define EFI_SECTION_FREEFORM_SUBTYPE_GUID 0x18\r
143#define EFI_SECTION_RAW 0x19\r
144#define EFI_SECTION_PEI_DEPEX 0x1B\r
fd171542 145#define EFI_SECTION_SMM_DEPEX 0x1C\r
30fdf114
LG
146\r
147typedef struct {\r
148 UINT8 Size[3];\r
149 EFI_SECTION_TYPE Type;\r
150} EFI_COMMON_SECTION_HEADER;\r
151\r
e8a47801
LG
152typedef struct {\r
153 UINT8 Size[3];\r
154 EFI_SECTION_TYPE Type;\r
155 UINT32 ExtendedSize;\r
156} EFI_COMMON_SECTION_HEADER2;\r
157\r
158#define MAX_SECTION_SIZE 0x1000000\r
159\r
30fdf114 160//\r
f7496d71 161// Leaf section type that contains an\r
30fdf114 162// IA-32 16-bit executable image.\r
f7496d71 163//\r
30fdf114 164typedef EFI_COMMON_SECTION_HEADER EFI_COMPATIBILITY16_SECTION;\r
e8a47801 165typedef EFI_COMMON_SECTION_HEADER2 EFI_COMPATIBILITY16_SECTION2;\r
30fdf114
LG
166\r
167//\r
168// CompressionType of EFI_COMPRESSION_SECTION.\r
f7496d71 169//\r
30fdf114
LG
170#define EFI_NOT_COMPRESSED 0x00\r
171#define EFI_STANDARD_COMPRESSION 0x01\r
172//\r
f7496d71 173// An encapsulation section type in which the\r
30fdf114 174// section data is compressed.\r
f7496d71 175//\r
30fdf114
LG
176typedef struct {\r
177 EFI_COMMON_SECTION_HEADER CommonHeader;\r
178 UINT32 UncompressedLength;\r
179 UINT8 CompressionType;\r
180} EFI_COMPRESSION_SECTION;\r
181\r
e8a47801
LG
182typedef struct {\r
183 EFI_COMMON_SECTION_HEADER2 CommonHeader;\r
184 UINT32 UncompressedLength;\r
185 UINT8 CompressionType;\r
186} EFI_COMPRESSION_SECTION2;\r
187\r
30fdf114
LG
188//\r
189// Leaf section which could be used to determine the dispatch order of DXEs.\r
f7496d71 190//\r
30fdf114 191typedef EFI_COMMON_SECTION_HEADER EFI_DXE_DEPEX_SECTION;\r
e8a47801 192typedef EFI_COMMON_SECTION_HEADER2 EFI_DXE_DEPEX_SECTION2;\r
30fdf114
LG
193\r
194//\r
195// Leaf section witch contains a PI FV.\r
f7496d71 196//\r
30fdf114 197typedef EFI_COMMON_SECTION_HEADER EFI_FIRMWARE_VOLUME_IMAGE_SECTION;\r
e8a47801 198typedef EFI_COMMON_SECTION_HEADER2 EFI_FIRMWARE_VOLUME_IMAGE_SECTION2;\r
30fdf114
LG
199\r
200//\r
201// Leaf section which contains a single GUID.\r
f7496d71 202//\r
30fdf114
LG
203typedef struct {\r
204 EFI_COMMON_SECTION_HEADER CommonHeader;\r
205 EFI_GUID SubTypeGuid;\r
206} EFI_FREEFORM_SUBTYPE_GUID_SECTION;\r
207\r
e8a47801
LG
208typedef struct {\r
209 EFI_COMMON_SECTION_HEADER2 CommonHeader;\r
210 EFI_GUID SubTypeGuid;\r
211} EFI_FREEFORM_SUBTYPE_GUID_SECTION2;\r
212\r
30fdf114
LG
213//\r
214// Attributes of EFI_GUID_DEFINED_SECTION\r
f7496d71 215//\r
30fdf114
LG
216#define EFI_GUIDED_SECTION_PROCESSING_REQUIRED 0x01\r
217#define EFI_GUIDED_SECTION_AUTH_STATUS_VALID 0x02\r
218//\r
219// Leaf section which is encapsulation defined by specific GUID\r
f7496d71 220//\r
30fdf114
LG
221typedef struct {\r
222 EFI_COMMON_SECTION_HEADER CommonHeader;\r
223 EFI_GUID SectionDefinitionGuid;\r
224 UINT16 DataOffset;\r
225 UINT16 Attributes;\r
226} EFI_GUID_DEFINED_SECTION;\r
227\r
e8a47801
LG
228typedef struct {\r
229 EFI_COMMON_SECTION_HEADER2 CommonHeader;\r
230 EFI_GUID SectionDefinitionGuid;\r
231 UINT16 DataOffset;\r
232 UINT16 Attributes;\r
233} EFI_GUID_DEFINED_SECTION2;\r
234\r
30fdf114
LG
235//\r
236// Leaf section which contains PE32+ image.\r
f7496d71 237//\r
30fdf114 238typedef EFI_COMMON_SECTION_HEADER EFI_PE32_SECTION;\r
e8a47801 239typedef EFI_COMMON_SECTION_HEADER2 EFI_PE32_SECTION2;\r
30fdf114
LG
240\r
241//\r
242// Leaf section which contains PIC image.\r
f7496d71 243//\r
30fdf114 244typedef EFI_COMMON_SECTION_HEADER EFI_PIC_SECTION;\r
e8a47801 245typedef EFI_COMMON_SECTION_HEADER2 EFI_PIC_SECTION2;\r
30fdf114
LG
246\r
247//\r
248// Leaf section which used to determine the dispatch order of PEIMs.\r
f7496d71 249//\r
30fdf114 250typedef EFI_COMMON_SECTION_HEADER EFI_PEI_DEPEX_SECTION;\r
e8a47801 251typedef EFI_COMMON_SECTION_HEADER2 EFI_PEI_DEPEX_SECTION2;\r
30fdf114
LG
252\r
253//\r
254// Leaf section which constains the position-independent-code image.\r
f7496d71 255//\r
30fdf114 256typedef EFI_COMMON_SECTION_HEADER EFI_TE_SECTION;\r
e8a47801 257typedef EFI_COMMON_SECTION_HEADER2 EFI_TE_SECTION2;\r
30fdf114
LG
258\r
259//\r
260// Leaf section which contains an array of zero or more bytes.\r
f7496d71 261//\r
30fdf114 262typedef EFI_COMMON_SECTION_HEADER EFI_RAW_SECTION;\r
e8a47801 263typedef EFI_COMMON_SECTION_HEADER2 EFI_RAW_SECTION2;\r
30fdf114
LG
264\r
265//\r
f7496d71 266// Leaf section which contains a unicode string that\r
30fdf114 267// is human readable file name.\r
f7496d71 268//\r
30fdf114
LG
269typedef struct {\r
270 EFI_COMMON_SECTION_HEADER CommonHeader;\r
271\r
272 //\r
273 // Array of unicode string.\r
f7496d71 274 //\r
30fdf114
LG
275 CHAR16 FileNameString[1];\r
276} EFI_USER_INTERFACE_SECTION;\r
277\r
e8a47801
LG
278typedef struct {\r
279 EFI_COMMON_SECTION_HEADER2 CommonHeader;\r
280\r
281 //\r
282 // Array of unicode string.\r
f7496d71 283 //\r
e8a47801
LG
284 CHAR16 FileNameString[1];\r
285} EFI_USER_INTERFACE_SECTION2;\r
30fdf114
LG
286\r
287//\r
288// Leaf section which contains a numeric build number and\r
f7496d71
LG
289// an optional unicode string that represent the file revision.\r
290//\r
30fdf114
LG
291typedef struct {\r
292 EFI_COMMON_SECTION_HEADER CommonHeader;\r
293 UINT16 BuildNumber;\r
294 CHAR16 VersionString[1];\r
295} EFI_VERSION_SECTION;\r
296\r
e8a47801
LG
297typedef struct {\r
298 EFI_COMMON_SECTION_HEADER2 CommonHeader;\r
299 UINT16 BuildNumber;\r
300 CHAR16 VersionString[1];\r
301} EFI_VERSION_SECTION2;\r
30fdf114 302\r
d3b3ee09
LE
303//\r
304// The argument passed as the SectionHeaderPtr parameter to the SECTION_SIZE()\r
305// function-like macro below must not have side effects: SectionHeaderPtr is\r
306// evaluated multiple times.\r
307//\r
308#define SECTION_SIZE(SectionHeaderPtr) ((UINT32) ( \\r
309 (((EFI_COMMON_SECTION_HEADER *) (SectionHeaderPtr))->Size[0] ) | \\r
310 (((EFI_COMMON_SECTION_HEADER *) (SectionHeaderPtr))->Size[1] << 8) | \\r
311 (((EFI_COMMON_SECTION_HEADER *) (SectionHeaderPtr))->Size[2] << 16)))\r
30fdf114
LG
312\r
313#pragma pack()\r
314\r
315typedef union {\r
316 EFI_COMMON_SECTION_HEADER *CommonHeader;\r
317 EFI_COMPRESSION_SECTION *CompressionSection;\r
318 EFI_GUID_DEFINED_SECTION *GuidDefinedSection;\r
319 EFI_PE32_SECTION *Pe32Section;\r
320 EFI_PIC_SECTION *PicSection;\r
321 EFI_TE_SECTION *TeSection;\r
322 EFI_PEI_DEPEX_SECTION *PeimHeaderSection;\r
323 EFI_DXE_DEPEX_SECTION *DependencySection;\r
324 EFI_VERSION_SECTION *VersionSection;\r
325 EFI_USER_INTERFACE_SECTION *UISection;\r
326 EFI_COMPATIBILITY16_SECTION *Code16Section;\r
327 EFI_FIRMWARE_VOLUME_IMAGE_SECTION *FVImageSection;\r
328 EFI_FREEFORM_SUBTYPE_GUID_SECTION *FreeformSubtypeSection;\r
329 EFI_RAW_SECTION *RawSection;\r
e8a47801
LG
330 //\r
331 // For section whose size is equal or greater than 0x1000000\r
332 //\r
333 EFI_COMMON_SECTION_HEADER2 *CommonHeader2;\r
334 EFI_COMPRESSION_SECTION2 *CompressionSection2;\r
335 EFI_GUID_DEFINED_SECTION2 *GuidDefinedSection2;\r
336 EFI_PE32_SECTION2 *Pe32Section2;\r
337 EFI_PIC_SECTION2 *PicSection2;\r
338 EFI_TE_SECTION2 *TeSection2;\r
339 EFI_PEI_DEPEX_SECTION2 *PeimHeaderSection2;\r
340 EFI_DXE_DEPEX_SECTION2 *DependencySection2;\r
341 EFI_VERSION_SECTION2 *VersionSection2;\r
342 EFI_USER_INTERFACE_SECTION2 *UISection2;\r
343 EFI_COMPATIBILITY16_SECTION2 *Code16Section2;\r
344 EFI_FIRMWARE_VOLUME_IMAGE_SECTION2 *FVImageSection2;\r
345 EFI_FREEFORM_SUBTYPE_GUID_SECTION2 *FreeformSubtypeSection2;\r
346 EFI_RAW_SECTION2 *RawSection2;\r
30fdf114
LG
347} EFI_FILE_SECTION_POINTER;\r
348\r
349#endif\r
350\r