]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/GenFv/GenFv.c
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Source / C / GenFv / GenFv.c
CommitLineData
30fdf114 1/** @file\r
f7496d71 2 This contains all code necessary to build the GenFvImage.exe utility.\r
97fa0ee9 3 This utility relies heavily on the GenFvImage Lib. Definitions for both\r
f7496d71 4 can be found in the Tiano Firmware Volume Generation Utility\r
97fa0ee9 5 Specification, review draft.\r
30fdf114 6\r
f7496d71 7Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
2e351cbe 8SPDX-License-Identifier: BSD-2-Clause-Patent\r
30fdf114 9\r
30fdf114
LG
10**/\r
11\r
12//\r
13// File included in build\r
14//\r
15#include <stdio.h>\r
16#include <string.h>\r
17#include <stdlib.h>\r
18#include "GenFvInternalLib.h"\r
19\r
20//\r
21// Utility Name\r
22//\r
23#define UTILITY_NAME "GenFv"\r
24\r
25//\r
26// Utility version information\r
27//\r
28#define UTILITY_MAJOR_VERSION 0\r
29#define UTILITY_MINOR_VERSION 1\r
30fdf114
LG
30\r
31EFI_GUID mEfiFirmwareFileSystem2Guid = EFI_FIRMWARE_FILE_SYSTEM2_GUID;\r
e8a47801 32EFI_GUID mEfiFirmwareFileSystem3Guid = EFI_FIRMWARE_FILE_SYSTEM3_GUID;\r
30fdf114
LG
33\r
34STATIC\r
f7496d71 35VOID\r
30fdf114
LG
36Version (\r
37 VOID\r
38)\r
39/*++\r
40\r
41Routine Description:\r
42\r
43 Displays the standard utility information to SDTOUT\r
44\r
45Arguments:\r
46\r
47 None\r
48\r
49Returns:\r
50\r
51 None\r
52\r
53--*/\r
54{\r
b36d134f 55 fprintf (stdout, "%s Version %d.%d %s \n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION, __BUILD_VERSION);\r
30fdf114
LG
56}\r
57\r
58STATIC\r
f7496d71 59VOID\r
30fdf114
LG
60Usage (\r
61 VOID\r
62 )\r
63/*++\r
64\r
65Routine Description:\r
66\r
67 Displays the utility usage syntax to STDOUT\r
68\r
69Arguments:\r
70\r
71 None\r
72\r
73Returns:\r
74\r
75 None\r
76\r
77--*/\r
78{\r
79 //\r
80 // Summary usage\r
81 //\r
82 fprintf (stdout, "\nUsage: %s [options]\n\n", UTILITY_NAME);\r
f7496d71 83\r
30fdf114
LG
84 //\r
85 // Copyright declaration\r
f7496d71
LG
86 //\r
87 fprintf (stdout, "Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.\n\n");\r
30fdf114
LG
88\r
89 //\r
90 // Details Option\r
91 //\r
92 fprintf (stdout, "Options:\n");\r
93 fprintf (stdout, " -o FileName, --outputfile FileName\n\\r
94 File is the FvImage or CapImage to be created.\n");\r
95 fprintf (stdout, " -i FileName, --inputfile FileName\n\\r
96 File is the input FV.inf or Cap.inf to specify\n\\r
97 how to construct FvImage or CapImage.\n");\r
98 fprintf (stdout, " -b BlockSize, --blocksize BlockSize\n\\r
99 BlockSize is one HEX or DEC format value\n\\r
100 BlockSize is required by Fv Image.\n");\r
101 fprintf (stdout, " -n NumberBlock, --numberblock NumberBlock\n\\r
102 NumberBlock is one HEX or DEC format value\n\\r
103 NumberBlock is one optional parameter.\n");\r
104 fprintf (stdout, " -f FfsFile, --ffsfile FfsFile\n\\r
105 FfsFile is placed into Fv Image\n\\r
106 multi files can input one by one\n");\r
107 fprintf (stdout, " -s FileTakenSize, --filetakensize FileTakenSize\n\\r
108 FileTakenSize specifies the size of the required\n\\r
109 space that the input file is placed in Fvimage.\n\\r
110 It is specified together with the input file.\n");\r
111 fprintf (stdout, " -r Address, --baseaddr Address\n\\r
112 Address is the rebase start address for drivers that\n\\r
113 run in Flash. It supports DEC or HEX digital format.\n\\r
114 If it is set to zero, no rebase action will be taken\n");\r
79b74a03
LG
115 fprintf (stdout, " -F ForceRebase, --force-rebase ForceRebase\n\\r
116 If value is TRUE, will always take rebase action\n\\r
117 If value is FALSE, will always not take reabse action\n\\r
118 If not specified, will take rebase action if rebase address greater than zero, \n\\r
119 will not take rebase action if rebase address is zero.\n");\r
30fdf114 120 fprintf (stdout, " -a AddressFile, --addrfile AddressFile\n\\r
52302d4d
LG
121 AddressFile is one file used to record the child\n\\r
122 FV base address when current FV base address is set.\n");\r
30fdf114
LG
123 fprintf (stdout, " -m logfile, --map logfile\n\\r
124 Logfile is the output fv map file name. if it is not\n\\r
f7496d71 125 given, the FvName.map will be the default map file name\n");\r
a709adfa 126 fprintf (stdout, " -g Guid, --guid Guid\n\\r
30fdf114
LG
127 GuidValue is one specific capsule guid value\n\\r
128 or fv file system guid value.\n\\r
129 Its format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n");\r
a709adfa 130 fprintf (stdout, " --FvNameGuid Guid Guid is used to specify Fv Name.\n\\r
30fdf114
LG
131 Its format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n");\r
132 fprintf (stdout, " --capflag CapFlag Capsule Reset Flag can be PersistAcrossReset,\n\\r
fd171542 133 or PopulateSystemTable or InitiateReset or not set\n");\r
e8a47801
LG
134 fprintf (stdout, " --capoemflag CapOEMFlag\n\\r
135 Capsule OEM Flag is an integer between 0x0000 and 0xffff\n");\r
30fdf114
LG
136 fprintf (stdout, " --capheadsize HeadSize\n\\r
137 HeadSize is one HEX or DEC format value\n\\r
f7496d71 138 HeadSize is required by Capsule Image.\n");\r
30fdf114
LG
139 fprintf (stdout, " -c, --capsule Create Capsule Image.\n");\r
140 fprintf (stdout, " -p, --dump Dump Capsule Image header.\n");\r
141 fprintf (stdout, " -v, --verbose Turn on verbose output with informational messages.\n");\r
142 fprintf (stdout, " -q, --quiet Disable all messages except key message and fatal error\n");\r
143 fprintf (stdout, " -d, --debug level Enable debug messages, at input debug level.\n");\r
144 fprintf (stdout, " --version Show program's version number and exit.\n");\r
145 fprintf (stdout, " -h, --help Show this help message and exit.\n");\r
146}\r
147\r
148UINT32 mFvTotalSize;\r
149UINT32 mFvTakenSize;\r
150\r
151int\r
152main (\r
153 IN int argc,\r
154 IN char **argv\r
155 )\r
156/*++\r
157\r
158Routine Description:\r
159\r
160 This utility uses GenFvImage.Lib to build a firmware volume image.\r
161\r
162Arguments:\r
163\r
164 FvInfFileName The name of an FV image description file or Capsule Image.\r
165\r
166 Arguments come in pair in any order.\r
f7496d71 167 -I FvInfFileName\r
30fdf114
LG
168\r
169Returns:\r
170\r
171 EFI_SUCCESS No error conditions detected.\r
172 EFI_INVALID_PARAMETER One or more of the input parameters is invalid.\r
f7496d71
LG
173 EFI_OUT_OF_RESOURCES A resource required by the utility was unavailable.\r
174 Most commonly this will be memory allocation\r
30fdf114
LG
175 or file creation.\r
176 EFI_LOAD_ERROR GenFvImage.lib could not be loaded.\r
177 EFI_ABORTED Error executing the GenFvImage lib.\r
178\r
179--*/\r
180{\r
181 EFI_STATUS Status;\r
182 CHAR8 *InfFileName;\r
183 CHAR8 *AddrFileName;\r
184 CHAR8 *MapFileName;\r
185 CHAR8 *InfFileImage;\r
186 UINT32 InfFileSize;\r
187 CHAR8 *OutFileName;\r
30fdf114
LG
188 BOOLEAN CapsuleFlag;\r
189 BOOLEAN DumpCapsule;\r
30fdf114
LG
190 FILE *FpFile;\r
191 EFI_CAPSULE_HEADER *CapsuleHeader;\r
192 UINT64 LogLevel, TempNumber;\r
193 UINT32 Index;\r
194\r
195 InfFileName = NULL;\r
196 AddrFileName = NULL;\r
197 InfFileImage = NULL;\r
198 OutFileName = NULL;\r
199 MapFileName = NULL;\r
200 InfFileSize = 0;\r
201 CapsuleFlag = FALSE;\r
202 DumpCapsule = FALSE;\r
203 FpFile = NULL;\r
204 CapsuleHeader = NULL;\r
205 LogLevel = 0;\r
206 TempNumber = 0;\r
207 Index = 0;\r
208 mFvTotalSize = 0;\r
209 mFvTakenSize = 0;\r
fd171542 210 Status = EFI_SUCCESS;\r
30fdf114
LG
211\r
212 SetUtilityName (UTILITY_NAME);\r
f7496d71 213\r
30fdf114
LG
214 if (argc == 1) {\r
215 Error (NULL, 0, 1001, "Missing options", "No input options specified.");\r
216 Usage ();\r
217 return STATUS_ERROR;\r
218 }\r
219\r
220 //\r
221 // Init global data to Zero\r
222 //\r
223 memset (&mFvDataInfo, 0, sizeof (FV_INFO));\r
f7496d71 224 memset (&mCapDataInfo, 0, sizeof (CAP_INFO));\r
fd171542 225 //\r
226 // Set the default FvGuid\r
227 //\r
228 memcpy (&mFvDataInfo.FvFileSystemGuid, &mEfiFirmwareFileSystem2Guid, sizeof (EFI_GUID));\r
79b74a03 229 mFvDataInfo.ForceRebase = -1;\r
f7496d71 230\r
30fdf114
LG
231 //\r
232 // Parse command line\r
233 //\r
234 argc --;\r
235 argv ++;\r
236\r
237 if ((stricmp (argv[0], "-h") == 0) || (stricmp (argv[0], "--help") == 0)) {\r
238 Version ();\r
239 Usage ();\r
f7496d71 240 return STATUS_SUCCESS;\r
30fdf114
LG
241 }\r
242\r
243 if (stricmp (argv[0], "--version") == 0) {\r
244 Version ();\r
f7496d71 245 return STATUS_SUCCESS;\r
30fdf114
LG
246 }\r
247\r
248 while (argc > 0) {\r
249 if ((stricmp (argv[0], "-i") == 0) || (stricmp (argv[0], "--inputfile") == 0)) {\r
250 InfFileName = argv[1];\r
251 if (InfFileName == NULL) {\r
252 Error (NULL, 0, 1003, "Invalid option value", "Input file can't be null");\r
253 return STATUS_ERROR;\r
254 }\r
255 argc -= 2;\r
256 argv += 2;\r
f7496d71 257 continue;\r
30fdf114
LG
258 }\r
259\r
260 if ((stricmp (argv[0], "-a") == 0) || (stricmp (argv[0], "--addrfile") == 0)) {\r
261 AddrFileName = argv[1];\r
262 if (AddrFileName == NULL) {\r
263 Error (NULL, 0, 1003, "Invalid option value", "Address file can't be null");\r
264 return STATUS_ERROR;\r
265 }\r
266 argc -= 2;\r
267 argv += 2;\r
f7496d71 268 continue;\r
30fdf114
LG
269 }\r
270\r
271 if ((stricmp (argv[0], "-o") == 0) || (stricmp (argv[0], "--outputfile") == 0)) {\r
272 OutFileName = argv[1];\r
273 if (OutFileName == NULL) {\r
274 Error (NULL, 0, 1003, "Invalid option value", "Output file can't be null");\r
275 return STATUS_ERROR;\r
276 }\r
277 argc -= 2;\r
278 argv += 2;\r
f7496d71 279 continue;\r
30fdf114
LG
280 }\r
281\r
282 if ((stricmp (argv[0], "-r") == 0) || (stricmp (argv[0], "--baseaddr") == 0)) {\r
283 Status = AsciiStringToUint64 (argv[1], FALSE, &TempNumber);\r
284 if (EFI_ERROR (Status)) {\r
285 Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
f7496d71 286 return STATUS_ERROR;\r
30fdf114
LG
287 }\r
288 mFvDataInfo.BaseAddress = TempNumber;\r
289 mFvDataInfo.BaseAddressSet = TRUE;\r
290 argc -= 2;\r
291 argv += 2;\r
f7496d71 292 continue;\r
30fdf114
LG
293 }\r
294\r
295 if ((stricmp (argv[0], "-b") == 0) || (stricmp (argv[0], "--blocksize") == 0)) {\r
296 Status = AsciiStringToUint64 (argv[1], FALSE, &TempNumber);\r
297 if (EFI_ERROR (Status)) {\r
298 Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
f7496d71 299 return STATUS_ERROR;\r
30fdf114
LG
300 }\r
301 if (TempNumber == 0) {\r
302 Error (NULL, 0, 1003, "Invalid option value", "Fv block size can't be be set to zero");\r
f7496d71 303 return STATUS_ERROR;\r
30fdf114
LG
304 }\r
305 mFvDataInfo.FvBlocks[0].Length = (UINT32) TempNumber;\r
fd171542 306 DebugMsg (NULL, 0, 9, "FV Block Size", "%s = 0x%llx", EFI_BLOCK_SIZE_STRING, (unsigned long long) TempNumber);\r
30fdf114
LG
307 argc -= 2;\r
308 argv += 2;\r
f7496d71 309 continue;\r
30fdf114
LG
310 }\r
311\r
312 if ((stricmp (argv[0], "-n") == 0) || (stricmp (argv[0], "--numberblock") == 0)) {\r
313 Status = AsciiStringToUint64 (argv[1], FALSE, &TempNumber);\r
314 if (EFI_ERROR (Status)) {\r
315 Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
f7496d71 316 return STATUS_ERROR;\r
30fdf114
LG
317 }\r
318 if (TempNumber == 0) {\r
319 Error (NULL, 0, 1003, "Invalid option value", "Fv block number can't be set to zero");\r
f7496d71 320 return STATUS_ERROR;\r
30fdf114
LG
321 }\r
322 mFvDataInfo.FvBlocks[0].NumBlocks = (UINT32) TempNumber;\r
fd171542 323 DebugMsg (NULL, 0, 9, "FV Number Block", "%s = 0x%llx", EFI_NUM_BLOCKS_STRING, (unsigned long long) TempNumber);\r
30fdf114
LG
324 argc -= 2;\r
325 argv += 2;\r
f7496d71 326 continue;\r
30fdf114
LG
327 }\r
328\r
79b74a03 329 if ((strcmp (argv[0], "-f") == 0) || (stricmp (argv[0], "--ffsfile") == 0)) {\r
30fdf114
LG
330 if (argv[1] == NULL) {\r
331 Error (NULL, 0, 1003, "Invalid option value", "Input Ffsfile can't be null");\r
332 return STATUS_ERROR;\r
333 }\r
6f30cefd
HW
334 if (strlen (argv[1]) > MAX_LONG_FILE_PATH - 1) {\r
335 Error (NULL, 0, 1003, "Invalid option value", "Input Ffsfile name %s is too long!", argv[1]);\r
336 return STATUS_ERROR;\r
337 }\r
338 strncpy (mFvDataInfo.FvFiles[Index], argv[1], MAX_LONG_FILE_PATH - 1);\r
339 mFvDataInfo.FvFiles[Index][MAX_LONG_FILE_PATH - 1] = 0;\r
fd171542 340 DebugMsg (NULL, 0, 9, "FV component file", "the %uth name is %s", (unsigned) Index + 1, argv[1]);\r
30fdf114
LG
341 argc -= 2;\r
342 argv += 2;\r
343\r
344 if (argc > 0) {\r
f7496d71
LG
345 if ((stricmp (argv[0], "-s") == 0) || (stricmp (argv[0], "--filetakensize") == 0)) {\r
346 if (argv[1] == NULL) {\r
347 Error (NULL, 0, 1003, "Invalid option value", "Ffsfile Size can't be null");\r
348 return STATUS_ERROR;\r
349 }\r
350 Status = AsciiStringToUint64 (argv[1], FALSE, &TempNumber);\r
351 if (EFI_ERROR (Status)) {\r
352 Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
353 return STATUS_ERROR;\r
354 }\r
355 mFvDataInfo.SizeofFvFiles[Index] = (UINT32) TempNumber;\r
356 DebugMsg (NULL, 0, 9, "FV component file size", "the %uth size is %s", (unsigned) Index + 1, argv[1]);\r
357 argc -= 2;\r
358 argv += 2;\r
30fdf114
LG
359 }\r
360 }\r
361 Index ++;\r
f7496d71 362 continue;\r
30fdf114
LG
363 }\r
364\r
365 if ((stricmp (argv[0], "-s") == 0) || (stricmp (argv[0], "--filetakensize") == 0)) {\r
366 Error (NULL, 0, 1003, "Invalid option", "It must be specified together with -f option to specify the file size.");\r
f7496d71 367 return STATUS_ERROR;\r
30fdf114
LG
368 }\r
369\r
370 if ((stricmp (argv[0], "-c") == 0) || (stricmp (argv[0], "--capsule") == 0)) {\r
371 CapsuleFlag = TRUE;\r
372 argc --;\r
373 argv ++;\r
f7496d71 374 continue;\r
30fdf114 375 }\r
f7496d71 376\r
79b74a03
LG
377 if ((strcmp (argv[0], "-F") == 0) || (stricmp (argv[0], "--force-rebase") == 0)) {\r
378 if (argv[1] == NULL) {\r
379 Error (NULL, 0, 1003, "Invalid option value", "Froce rebase flag can't be null");\r
380 return STATUS_ERROR;\r
381 }\r
382\r
383 if (stricmp (argv[1], "TRUE") == 0) {\r
384 mFvDataInfo.ForceRebase = 1;\r
385 } else if (stricmp (argv[1], "FALSE") == 0) {\r
386 mFvDataInfo.ForceRebase = 0;\r
387 } else {\r
388 Error (NULL, 0, 1003, "Invalid option value", "froce rebase flag value must be \"TRUE\" or \"FALSE\"");\r
389 return STATUS_ERROR;\r
390 }\r
391\r
392 argc -= 2;\r
393 argv += 2;\r
f7496d71
LG
394 continue;\r
395 }\r
30fdf114
LG
396\r
397 if (stricmp (argv[0], "--capheadsize") == 0) {\r
398 //\r
399 // Get Capsule Image Header Size\r
400 //\r
401 Status = AsciiStringToUint64 (argv[1], FALSE, &TempNumber);\r
402 if (EFI_ERROR (Status)) {\r
403 Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
f7496d71 404 return STATUS_ERROR;\r
30fdf114
LG
405 }\r
406 mCapDataInfo.HeaderSize = (UINT32) TempNumber;\r
fd171542 407 DebugMsg (NULL, 0, 9, "Capsule Header size", "%s = 0x%llx", EFI_CAPSULE_HEADER_SIZE_STRING, (unsigned long long) TempNumber);\r
30fdf114
LG
408 argc -= 2;\r
409 argv += 2;\r
f7496d71 410 continue;\r
30fdf114
LG
411 }\r
412\r
413 if (stricmp (argv[0], "--capflag") == 0) {\r
414 //\r
415 // Get Capsule Header\r
416 //\r
417 if (argv[1] == NULL) {\r
418 Error (NULL, 0, 1003, "Option value is not set", "%s = %s", argv[0], argv[1]);\r
419 return STATUS_ERROR;\r
420 }\r
421 if (strcmp (argv[1], "PopulateSystemTable") == 0) {\r
422 mCapDataInfo.Flags |= CAPSULE_FLAGS_PERSIST_ACROSS_RESET | CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE;\r
423 } else if (strcmp (argv[1], "PersistAcrossReset") == 0) {\r
424 mCapDataInfo.Flags |= CAPSULE_FLAGS_PERSIST_ACROSS_RESET;\r
fd171542 425 } else if (strcmp (argv[1], "InitiateReset") == 0) {\r
426 mCapDataInfo.Flags |= CAPSULE_FLAGS_PERSIST_ACROSS_RESET | CAPSULE_FLAGS_INITIATE_RESET;\r
30fdf114
LG
427 } else {\r
428 Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
429 return STATUS_ERROR;\r
430 }\r
431 DebugMsg (NULL, 0, 9, "Capsule Flag", argv[1]);\r
432 argc -= 2;\r
433 argv += 2;\r
f7496d71 434 continue;\r
30fdf114
LG
435 }\r
436\r
e8a47801
LG
437 if (stricmp (argv[0], "--capoemflag") == 0) {\r
438 if (argv[1] == NULL) {\r
439 Error (NULL, 0, 1003, "Invalid option value", "Capsule OEM flag can't be null");\r
440 }\r
441 Status = AsciiStringToUint64(argv[1], FALSE, &TempNumber);\r
442 if (EFI_ERROR (Status) || TempNumber > 0xffff) {\r
443 Error (NULL, 0, 1003, "Invalid option value", "Capsule OEM flag value must be integer value between 0x0000 and 0xffff");\r
444 return STATUS_ERROR;\r
445 }\r
446 mCapDataInfo.Flags |= TempNumber;\r
447 DebugMsg( NULL, 0, 9, "Capsule OEM Flags", argv[1]);\r
448 argc -= 2;\r
449 argv += 2;\r
450 continue;\r
451 }\r
452\r
30fdf114
LG
453 if (stricmp (argv[0], "--capguid") == 0) {\r
454 //\r
455 // Get the Capsule Guid\r
456 //\r
457 Status = StringToGuid (argv[1], &mCapDataInfo.CapGuid);\r
458 if (EFI_ERROR (Status)) {\r
459 Error (NULL, 0, 1003, "Invalid option value", "%s = %s", EFI_CAPSULE_GUID_STRING, argv[1]);\r
460 return STATUS_ERROR;\r
461 }\r
462 DebugMsg (NULL, 0, 9, "Capsule Guid", "%s = %s", EFI_CAPSULE_GUID_STRING, argv[1]);\r
463 argc -= 2;\r
464 argv += 2;\r
f7496d71 465 continue;\r
30fdf114
LG
466 }\r
467\r
468 if ((stricmp (argv[0], "-g") == 0) || (stricmp (argv[0], "--guid") == 0)) {\r
469 //\r
470 // Get the Capsule or Fv Guid\r
471 //\r
472 Status = StringToGuid (argv[1], &mCapDataInfo.CapGuid);\r
473 if (EFI_ERROR (Status)) {\r
474 Error (NULL, 0, 1003, "Invalid option value", "%s = %s", EFI_GUID_STRING, argv[1]);\r
475 return STATUS_ERROR;\r
476 }\r
477 memcpy (&mFvDataInfo.FvFileSystemGuid, &mCapDataInfo.CapGuid, sizeof (EFI_GUID));\r
478 mFvDataInfo.FvFileSystemGuidSet = TRUE;\r
479 DebugMsg (NULL, 0, 9, "Capsule Guid", "%s = %s", EFI_CAPSULE_GUID_STRING, argv[1]);\r
480 DebugMsg (NULL, 0, 9, "FV Guid", "%s = %s", EFI_FV_FILESYSTEMGUID_STRING, argv[1]);\r
481 argc -= 2;\r
482 argv += 2;\r
f7496d71 483 continue;\r
30fdf114
LG
484 }\r
485\r
486 if (stricmp (argv[0], "--FvNameGuid") == 0) {\r
487 //\r
488 // Get Fv Name Guid\r
489 //\r
490 Status = StringToGuid (argv[1], &mFvDataInfo.FvNameGuid);\r
491 if (EFI_ERROR (Status)) {\r
492 Error (NULL, 0, 1003, "Invalid option value", "%s = %s", EFI_GUID_STRING, argv[1]);\r
493 return STATUS_ERROR;\r
494 }\r
495 mFvDataInfo.FvNameGuidSet = TRUE;\r
496 DebugMsg (NULL, 0, 9, "FV Name Guid", "%s = %s", EFI_FV_NAMEGUID_STRING, argv[1]);\r
497 argc -= 2;\r
498 argv += 2;\r
f7496d71 499 continue;\r
30fdf114
LG
500 }\r
501\r
502 if ((stricmp (argv[0], "-p") == 0) || (stricmp (argv[0], "--dump") == 0)) {\r
503 DumpCapsule = TRUE;\r
504 argc --;\r
505 argv ++;\r
f7496d71 506 continue;\r
30fdf114
LG
507 }\r
508\r
509 if ((stricmp (argv[0], "-m") == 0) || (stricmp (argv[0], "--map") == 0)) {\r
510 MapFileName = argv[1];\r
511 if (MapFileName == NULL) {\r
512 Error (NULL, 0, 1003, "Invalid option value", "Map file can't be null");\r
513 return STATUS_ERROR;\r
514 }\r
515 argc -= 2;\r
516 argv += 2;\r
f7496d71 517 continue;\r
30fdf114
LG
518 }\r
519\r
520 if ((stricmp (argv[0], "-v") == 0) || (stricmp (argv[0], "--verbose") == 0)) {\r
521 SetPrintLevel (VERBOSE_LOG_LEVEL);\r
522 VerboseMsg ("Verbose output Mode Set!");\r
523 argc --;\r
524 argv ++;\r
525 continue;\r
526 }\r
527\r
528 if ((stricmp (argv[0], "-q") == 0) || (stricmp (argv[0], "--quiet") == 0)) {\r
529 SetPrintLevel (KEY_LOG_LEVEL);\r
530 KeyMsg ("Quiet output Mode Set!");\r
531 argc --;\r
532 argv ++;\r
533 continue;\r
534 }\r
535\r
536 if ((stricmp (argv[0], "-d") == 0) || (stricmp (argv[0], "--debug") == 0)) {\r
537 Status = AsciiStringToUint64 (argv[1], FALSE, &LogLevel);\r
538 if (EFI_ERROR (Status)) {\r
539 Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
540 return STATUS_ERROR;\r
541 }\r
542 if (LogLevel > 9) {\r
fd171542 543 Error (NULL, 0, 1003, "Invalid option value", "Debug Level range is 0-9, current input level is %d", (int) LogLevel);\r
30fdf114
LG
544 return STATUS_ERROR;\r
545 }\r
546 SetPrintLevel (LogLevel);\r
547 DebugMsg (NULL, 0, 9, "Debug Mode Set", "Debug Output Mode Level %s is set!", argv[1]);\r
548 argc -= 2;\r
549 argv += 2;\r
550 continue;\r
551 }\r
552\r
553 //\r
554 // Don't recognize the parameter.\r
555 //\r
556 Error (NULL, 0, 1000, "Unknown option", "%s", argv[0]);\r
557 return STATUS_ERROR;\r
558 }\r
559\r
560 VerboseMsg ("%s tool start.", UTILITY_NAME);\r
f7496d71 561\r
30fdf114
LG
562 //\r
563 // check input parameter, InfFileName can be NULL\r
564 //\r
565 if (InfFileName == NULL && DumpCapsule) {\r
566 Error (NULL, 0, 1001, "Missing option", "Input Capsule Image");\r
567 return STATUS_ERROR;\r
568 }\r
569 VerboseMsg ("the input FvInf or CapInf file name is %s", InfFileName);\r
570\r
571 if (!DumpCapsule && OutFileName == NULL) {\r
572 Error (NULL, 0, 1001, "Missing option", "Output File");\r
573 return STATUS_ERROR;\r
574 }\r
575 if (OutFileName != NULL) {\r
576 VerboseMsg ("the output file name is %s", OutFileName);\r
577 }\r
f7496d71 578\r
30fdf114
LG
579 //\r
580 // Read the INF file image\r
581 //\r
582 if (InfFileName != NULL) {\r
583 Status = GetFileImage (InfFileName, &InfFileImage, &InfFileSize);\r
584 if (EFI_ERROR (Status)) {\r
585 return STATUS_ERROR;\r
586 }\r
587 }\r
f7496d71 588\r
30fdf114
LG
589 if (DumpCapsule) {\r
590 VerboseMsg ("Dump the capsule header information for the input capsule image %s", InfFileName);\r
591 //\r
592 // Dump Capsule Image Header Information\r
593 //\r
594 CapsuleHeader = (EFI_CAPSULE_HEADER *) InfFileImage;\r
595 if (OutFileName == NULL) {\r
596 FpFile = stdout;\r
597 } else {\r
1be2ed90 598 FpFile = fopen (LongFilePath (OutFileName), "w");\r
30fdf114
LG
599 if (FpFile == NULL) {\r
600 Error (NULL, 0, 0001, "Error opening file", OutFileName);\r
601 return STATUS_ERROR;\r
602 }\r
603 }\r
f6401aed
HW
604 if (FpFile != NULL) {\r
605 fprintf (FpFile, "Capsule %s Image Header Information\n", InfFileName);\r
606 fprintf (FpFile, " GUID %08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X\n",\r
607 (unsigned) CapsuleHeader->CapsuleGuid.Data1,\r
608 (unsigned) CapsuleHeader->CapsuleGuid.Data2,\r
609 (unsigned) CapsuleHeader->CapsuleGuid.Data3,\r
610 (unsigned) CapsuleHeader->CapsuleGuid.Data4[0],\r
611 (unsigned) CapsuleHeader->CapsuleGuid.Data4[1],\r
612 (unsigned) CapsuleHeader->CapsuleGuid.Data4[2],\r
613 (unsigned) CapsuleHeader->CapsuleGuid.Data4[3],\r
614 (unsigned) CapsuleHeader->CapsuleGuid.Data4[4],\r
615 (unsigned) CapsuleHeader->CapsuleGuid.Data4[5],\r
616 (unsigned) CapsuleHeader->CapsuleGuid.Data4[6],\r
617 (unsigned) CapsuleHeader->CapsuleGuid.Data4[7]);\r
618 fprintf (FpFile, " Header size 0x%08X\n", (unsigned) CapsuleHeader->HeaderSize);\r
619 fprintf (FpFile, " Flags 0x%08X\n", (unsigned) CapsuleHeader->Flags);\r
620 fprintf (FpFile, " Capsule image size 0x%08X\n", (unsigned) CapsuleHeader->CapsuleImageSize);\r
621 fclose (FpFile);\r
622 }\r
30fdf114
LG
623 } else if (CapsuleFlag) {\r
624 VerboseMsg ("Create capsule image");\r
625 //\r
626 // Call the GenerateCapImage to generate Capsule Image\r
627 //\r
628 for (Index = 0; mFvDataInfo.FvFiles[Index][0] != '\0'; Index ++) {\r
629 strcpy (mCapDataInfo.CapFiles[Index], mFvDataInfo.FvFiles[Index]);\r
630 }\r
631\r
632 Status = GenerateCapImage (\r
f7496d71 633 InfFileImage,\r
30fdf114
LG
634 InfFileSize,\r
635 OutFileName\r
636 );\r
637 } else {\r
638 VerboseMsg ("Create Fv image and its map file");\r
79b74a03
LG
639 //\r
640 // Will take rebase action at below situation:\r
641 // 1. ForceRebase Flag specified to TRUE;\r
642 // 2. ForceRebase Flag not specified, BaseAddress greater than zero.\r
643 //\r
644 if (((mFvDataInfo.BaseAddress > 0) && (mFvDataInfo.ForceRebase == -1)) || (mFvDataInfo.ForceRebase == 1)) {\r
fd171542 645 VerboseMsg ("FvImage Rebase Address is 0x%llX", (unsigned long long) mFvDataInfo.BaseAddress);\r
30fdf114
LG
646 }\r
647 //\r
648 // Call the GenerateFvImage to generate Fv Image\r
649 //\r
650 Status = GenerateFvImage (\r
651 InfFileImage,\r
652 InfFileSize,\r
653 OutFileName,\r
654 MapFileName\r
655 );\r
656 }\r
657\r
658 //\r
659 // free InfFileImage memory\r
660 //\r
661 if (InfFileImage != NULL) {\r
662 free (InfFileImage);\r
663 }\r
f7496d71 664\r
30fdf114
LG
665 //\r
666 // update boot driver address and runtime driver address in address file\r
667 //\r
52302d4d 668 if (Status == EFI_SUCCESS && AddrFileName != NULL && mFvBaseAddressNumber > 0) {\r
1be2ed90 669 FpFile = fopen (LongFilePath (AddrFileName), "w");\r
30fdf114
LG
670 if (FpFile == NULL) {\r
671 Error (NULL, 0, 0001, "Error opening file", AddrFileName);\r
672 return STATUS_ERROR;\r
673 }\r
52302d4d 674 fprintf (FpFile, FV_BASE_ADDRESS_STRING);\r
30fdf114 675 fprintf (FpFile, "\n");\r
52302d4d 676 for (Index = 0; Index < mFvBaseAddressNumber; Index ++) {\r
fd171542 677 fprintf (\r
678 FpFile,\r
52302d4d
LG
679 "0x%llx\n",\r
680 (unsigned long long)mFvBaseAddress[Index]\r
fd171542 681 );\r
30fdf114 682 }\r
52302d4d 683 fflush (FpFile);\r
30fdf114
LG
684 fclose (FpFile);\r
685 }\r
f7496d71 686\r
30fdf114 687 if (Status == EFI_SUCCESS) {\r
fd171542 688 DebugMsg (NULL, 0, 9, "The Total Fv Size", "%s = 0x%x", EFI_FV_TOTAL_SIZE_STRING, (unsigned) mFvTotalSize);\r
689 DebugMsg (NULL, 0, 9, "The used Fv Size", "%s = 0x%x", EFI_FV_TAKEN_SIZE_STRING, (unsigned) mFvTakenSize);\r
690 DebugMsg (NULL, 0, 9, "The space Fv size", "%s = 0x%x", EFI_FV_SPACE_SIZE_STRING, (unsigned) (mFvTotalSize - mFvTakenSize));\r
30fdf114
LG
691 }\r
692\r
693 VerboseMsg ("%s tool done with return code is 0x%x.", UTILITY_NAME, GetUtilityStatus ());\r
694\r
695 return GetUtilityStatus ();\r
696}\r