1dd24470d47b5bf67ace68746b3cbe2504a2b40d
[people/mcb30/basetools.git] / Source / C / GenFv / GenFv.c
1 /*++\r
2 \r
3 Copyright (c) 2007, Intel Corporation                                                         \r
4 All rights reserved. This program and the accompanying materials                          \r
5 are licensed and made available under the terms and conditions of the BSD License         \r
6 which accompanies this distribution.  The full text of the license may be found at        \r
7 http://opensource.org/licenses/bsd-license.php                                            \r
8                                                                                           \r
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
11 \r
12 Module Name:\r
13 \r
14   GenFv.c\r
15 \r
16 Abstract:\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 "CommonLib.h"\r
32 #include "GenFvInternalLib.h"\r
33 #include "EfiUtilityMsgs.h"\r
34 \r
35 //\r
36 // Utility Name\r
37 //\r
38 #define UTILITY_NAME  "GenFv"\r
39 \r
40 //\r
41 // Utility version information\r
42 //\r
43 #define UTILITY_MAJOR_VERSION 0\r
44 #define UTILITY_MINOR_VERSION 1\r
45 \r
46 \r
47 static\r
48 void \r
49 Version(\r
50   void\r
51 )\r
52 /*++\r
53 \r
54 Routine Description:\r
55 \r
56   Displays the standard utility information to SDTOUT\r
57 \r
58 Arguments:\r
59 \r
60   None\r
61 \r
62 Returns:\r
63 \r
64   None\r
65 \r
66 --*/\r
67 {\r
68   printf ("%s v%d.%d - EDKII Firmware Volume Generation Utility.\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
69   printf ("Copyright (c) 2007 Intel Corporation. All rights reserved.\n");\r
70 }\r
71  \r
72 \r
73 static\r
74 void \r
75 Usage(\r
76   void\r
77   )\r
78 /*++\r
79 \r
80 Routine Description:\r
81 \r
82   Displays the utility usage syntax to STDOUT\r
83 \r
84 Arguments:\r
85 \r
86   None\r
87 \r
88 Returns:\r
89 \r
90   None\r
91 \r
92 --*/\r
93 {\r
94   Version();\r
95 \r
96   printf ("\nUsage: " UTILITY_NAME "\n\\r
97         -i, --inputfile [FileName (FV.inf)]\n\\r
98         -o, --outputfile [FileName (FileName.fv)]\n\\r
99         -r, --baseaddress (0x##### or #####)\n\\r
100         -h, --help\n\\r
101         -V, --version\n");\r
102 }\r
103 \r
104 int\r
105 main (\r
106   IN INTN   argc,\r
107   IN CHAR8  **argv\r
108   )\r
109 /*++\r
110 \r
111 Routine Description:\r
112 \r
113   This utility uses GenFvImage.Lib to build a firmware volume image.\r
114 \r
115 Arguments:\r
116 \r
117   FvInfFileName      The name of an FV image description file.\r
118 \r
119   Arguments come in pair in any order.\r
120     -I FvInfFileName \r
121 \r
122 Returns:\r
123 \r
124   EFI_SUCCESS            No error conditions detected.\r
125   EFI_INVALID_PARAMETER  One or more of the input parameters is invalid.\r
126   EFI_OUT_OF_RESOURCES   A resource required by the utility was unavailable.  \r
127                          Most commonly this will be memory allocation \r
128                          or file creation.\r
129   EFI_LOAD_ERROR         GenFvImage.lib could not be loaded.\r
130   EFI_ABORTED            Error executing the GenFvImage lib.\r
131 \r
132 --*/\r
133 {\r
134   EFI_STATUS  Status;\r
135   CHAR8       *InfFileName;\r
136   CHAR8       *InfFileImage;\r
137   UINTN       InfFileSize;\r
138   CHAR8       *FvFileName;\r
139   EFI_PHYSICAL_ADDRESS XipBase;\r
140 \r
141   InfFileName   = NULL;\r
142   InfFileImage  = NULL;\r
143   FvFileName    = NULL;\r
144   XipBase       = -1;\r
145   InfFileSize   = 0;\r
146 \r
147   SetUtilityName (UTILITY_NAME);\r
148 \r
149   if (argc == 1) {\r
150     Usage ();\r
151     return STATUS_ERROR;\r
152   }\r
153 \r
154   //\r
155   // Parse command line\r
156   //\r
157   argc --;\r
158   argv ++;\r
159 \r
160   if ((stricmp (argv[0], "-h") == 0) || (stricmp (argv[0], "--help") == 0)) {\r
161     Usage();\r
162     return STATUS_SUCCESS;    \r
163   }\r
164 \r
165   if ((stricmp (argv[0], "-v") == 0) || (stricmp (argv[0], "--version") == 0)) {\r
166     Version();\r
167     return STATUS_SUCCESS;    \r
168   }\r
169 \r
170   while (argc > 0) {\r
171     if ((stricmp (argv[0], "-i") == 0) || (stricmp (argv[0], "--inputfile") == 0)) {\r
172       InfFileName = argv[1];\r
173       if (InfFileName == NULL) {\r
174         Warning (NULL, 0, 0, NULL, "No input file specified.");\r
175       }\r
176       argc -= 2;\r
177       argv += 2;\r
178       continue; \r
179     }\r
180 \r
181     if ((stricmp (argv[0], "-o") == 0) || (stricmp (argv[0], "--outputfile") == 0)) {\r
182       FvFileName = argv[1];\r
183       if (FvFileName == NULL) {\r
184         Warning (NULL, 0, 0, NULL, "No output file specified.");\r
185       }\r
186       argc -= 2;\r
187       argv += 2;\r
188       continue; \r
189     }\r
190 \r
191     if ((stricmp (argv[0], "-r") == 0) || (stricmp (argv[0], "--baseaddr") == 0)) {\r
192       Status = AsciiStringToUint64 (argv[1], FALSE, &XipBase);\r
193       if (EFI_ERROR (Status)) {\r
194         Error (NULL, 0, 0, "Input paramter is not one valid integrator.", NULL);\r
195         return STATUS_ERROR;        \r
196       }\r
197       argc -= 2;\r
198       argv += 2;\r
199       continue; \r
200     }\r
201     \r
202     //\r
203     // Don't recognize the paramter.\r
204     //\r
205     Error (NULL, 0, 0, NULL, "%s is invaild paramter!", argv[0]);\r
206     return STATUS_ERROR;\r
207   }\r
208 \r
209   //\r
210   // Read the INF file image\r
211   //\r
212   Status = GetFileImage (InfFileName, &InfFileImage, &InfFileSize);\r
213   if (EFI_ERROR (Status)) {\r
214     return STATUS_ERROR;\r
215   }\r
216 \r
217   //\r
218   // Call the GenFvImageFunction to generate Fv Image\r
219   //\r
220   Status = GenerateFvImage (\r
221             InfFileImage,\r
222             InfFileSize,\r
223             FvFileName,\r
224             XipBase\r
225             );\r
226 \r
227   //\r
228   // free InfFileImage memory\r
229   //\r
230   free (InfFileImage);\r
231 \r
232   if (EFI_ERROR (Status)) {\r
233     switch (Status) {\r
234 \r
235     case EFI_INVALID_PARAMETER:\r
236       Error (NULL, 0, 0, "invalid parameter passed to GenerateFvImage", NULL);\r
237       return GetUtilityStatus ();\r
238       break;\r
239 \r
240     case EFI_ABORTED:\r
241       Error (NULL, 0, 0, "error detected while creating the file image", NULL);\r
242       return GetUtilityStatus ();\r
243       break;\r
244 \r
245     case EFI_OUT_OF_RESOURCES:\r
246       Error (NULL, 0, 0, "GenFvImage Lib could not allocate required resources", NULL);\r
247       return GetUtilityStatus ();\r
248       break;\r
249 \r
250     case EFI_VOLUME_CORRUPTED:\r
251       Error (NULL, 0, 0, "no base address was specified, but the FV.INF included a PEI or BSF file", NULL);\r
252       return GetUtilityStatus ();\r
253       break;\r
254 \r
255     case EFI_LOAD_ERROR:\r
256       Error (NULL, 0, 0, "could not load FV image generation library", NULL);\r
257       return GetUtilityStatus ();\r
258       break;\r
259 \r
260     default:\r
261       Error (NULL, 0, 0, "GenFvImage Lib returned unknown status", "status returned = 0x%X", Status);\r
262       return GetUtilityStatus ();\r
263       break;\r
264     }\r
265   }\r
266 \r
267   return GetUtilityStatus ();\r
268 }\r