]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/C/GenFv/GenFvInternalLib.h
Sync tool code to BuildTools project r1739.
[mirror_edk2.git] / BaseTools / Source / C / GenFv / GenFvInternalLib.h
1 /** @file
2
3 Copyright (c) 2004 - 2008, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12 Module Name:
13
14 GenFvInternalLib.h
15
16 Abstract:
17
18 This file contains describes the public interfaces to the GenFvImage Library.
19 The basic purpose of the library is to create Firmware Volume images.
20
21 **/
22
23 #ifndef _EFI_GEN_FV_INTERNAL_LIB_H
24 #define _EFI_GEN_FV_INTERNAL_LIB_H
25
26 //
27 // Include files
28 //
29 #include <stdlib.h>
30
31 #include <Common/UefiBaseTypes.h>
32 #include <Common/UefiCapsule.h>
33
34 #include <Common/PiFirmwareFile.h>
35 #include <Common/PiFirmwareVolume.h>
36 #include <Guid/PiFirmwareFileSystem.h>
37 #include <IndustryStandard/PeImage.h>
38
39 #include "CommonLib.h"
40 #include "ParseInf.h"
41 #include "EfiUtilityMsgs.h"
42
43 //
44 // Different file separater for Linux and Windows
45 //
46 #define FILE_SEP_CHAR '/'
47
48 //
49 // The maximum number of Pad file guid entries.
50 //
51 #define MAX_NUMBER_OF_PAD_FILE_GUIDS 1024
52
53 //
54 // The maximum number of block map entries supported by the library
55 //
56 #define MAX_NUMBER_OF_FV_BLOCKS 100
57
58 //
59 // The maximum number of files in the FV supported by the library
60 //
61 #define MAX_NUMBER_OF_FILES_IN_FV 1000
62 #define MAX_NUMBER_OF_FILES_IN_CAP 1000
63 #define EFI_FFS_FILE_HEADER_ALIGNMENT 8
64 //
65 // INF file strings
66 //
67 #define OPTIONS_SECTION_STRING "[options]"
68 #define ATTRIBUTES_SECTION_STRING "[attributes]"
69 #define FILES_SECTION_STRING "[files]"
70
71 //
72 // Options section
73 //
74 #define EFI_FV_BASE_ADDRESS_STRING "EFI_BASE_ADDRESS"
75 #define EFI_FV_FILE_NAME_STRING "EFI_FILE_NAME"
76 #define EFI_NUM_BLOCKS_STRING "EFI_NUM_BLOCKS"
77 #define EFI_BLOCK_SIZE_STRING "EFI_BLOCK_SIZE"
78 #define EFI_GUID_STRING "EFI_GUID"
79 #define EFI_FV_FILESYSTEMGUID_STRING "EFI_FV_GUID"
80 #define EFI_FV_NAMEGUID_STRING "EFI_FVNAME_GUID"
81 #define EFI_CAPSULE_GUID_STRING "EFI_CAPSULE_GUID"
82 #define EFI_CAPSULE_HEADER_SIZE_STRING "EFI_CAPSULE_HEADER_SIZE"
83 #define EFI_CAPSULE_FLAGS_STRING "EFI_CAPSULE_FLAGS"
84 #define EFI_CAPSULE_VERSION_STRING "EFI_CAPSULE_VERSION"
85 #define EFI_FV_BOOT_DRIVER_BASE_ADDRESS_STRING "EFI_BOOT_DRIVER_BASE_ADDRESS"
86 #define EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING "EFI_RUNTIME_DRIVER_BASE_ADDRESS"
87
88 #define EFI_FV_TOTAL_SIZE_STRING "EFI_FV_TOTAL_SIZE"
89 #define EFI_FV_TAKEN_SIZE_STRING "EFI_FV_TAKEN_SIZE"
90 #define EFI_FV_SPACE_SIZE_STRING "EFI_FV_SPACE_SIZE"
91
92 //
93 // Attributes section
94 //
95 #define EFI_FVB2_READ_DISABLED_CAP_STRING "EFI_READ_DISABLED_CAP"
96 #define EFI_FVB2_READ_ENABLED_CAP_STRING "EFI_READ_ENABLED_CAP"
97 #define EFI_FVB2_READ_STATUS_STRING "EFI_READ_STATUS"
98
99 #define EFI_FVB2_WRITE_DISABLED_CAP_STRING "EFI_WRITE_DISABLED_CAP"
100 #define EFI_FVB2_WRITE_ENABLED_CAP_STRING "EFI_WRITE_ENABLED_CAP"
101 #define EFI_FVB2_WRITE_STATUS_STRING "EFI_WRITE_STATUS"
102
103 #define EFI_FVB2_LOCK_CAP_STRING "EFI_LOCK_CAP"
104 #define EFI_FVB2_LOCK_STATUS_STRING "EFI_LOCK_STATUS"
105
106 #define EFI_FVB2_STICKY_WRITE_STRING "EFI_STICKY_WRITE"
107 #define EFI_FVB2_MEMORY_MAPPED_STRING "EFI_MEMORY_MAPPED"
108 #define EFI_FVB2_ERASE_POLARITY_STRING "EFI_ERASE_POLARITY"
109
110 #define EFI_FVB2_READ_LOCK_CAP_STRING "EFI_READ_LOCK_CAP"
111 #define EFI_FVB2_READ_LOCK_STATUS_STRING "EFI_READ_LOCK_STATUS"
112 #define EFI_FVB2_WRITE_LOCK_CAP_STRING "EFI_WRITE_LOCK_CAP"
113 #define EFI_FVB2_WRITE_LOCK_STATUS_STRING "EFI_WRITE_LOCK_STATUS"
114
115 #define EFI_FVB2_ALIGNMENT_1_STRING "EFI_FVB2_ALIGNMENT_1"
116 #define EFI_FVB2_ALIGNMENT_2_STRING "EFI_FVB2_ALIGNMENT_2"
117 #define EFI_FVB2_ALIGNMENT_4_STRING "EFI_FVB2_ALIGNMENT_4"
118 #define EFI_FVB2_ALIGNMENT_8_STRING "EFI_FVB2_ALIGNMENT_8"
119 #define EFI_FVB2_ALIGNMENT_16_STRING "EFI_FVB2_ALIGNMENT_16"
120 #define EFI_FVB2_ALIGNMENT_32_STRING "EFI_FVB2_ALIGNMENT_32"
121 #define EFI_FVB2_ALIGNMENT_64_STRING "EFI_FVB2_ALIGNMENT_64"
122 #define EFI_FVB2_ALIGNMENT_128_STRING "EFI_FVB2_ALIGNMENT_128"
123 #define EFI_FVB2_ALIGNMENT_256_STRING "EFI_FVB2_ALIGNMENT_256"
124 #define EFI_FVB2_ALIGNMENT_512_STRING "EFI_FVB2_ALIGNMENT_512"
125 #define EFI_FVB2_ALIGNMENT_1K_STRING "EFI_FVB2_ALIGNMENT_1K"
126 #define EFI_FVB2_ALIGNMENT_2K_STRING "EFI_FVB2_ALIGNMENT_2K"
127 #define EFI_FVB2_ALIGNMENT_4K_STRING "EFI_FVB2_ALIGNMENT_4K"
128 #define EFI_FVB2_ALIGNMENT_8K_STRING "EFI_FVB2_ALIGNMENT_8K"
129 #define EFI_FVB2_ALIGNMENT_16K_STRING "EFI_FVB2_ALIGNMENT_16K"
130 #define EFI_FVB2_ALIGNMENT_32K_STRING "EFI_FVB2_ALIGNMENT_32K"
131 #define EFI_FVB2_ALIGNMENT_64K_STRING "EFI_FVB2_ALIGNMENT_64K"
132 #define EFI_FVB2_ALIGNMENT_128K_STRING "EFI_FVB2_ALIGNMENT_128K"
133 #define EFI_FVB2_ALIGNMENT_256K_STRING "EFI_FVB2_ALIGNMENT_256K"
134 #define EFI_FVB2_ALIGNMNET_512K_STRING "EFI_FVB2_ALIGNMENT_512K"
135 #define EFI_FVB2_ALIGNMENT_1M_STRING "EFI_FVB2_ALIGNMENT_1M"
136 #define EFI_FVB2_ALIGNMENT_2M_STRING "EFI_FVB2_ALIGNMENT_2M"
137 #define EFI_FVB2_ALIGNMENT_4M_STRING "EFI_FVB2_ALIGNMENT_4M"
138 #define EFI_FVB2_ALIGNMENT_8M_STRING "EFI_FVB2_ALIGNMENT_8M"
139 #define EFI_FVB2_ALIGNMENT_16M_STRING "EFI_FVB2_ALIGNMENT_16M"
140 #define EFI_FVB2_ALIGNMENT_32M_STRING "EFI_FVB2_ALIGNMENT_32M"
141 #define EFI_FVB2_ALIGNMENT_64M_STRING "EFI_FVB2_ALIGNMENT_64M"
142 #define EFI_FVB2_ALIGNMENT_128M_STRING "EFI_FVB2_ALIGNMENT_128M"
143 #define EFI_FVB2_ALIGNMENT_256M_STRING "EFI_FVB2_ALIGNMENT_256M"
144 #define EFI_FVB2_ALIGNMENT_512M_STRING "EFI_FVB2_ALIGNMENT_512M"
145 #define EFI_FVB2_ALIGNMENT_1G_STRING "EFI_FVB2_ALIGNMENT_1G"
146 #define EFI_FVB2_ALIGNMENT_2G_STRING "EFI_FVB2_ALIGNMENT_2G"
147
148 //
149 // File sections
150 //
151 #define EFI_FILE_NAME_STRING "EFI_FILE_NAME"
152
153 #define ONE_STRING "1"
154 #define ZERO_STRING "0"
155 #define TRUE_STRING "TRUE"
156 #define FALSE_STRING "FALSE"
157 #define NULL_STRING "NULL"
158
159 //
160 //
161 //
162 #define EFI_FV_EXT_HEADER_FILE_NAME "EFI_FV_EXT_HEADER_FILE_NAME"
163
164
165 //
166 // VTF (Firmware Volume Top File) signatures
167 //
168 #define IA32_X64_VTF_SIGNATURE_OFFSET 0x14
169 #define IA32_X64_VTF0_SIGNATURE EFI_SIGNATURE_32('V','T','F',0)
170
171 //
172 // Defines to calculate the offset for PEI CORE entry points
173 //
174 #define IA32_PEI_CORE_ENTRY_OFFSET 0x20
175
176 //
177 // Defines to calculate the offset for IA32 SEC CORE entry point
178 //
179 #define IA32_SEC_CORE_ENTRY_OFFSET 0xD
180
181 //
182 // Defines to calculate the FIT table
183 //
184 #define IPF_FIT_ADDRESS_OFFSET 0x20
185
186 //
187 // Defines to calculate the offset for SALE_ENTRY
188 //
189 #define IPF_SALE_ENTRY_ADDRESS_OFFSET 0x18
190
191 //
192 // Symbol file definitions, current max size if 512K
193 //
194 #define SYMBOL_FILE_SIZE 0x80000
195
196 #define FV_IMAGES_TOP_ADDRESS 0x100000000ULL
197
198 //
199 // Following definition is used for FIT in IPF
200 //
201 #define COMP_TYPE_FIT_PEICORE 0x10
202 #define COMP_TYPE_FIT_UNUSED 0x7F
203
204 #define FIT_TYPE_MASK 0x7F
205 #define CHECKSUM_BIT_MASK 0x80
206
207 //
208 // Rebase File type
209 //
210 #define REBASE_XIP_FILE 0x1
211 #define REBASE_BOOTTIME_FILE 0x2
212 #define REBASE_RUNTIME_FILE 0x4
213
214 //
215 // Private data types
216 //
217 //
218 // Component information
219 //
220 typedef struct {
221 UINTN Size;
222 CHAR8 ComponentName[_MAX_PATH];
223 } COMPONENT_INFO;
224
225 //
226 // FV and capsule information holder
227 //
228 typedef struct {
229 BOOLEAN BaseAddressSet;
230 EFI_PHYSICAL_ADDRESS BaseAddress;
231 EFI_PHYSICAL_ADDRESS BootBaseAddress;
232 EFI_PHYSICAL_ADDRESS RuntimeBaseAddress;
233 EFI_GUID FvFileSystemGuid;
234 BOOLEAN FvFileSystemGuidSet;
235 EFI_GUID FvNameGuid;
236 BOOLEAN FvNameGuidSet;
237 CHAR8 FvExtHeaderFile[_MAX_PATH];
238 UINTN Size;
239 EFI_FVB_ATTRIBUTES FvAttributes;
240 CHAR8 FvName[_MAX_PATH];
241 EFI_FV_BLOCK_MAP_ENTRY FvBlocks[MAX_NUMBER_OF_FV_BLOCKS];
242 CHAR8 FvFiles[MAX_NUMBER_OF_FILES_IN_FV][_MAX_PATH];
243 UINT32 SizeofFvFiles[MAX_NUMBER_OF_FILES_IN_FV];
244 BOOLEAN IsPiFvImage;
245 } FV_INFO;
246
247 typedef struct {
248 EFI_GUID CapGuid;
249 UINT32 HeaderSize;
250 UINT32 Flags;
251 CHAR8 CapName[_MAX_PATH];
252 CHAR8 CapFiles[MAX_NUMBER_OF_FILES_IN_CAP][_MAX_PATH];
253 } CAP_INFO;
254
255 #pragma pack(1)
256
257 typedef struct {
258 UINT64 CompAddress;
259 UINT32 CompSize;
260 UINT16 CompVersion;
261 UINT8 CvAndType;
262 UINT8 CheckSum;
263 } FIT_TABLE;
264
265 #pragma pack()
266
267 #define FV_DEFAULT_ATTRIBUTE 0x0004FEFF
268 extern FV_INFO mFvDataInfo;
269 extern CAP_INFO mCapDataInfo;
270 extern EFI_GUID mEfiFirmwareFileSystem2Guid;
271 extern UINT32 mFvTotalSize;
272 extern UINT32 mFvTakenSize;
273 //
274 // Local function prototypes
275 //
276 EFI_STATUS
277 ParseFvInf (
278 IN MEMORY_FILE *InfFile,
279 OUT FV_INFO *FvInfo
280 )
281 ;
282
283 EFI_STATUS
284 UpdatePeiCoreEntryInFit (
285 IN FIT_TABLE *FitTablePtr,
286 IN UINT64 PeiCorePhysicalAddress
287 )
288 /*++
289
290 Routine Description:
291
292 This function is used to update the Pei Core address in FIT, this can be used by Sec core to pass control from
293 Sec to Pei Core
294
295 Arguments:
296
297 FitTablePtr - The pointer of FIT_TABLE.
298 PeiCorePhysicalAddress - The address of Pei Core entry.
299
300 Returns:
301
302 EFI_SUCCESS - The PEI_CORE FIT entry was updated successfully.
303 EFI_NOT_FOUND - Not found the PEI_CORE FIT entry.
304
305 --*/
306 ;
307
308 VOID
309 UpdateFitCheckSum (
310 IN FIT_TABLE *FitTablePtr
311 )
312 /*++
313
314 Routine Description:
315
316 This function is used to update the checksum for FIT.
317
318
319 Arguments:
320
321 FitTablePtr - The pointer of FIT_TABLE.
322
323 Returns:
324
325 None.
326
327 --*/
328 ;
329
330 EFI_STATUS
331 GetPe32Info (
332 IN UINT8 *Pe32,
333 OUT UINT32 *EntryPoint,
334 OUT UINT32 *BaseOfCode,
335 OUT UINT16 *MachineType
336 );
337
338 EFI_STATUS
339 ParseCapInf (
340 IN MEMORY_FILE *InfFile,
341 OUT CAP_INFO *CapInfo
342 );
343
344 EFI_STATUS
345 FindApResetVectorPosition (
346 IN MEMORY_FILE *FvImage,
347 OUT UINT8 **Pointer
348 );
349
350 EFI_STATUS
351 CalculateFvSize (
352 FV_INFO *FvInfoPtr
353 );
354
355 EFI_STATUS
356 FfsRebase (
357 IN OUT FV_INFO *FvInfo,
358 IN CHAR8 *FileName,
359 IN OUT EFI_FFS_FILE_HEADER *FfsFile,
360 IN UINTN XipOffset,
361 IN FILE *FvMapFile
362 );
363
364 //
365 // Exported function prototypes
366 //
367 EFI_STATUS
368 GenerateCapImage (
369 IN CHAR8 *InfFileImage,
370 IN UINTN InfFileSize,
371 IN CHAR8 *CapFileName
372 )
373 /*++
374
375 Routine Description:
376
377 This is the main function which will be called from application to
378 generate UEFI Capsule image.
379
380 Arguments:
381
382 InfFileImage Buffer containing the INF file contents.
383 InfFileSize Size of the contents of the InfFileImage buffer.
384 CapFileName Requested name for the Cap file.
385
386 Returns:
387
388 EFI_SUCCESS Function completed successfully.
389 EFI_OUT_OF_RESOURCES Could not allocate required resources.
390 EFI_ABORTED Error encountered.
391 EFI_INVALID_PARAMETER A required parameter was NULL.
392
393 --*/
394 ;
395
396 EFI_STATUS
397 GenerateFvImage (
398 IN CHAR8 *InfFileImage,
399 IN UINTN InfFileSize,
400 IN CHAR8 *FvFileName,
401 IN CHAR8 *MapFileName
402 )
403 /*++
404
405 Routine Description:
406
407 This is the main function which will be called from application to
408 generate Firmware Image conforms to PI spec.
409
410 Arguments:
411
412 InfFileImage Buffer containing the INF file contents.
413 InfFileSize Size of the contents of the InfFileImage buffer.
414 FvFileName Requested name for the FV file.
415 MapFileName Fv map file to log fv driver information.
416
417 Returns:
418
419 EFI_SUCCESS Function completed successfully.
420 EFI_OUT_OF_RESOURCES Could not allocate required resources.
421 EFI_ABORTED Error encountered.
422 EFI_INVALID_PARAMETER A required parameter was NULL.
423
424 --*/
425 ;
426
427 #endif