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