]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/FMMT/FirmwareModuleManagement.h
Revert "BaseTools: fix FCE build when edksetup not executed"
[mirror_edk2.git] / BaseTools / Source / C / FMMT / FirmwareModuleManagement.h
CommitLineData
080981d7
SZ
1/** @file\r
2\r
3 Structures and functions declaration.\r
4\r
5 Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>\r
6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
7\r
8**/\r
9\r
10#ifndef _BIN_FILE_MANAGER_\r
11#define _BIN_FILE_MANAGER_\r
12\r
13#include <stdio.h>\r
14#include <stdlib.h>\r
15#include <string.h>\r
16#ifdef __GNUC__\r
17#include <unistd.h>\r
18#else\r
19#include <io.h>\r
20#include <direct.h>\r
21#endif\r
22#include <FvLib.h>\r
23#include <Common/UefiBaseTypes.h>\r
24#include <Common/PiFirmwareVolume.h>\r
25#include <Common/PiFirmwareFile.h>\r
26#include <Protocol/GuidedSectionExtraction.h>\r
27\r
28#include "CommonLib.h"\r
29#include "EfiUtilityMsgs.h"\r
30#include "ParseInf.h"\r
31#include "ParseGuidedSectionTools.h"\r
32#include "StringFuncs.h"\r
33#include "Compress.h"\r
34#include "Decompress.h"\r
35\r
36#ifndef _MAX_PATH\r
37#define _MAX_PATH 500\r
38#endif\r
39\r
40#if defined(_MSC_VER) && _MSC_VER < 1900\r
41#define snprintf _snprintf\r
42#endif\r
43\r
44#ifdef __GNUC__\r
45#define OS_SEP '/'\r
46#define OS_SEP_STR "/"\r
47#define COPY_STR "cp \"%s\" \"%s\" > /dev/null"\r
48#define RMDIR_STR "rm -r \"%s\" > /dev/null"\r
49#define DEL_STR "rm \"%s\" > /dev/null"\r
50#else\r
51#define OS_SEP '\\'\r
52#define OS_SEP_STR "\\"\r
53#define COPY_STR "copy \"%s\" \"%s\" > NUL"\r
54#define RMDIR_STR "rmdir /S /Q \"%s\" > NUL"\r
55#define DEL_STR "del \"%s\" > NUL"\r
56#endif\r
57\r
58#define UTILITY_NAME "Firmware Module Management Tool(FMMT)"\r
59#define UTILITY_SHORT_NAME "FMMT"\r
60#define UTILITY_MAJOR_VERSION 0\r
61#define UTILITY_MINOR_VERSION 23\r
62#define MAX_BASENAME_LEN 60 // not good to HardCode, but let's be reasonable\r
63#define EFI_SECTION_ERROR EFIERR (100)\r
64//\r
65// The maximum number of Pad file guid entries.\r
66//\r
67#define MAX_NUMBER_OF_PAD_FILE_GUIDS 1024\r
68\r
69//\r
70// The maximum number of block map entries supported by the library\r
71//\r
72#define MAX_NUMBER_OF_FV_BLOCKS 100\r
73\r
74\r
75//\r
76// The maximum number of sections in an FFS file.\r
77//\r
78#define MAX_NUMBER_OF_SECTION_IN_FFS 100\r
79\r
80//\r
81// The maximum number of files in the FV supported by the library\r
82//\r
83#define MAX_NUMBER_OF_FILES_IN_FV 1000\r
84#define MAX_NUMBER_OF_FILES_IN_CAP 1000\r
85\r
86\r
87\r
88///\r
89/// If present, this must be the first and only opcode,\r
90/// EFI_DEP_BEFORE is only used by DXE driver.\r
91///\r
92#define EFI_DEP_BEFORE 0x00\r
93\r
94///\r
95/// If present, this must be the first and only opcode,\r
96/// EFI_DEP_AFTER is only used by DXE driver.\r
97///\r
98#define EFI_DEP_AFTER 0x01\r
99\r
100#define EFI_DEP_PUSH 0x02\r
101#define EFI_DEP_AND 0x03\r
102#define EFI_DEP_OR 0x04\r
103#define EFI_DEP_NOT 0x05\r
104#define EFI_DEP_TRUE 0x06\r
105#define EFI_DEP_FALSE 0x07\r
106#define EFI_DEP_END 0x08\r
107\r
108\r
109///\r
110/// If present, this must be the first opcode,\r
111/// EFI_DEP_SOR is only used by DXE driver.\r
112///\r
113#define EFI_DEP_SOR 0x09\r
114\r
115//\r
116// INF file strings\r
117//\r
118#define OPTIONS_SECTION_STRING "[options]"\r
119#define ATTRIBUTES_SECTION_STRING "[attributes]"\r
120#define FILES_SECTION_STRING "[files]"\r
121#define FV_BASE_ADDRESS_STRING "[FV_BASE_ADDRESS]"\r
122\r
123//\r
124// Options section\r
125//\r
126#define EFI_FV_BASE_ADDRESS_STRING "EFI_BASE_ADDRESS"\r
127#define EFI_FV_FILE_NAME_STRING "EFI_FILE_NAME"\r
128#define EFI_NUM_BLOCKS_STRING "EFI_NUM_BLOCKS"\r
129#define EFI_BLOCK_SIZE_STRING "EFI_BLOCK_SIZE"\r
130#define EFI_GUID_STRING "EFI_GUID"\r
131#define EFI_FV_FILESYSTEMGUID_STRING "EFI_FV_GUID"\r
132#define EFI_FV_NAMEGUID_STRING "EFI_FVNAME_GUID"\r
133#define EFI_CAPSULE_GUID_STRING "EFI_CAPSULE_GUID"\r
134#define EFI_CAPSULE_HEADER_SIZE_STRING "EFI_CAPSULE_HEADER_SIZE"\r
135#define EFI_CAPSULE_FLAGS_STRING "EFI_CAPSULE_FLAGS"\r
136#define EFI_CAPSULE_VERSION_STRING "EFI_CAPSULE_VERSION"\r
137\r
138#define EFI_FV_TOTAL_SIZE_STRING "EFI_FV_TOTAL_SIZE"\r
139#define EFI_FV_TAKEN_SIZE_STRING "EFI_FV_TAKEN_SIZE"\r
140#define EFI_FV_SPACE_SIZE_STRING "EFI_FV_SPACE_SIZE"\r
141\r
142\r
143typedef UINT32 FMMT_ENCAP_TYPE;\r
144\r
145#define MAX_LEVEL_IN_FV_FILE 32\r
146\r
147//\r
148// Types of FMMT_ENCAP_TREENODE_TYPE\r
149//\r
150#define FMMT_ENCAP_TREE_FV 0x1\r
151#define FMMT_ENCAP_TREE_FFS 0x2\r
152#define FMMT_ENCAP_TREE_GUIDED_SECTION 0x3\r
153#define FMMT_ENCAP_TREE_COMPRESS_SECTION 0x4\r
154#define FMMT_ENCAP_TREE_FV_SECTION 0x5\r
155\r
156extern EFI_HANDLE mParsedGuidedSectionTools;\r
157\r
158\r
159#define TEMP_DIR_NAME "FmmtTemp"\r
160\r
161//\r
162// Structure to keep a list of GUID-To-BaseNames\r
163//\r
164typedef struct _GUID_TO_BASENAME {\r
165 struct _GUID_TO_BASENAME *Next;\r
166 INT8 Guid[PRINTED_GUID_BUFFER_SIZE];\r
167 INT8 BaseName[MAX_BASENAME_LEN];\r
168} GUID_TO_BASENAME;\r
169\r
170\r
171typedef struct _GUID_SEC_TOOL_ENTRY {\r
172 EFI_GUID Guid;\r
173 CHAR8* Name;\r
174 CHAR8* Path;\r
175 struct _GUID_SEC_TOOL_ENTRY *Next;\r
176} GUID_SEC_TOOL_ENTRY;\r
177\r
178\r
179//\r
180// Private data types\r
181//\r
182//\r
183// Component information\r
184//\r
185typedef struct {\r
186 UINTN Size;\r
187 CHAR8 ComponentName[_MAX_PATH];\r
188} COMPONENT_INFO;\r
189\r
190typedef struct {\r
191 CHAR8 FfsName[_MAX_PATH];\r
192\r
193 //\r
194 // UI Name for this FFS file, if has.\r
195 //\r
196 CHAR16 UiName[_MAX_PATH];\r
197 UINT32 UiNameSize;\r
198 //\r
199 // Total section number in this FFS.\r
200 //\r
201 UINT32 TotalSectionNum;\r
202\r
203 //\r
204 // Describe the position of the FFS file.\r
205 //\r
206 UINT8 Level;\r
207 //\r
208 // If this FFS has no encapsulate section, this flag will set to True.\r
209 //\r
210 BOOLEAN IsLeaf;\r
211 //\r
212 // Section type for each section in FFS.\r
213 //\r
214 EFI_SECTION_TYPE SectionType[MAX_NUMBER_OF_SECTION_IN_FFS];\r
215 //\r
216 // Offset relative to current FV\r
217 //\r
218 UINT32 Offset;\r
219 UINT8 FvLevel;\r
220 EFI_GUID GuidName;\r
221 UINT8 *Depex;\r
222 UINT32 DepexLen;\r
223 BOOLEAN IsHandle;\r
224 BOOLEAN IsFvStart;\r
225 BOOLEAN IsFvEnd;\r
226}FFS_ATTRIBUTES;\r
227\r
228\r
229typedef struct __ENCAP_INFO_DATA{\r
230 //\r
231 // Now Level\r
232 //\r
233 UINT8 Level;\r
234\r
235 //\r
236 // Encapsulate type.\r
237 //\r
238 FMMT_ENCAP_TYPE Type;\r
239\r
240 //\r
241 // Data, if it's FV, should be FV header.\r
242 //\r
243 VOID *Data;\r
244\r
245 //\r
246 //FvId, match FvId with FvGuidName.\r
247 //\r
248 UINT8 FvId;\r
249\r
250 //\r
251 // if FV ExtHeaderOffset not to zero, should also have FvExtHeader information\r
252 //\r
253 EFI_FIRMWARE_VOLUME_EXT_HEADER *FvExtHeader;\r
254\r
255 CHAR16 UiName[_MAX_PATH];\r
256 UINT32 UiNameSize;\r
257 UINT8 *Depex;\r
258 UINT32 DepexLen;\r
259\r
260 //\r
261 // Next node.\r
262 //\r
263 struct __ENCAP_INFO_DATA *NextNode;\r
264\r
265 //\r
266 // Right node.\r
267 //\r
268 struct __ENCAP_INFO_DATA *RightNode;\r
269} ENCAP_INFO_DATA;\r
270\r
271typedef struct _FFS_INFOMATION{\r
272 CHAR8 *FFSName;\r
273 UINT32 InFvId;\r
274 UINT8 ParentLevel;\r
275 BOOLEAN IsFFS;\r
276 CHAR16 UiName[_MAX_PATH];\r
277 UINT32 UiNameSize;\r
278 UINT8 *Depex;\r
279 UINT32 DepexLen;\r
280 BOOLEAN FfsFoundFlag;\r
281 struct _FFS_INFOMATION *Next;\r
282} FFS_INFORMATION;\r
283\r
284//\r
285// FV and capsule information holder\r
286//\r
287typedef struct _FV_INFOMATION{\r
288 EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
289 EFI_FIRMWARE_VOLUME_EXT_HEADER *FvExtHeader;\r
290 UINT32 ImageAddress;\r
291 UINT32 FfsNumbers;\r
292 CHAR8 FvName[_MAX_PATH];\r
293 EFI_FV_BLOCK_MAP_ENTRY FvBlocks[MAX_NUMBER_OF_FV_BLOCKS];\r
294 FFS_ATTRIBUTES FfsAttuibutes[MAX_NUMBER_OF_FILES_IN_FV];\r
295 EFI_FFS_FILE_HEADER2 FfsHeader[MAX_NUMBER_OF_FILES_IN_FV];\r
296 struct _FV_INFOMATION *FvNext;\r
297 ENCAP_INFO_DATA *EncapData;\r
298 UINT8 FvLevel;\r
299 CHAR8 *FvUiName;\r
300 UINT8 MulFvLevel;\r
301 CHAR8 AlignmentStr[16];\r
302 FFS_INFORMATION *ChildFvFFS;\r
303} FV_INFORMATION;\r
304\r
305typedef struct _FIRMWARE_DEVICE {\r
306 ///\r
307 /// Size of FD file\r
308 ///\r
309 UINT32 Size;\r
310 FV_INFORMATION *Fv;\r
311} FIRMWARE_DEVICE;\r
312\r
313typedef struct _FILENode {\r
314 CHAR8 *FileName;\r
315 UINT8 SubLevel;\r
316 struct _FILENode *Next;\r
317} FILENode;\r
318\r
319typedef struct {\r
320 CHAR8 *FvId;\r
321 FILENode *NewFile;\r
322 FILENode *OldFile;\r
323 FIRMWARE_DEVICE *FdData;\r
324 UINT8 FvLevel;\r
325 FV_INFORMATION *FvInFd;\r
326} Data;\r
327\r
328EFI_STATUS\r
329LibFindFvInFd (\r
330 IN FILE *InputFile,\r
331 IN OUT FIRMWARE_DEVICE **FdData\r
332);\r
333\r
334/**\r
335\r
336 TODO: Add function description\r
337\r
338 @param[in] Fv - Firmware Volume to get information from\r
339\r
340 @return EFI_STATUS\r
341\r
342**/\r
343EFI_STATUS\r
344LibGetFvInfo (\r
345 IN VOID *Fv,\r
346 IN OUT FV_INFORMATION *CurrentFv,\r
347 IN CHAR8 *FvName,\r
348 IN UINT8 Level,\r
349 IN ENCAP_INFO_DATA **CurrentFvEncapData,\r
350 IN UINT32 *FfsCount,\r
351 IN OUT UINT8 *FvCount,\r
352 IN BOOLEAN ViewFlag,\r
353 IN BOOLEAN IsChildFv\r
354 );\r
355\r
356/*\r
357 Get size info from FV file.\r
358\r
359 @param[in]\r
360 @param[out]\r
361\r
362 @retval\r
363\r
364*/\r
365EFI_STATUS\r
366LibGetFvSize (\r
367 IN FILE *InputFile,\r
368 OUT UINT32 *FvSize\r
369 );\r
370\r
371 /**\r
372\r
373 This function returns the next larger size that meets the alignment\r
374 requirement specified.\r
375\r
376 @param[in] ActualSize The size.\r
377 @param[in] Alignment The desired alignment.\r
378\r
379 @retval EFI_SUCCESS Function completed successfully.\r
380 @retval EFI_ABORTED The function encountered an error.\r
381\r
382**/\r
383UINT32\r
384GetOccupiedSize (\r
385 IN UINT32 ActualSize,\r
386 IN UINT32 Alignment\r
387 );\r
388\r
389/**\r
390 Converts ASCII characters to Unicode.\r
391 Assumes that the Unicode characters are only these defined in the ASCII set.\r
392\r
393 String - Pointer to string that is written to FILE.\r
394 UniString - Pointer to unicode string\r
395\r
396 The address to the ASCII string - same as AsciiStr.\r
397\r
398**/\r
399VOID\r
400LibAscii2Unicode (\r
401 IN CHAR8 *String,\r
402 OUT CHAR16 *UniString\r
403 );\r
404\r
405/**\r
406 Delete a directory and files in it.\r
407\r
408 @param[in] DirName Name of the directory need to be deleted.\r
409\r
410 @return EFI_INVALID_PARAMETER\r
411 @return EFI_SUCCESS\r
412**/\r
413EFI_STATUS\r
414LibRmDir (\r
415 IN CHAR8* DirName\r
416 );\r
417\r
418/**\r
419 Delete a file.\r
420\r
421 @param[in] FileName Name of the file need to be deleted.\r
422\r
423 @return EFI_INVALID_PARAMETER\r
424 @return EFI_SUCCESS\r
425**/\r
426EFI_STATUS\r
427LibFmmtDeleteFile(\r
428 IN CHAR8 *FileName\r
429);\r
430\r
431\r
432/**\r
433\r
434 Free the whole Fd data structure.\r
435\r
436 @param[in] Fd The pointer point to the Fd data structure.\r
437\r
438**/\r
439VOID\r
440LibFmmtFreeFd (\r
441 FIRMWARE_DEVICE *Fd\r
442);\r
443\r
444\r
445EFI_STATUS\r
446LibEncapNewFvFile(\r
447 IN FV_INFORMATION *FvInFd,\r
448 IN CHAR8 *TemDir,\r
449 IN ENCAP_INFO_DATA *CurrentEncapData,\r
450 IN UINT32 Level_Break,\r
451 OUT FFS_INFORMATION **OutputFile\r
452);\r
453\r
454\r
455EFI_STATUS\r
456LibLocateFvViaFvId (\r
457 IN FIRMWARE_DEVICE *FdData,\r
458 IN CHAR8 *FvId,\r
459 IN OUT FV_INFORMATION **FvInFd\r
460);\r
461\r
462EFI_HANDLE\r
463LibPreDefinedGuidedTools (\r
464 VOID\r
465);\r
466\r
467EFI_STATUS\r
468FvBufGetSize(\r
469IN VOID *Fv,\r
470OUT UINTN *Size\r
471);\r
472\r
473EFI_STATUS\r
474FvBufFindNextFile(\r
475IN VOID *Fv,\r
476IN OUT UINTN *Key,\r
477OUT VOID **File\r
478);\r
479#endif\r