]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - BaseTools/Source/C/GenFv/GenFv.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / BaseTools / Source / C / GenFv / GenFv.c
... / ...
CommitLineData
1/** @file\r
2 This contains all code necessary to build the GenFvImage.exe utility.\r
3 This utility relies heavily on the GenFvImage Lib. Definitions for both\r
4 can be found in the Tiano Firmware Volume Generation Utility\r
5 Specification, review draft.\r
6\r
7Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
8SPDX-License-Identifier: BSD-2-Clause-Patent\r
9\r
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
30\r
31EFI_GUID mEfiFirmwareFileSystem2Guid = EFI_FIRMWARE_FILE_SYSTEM2_GUID;\r
32EFI_GUID mEfiFirmwareFileSystem3Guid = EFI_FIRMWARE_FILE_SYSTEM3_GUID;\r
33\r
34STATIC\r
35VOID\r
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
55 fprintf (stdout, "%s Version %d.%d %s \n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION, __BUILD_VERSION);\r
56}\r
57\r
58STATIC\r
59VOID\r
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
83\r
84 //\r
85 // Copyright declaration\r
86 //\r
87 fprintf (stdout, "Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.\n\n");\r
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
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
120 fprintf (stdout, " -a AddressFile, --addrfile AddressFile\n\\r
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
123 fprintf (stdout, " -m logfile, --map logfile\n\\r
124 Logfile is the output fv map file name. if it is not\n\\r
125 given, the FvName.map will be the default map file name\n");\r
126 fprintf (stdout, " -g Guid, --guid Guid\n\\r
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
130 fprintf (stdout, " --FvNameGuid Guid Guid is used to specify Fv Name.\n\\r
131 Its format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n");\r
132 fprintf (stdout, " --capflag CapFlag Capsule Reset Flag can be PersistAcrossReset,\n\\r
133 or PopulateSystemTable or InitiateReset or not set\n");\r
134 fprintf (stdout, " --capoemflag CapOEMFlag\n\\r
135 Capsule OEM Flag is an integer between 0x0000 and 0xffff\n");\r
136 fprintf (stdout, " --capheadsize HeadSize\n\\r
137 HeadSize is one HEX or DEC format value\n\\r
138 HeadSize is required by Capsule Image.\n");\r
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
167 -I FvInfFileName\r
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
173 EFI_OUT_OF_RESOURCES A resource required by the utility was unavailable.\r
174 Most commonly this will be memory allocation\r
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
188 BOOLEAN CapsuleFlag;\r
189 BOOLEAN DumpCapsule;\r
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
210 Status = EFI_SUCCESS;\r
211\r
212 SetUtilityName (UTILITY_NAME);\r
213\r
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
224 memset (&mCapDataInfo, 0, sizeof (CAP_INFO));\r
225 //\r
226 // Set the default FvGuid\r
227 //\r
228 memcpy (&mFvDataInfo.FvFileSystemGuid, &mEfiFirmwareFileSystem2Guid, sizeof (EFI_GUID));\r
229 mFvDataInfo.ForceRebase = -1;\r
230\r
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
240 return STATUS_SUCCESS;\r
241 }\r
242\r
243 if (stricmp (argv[0], "--version") == 0) {\r
244 Version ();\r
245 return STATUS_SUCCESS;\r
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
257 continue;\r
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
268 continue;\r
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
279 continue;\r
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
286 return STATUS_ERROR;\r
287 }\r
288 mFvDataInfo.BaseAddress = TempNumber;\r
289 mFvDataInfo.BaseAddressSet = TRUE;\r
290 argc -= 2;\r
291 argv += 2;\r
292 continue;\r
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
299 return STATUS_ERROR;\r
300 }\r
301 if (TempNumber == 0) {\r
302 Error (NULL, 0, 1003, "Invalid option value", "Fv block size can't be set to zero");\r
303 return STATUS_ERROR;\r
304 }\r
305 mFvDataInfo.FvBlocks[0].Length = (UINT32) TempNumber;\r
306 DebugMsg (NULL, 0, 9, "FV Block Size", "%s = 0x%llx", EFI_BLOCK_SIZE_STRING, (unsigned long long) TempNumber);\r
307 argc -= 2;\r
308 argv += 2;\r
309 continue;\r
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
316 return STATUS_ERROR;\r
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
320 return STATUS_ERROR;\r
321 }\r
322 mFvDataInfo.FvBlocks[0].NumBlocks = (UINT32) TempNumber;\r
323 DebugMsg (NULL, 0, 9, "FV Number Block", "%s = 0x%llx", EFI_NUM_BLOCKS_STRING, (unsigned long long) TempNumber);\r
324 argc -= 2;\r
325 argv += 2;\r
326 continue;\r
327 }\r
328\r
329 if ((strcmp (argv[0], "-f") == 0) || (stricmp (argv[0], "--ffsfile") == 0)) {\r
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
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
340 DebugMsg (NULL, 0, 9, "FV component file", "the %uth name is %s", (unsigned) Index + 1, argv[1]);\r
341 argc -= 2;\r
342 argv += 2;\r
343\r
344 if (argc > 0) {\r
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
359 }\r
360 }\r
361 Index ++;\r
362 continue;\r
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
367 return STATUS_ERROR;\r
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
374 continue;\r
375 }\r
376\r
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
394 continue;\r
395 }\r
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
404 return STATUS_ERROR;\r
405 }\r
406 mCapDataInfo.HeaderSize = (UINT32) TempNumber;\r
407 DebugMsg (NULL, 0, 9, "Capsule Header size", "%s = 0x%llx", EFI_CAPSULE_HEADER_SIZE_STRING, (unsigned long long) TempNumber);\r
408 argc -= 2;\r
409 argv += 2;\r
410 continue;\r
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
425 } else if (strcmp (argv[1], "InitiateReset") == 0) {\r
426 mCapDataInfo.Flags |= CAPSULE_FLAGS_PERSIST_ACROSS_RESET | CAPSULE_FLAGS_INITIATE_RESET;\r
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
434 continue;\r
435 }\r
436\r
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
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
465 continue;\r
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
483 continue;\r
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
499 continue;\r
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
506 continue;\r
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
517 continue;\r
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
543 Error (NULL, 0, 1003, "Invalid option value", "Debug Level range is 0-9, current input level is %d", (int) LogLevel);\r
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
561\r
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
578\r
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
588\r
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
598 FpFile = fopen (LongFilePath (OutFileName), "w");\r
599 if (FpFile == NULL) {\r
600 Error (NULL, 0, 0001, "Error opening file", OutFileName);\r
601 return STATUS_ERROR;\r
602 }\r
603 }\r
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
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
633 InfFileImage,\r
634 InfFileSize,\r
635 OutFileName\r
636 );\r
637 } else {\r
638 VerboseMsg ("Create Fv image and its map file");\r
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
645 VerboseMsg ("FvImage Rebase Address is 0x%llX", (unsigned long long) mFvDataInfo.BaseAddress);\r
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
664\r
665 //\r
666 // update boot driver address and runtime driver address in address file\r
667 //\r
668 if (Status == EFI_SUCCESS && AddrFileName != NULL && mFvBaseAddressNumber > 0) {\r
669 FpFile = fopen (LongFilePath (AddrFileName), "w");\r
670 if (FpFile == NULL) {\r
671 Error (NULL, 0, 0001, "Error opening file", AddrFileName);\r
672 return STATUS_ERROR;\r
673 }\r
674 fprintf (FpFile, FV_BASE_ADDRESS_STRING);\r
675 fprintf (FpFile, "\n");\r
676 for (Index = 0; Index < mFvBaseAddressNumber; Index ++) {\r
677 fprintf (\r
678 FpFile,\r
679 "0x%llx\n",\r
680 (unsigned long long)mFvBaseAddress[Index]\r
681 );\r
682 }\r
683 fflush (FpFile);\r
684 fclose (FpFile);\r
685 }\r
686\r
687 if (Status == EFI_SUCCESS) {\r
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
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