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