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