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