1 /** @file
2 This file contains the relevant declarations required to generate Option Rom File
3 
4 Copyright (c) 1999 - 2014, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials are licensed and made available
6 under the terms and conditions of the BSD License which accompanies this
7 distribution.  The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9 
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 
15 #ifndef __EFI_ROM_H__
16 #define __EFI_ROM_H__
17 
18 #include <stdio.h>
19 #include <string.h>
20 #include <stdlib.h>
21 
22 #include <Common/UefiBaseTypes.h>
23 #include <IndustryStandard/PeImage.h> // for PE32 structure definitions
24 
25 #include <IndustryStandard/pci22.h>  // for option ROM header structures
26 #include <IndustryStandard/pci30.h>
27 
28 #include "Compress.h"
29 #include "CommonLib.h"
30 
31 //
32 // Version of this utility
33 //
34 #define UTILITY_NAME "EfiRom"
35 #define UTILITY_MAJOR_VERSION 0
36 #define UTILITY_MINOR_VERSION 1
37 
38 //
39 // Define the max length of a filename
40 //
41 #define MAX_PATH                  200
42 
43 //
44 // Define the default file extension name
45 //
46 #define DEFAULT_OUTPUT_EXTENSION  ".rom"
47 
48 //
49 // Max size for an option ROM image
50 //
51 #define MAX_OPTION_ROM_SIZE (1024 * 1024 * 16)  // 16MB
52 
53 //
54 // Values for the indicator field in the PCI data structure
55 //
56 #define INDICATOR_LAST  0x80  // last file in series of files
57 
58 //
59 // Masks for the FILE_LIST.FileFlags field
60 //
61 #define FILE_FLAG_BINARY    0x01
62 #define FILE_FLAG_EFI       0x02
63 #define FILE_FLAG_COMPRESS  0x04
64 
65 //
66 // Use this linked list structure to keep track of all the filenames
67 // specified on the command line.
68 //
69 typedef struct _FILE_LIST {
70   struct _FILE_LIST *Next;
71   CHAR8             *FileName;
72   UINT32            FileFlags;
73   UINT32            ClassCode;
74   UINT16            CodeRevision;
75 } FILE_LIST;
76 
77 //
78 // Use this to track our command-line options
79 //
80 typedef struct {
81   CHAR8     OutFileName[MAX_PATH];
82   INT8      NoLast;
83   UINT16    ClassCode;
84   UINT16    PciRevision;
85   UINT16    VendId;
86   UINT16    DevId;
87   UINT8     VendIdValid;
88   UINT8     DevIdValid;
89   INT8      Verbose;
90   INT8      Quiet;
91   INT8      Debug;
92   INT8      Pci23;
93   INT8      Pci30;
94   INT8      DumpOption;
95 //  INT8      Help;
96 //  INT8      Version;
97   FILE_LIST *FileList;
98 } OPTIONS;
99 
100 //
101 // Make a global structure to keep track of command-line options
102 //
103 static OPTIONS  mOptions;
104 
105 //
106 // Use these to convert from machine type value to a named type
107 //
108 typedef struct {
109   UINT16  Value;
110   CHAR8   *Name;
111 } STRING_LOOKUP;
112 
113 //
114 // Machine Types
115 //
116 static STRING_LOOKUP  mMachineTypes[] = {
117   { EFI_IMAGE_MACHINE_IA32, "IA32" },
118   { EFI_IMAGE_MACHINE_IA64, "IA64" },
119   { EFI_IMAGE_MACHINE_EBC, "EBC" },
120   { EFI_IMAGE_MACHINE_X64, "X64" },
121   { EFI_IMAGE_MACHINE_ARMT, "ARM" },
122   { EFI_IMAGE_MACHINE_AARCH64, "AA64" },
123   { 0, NULL }
124 };
125 
126 //
127 // Subsystem Types
128 //
129 static STRING_LOOKUP  mSubsystemTypes[] = {
130   { EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION, "EFI application" },
131   { EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER, "EFI boot service driver" },
132   { EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER, "EFI runtime driver" },
133   { 0, NULL }
134 };
135 
136 //
137 //  Function prototypes
138 //
139 static
140 void
141 Version (
142   VOID
143   )
144 /*++
145 
146 Routine Description:
147 
148   Displays the utility version to STDOUT
149 
150 Arguments:
151 
152   None
153 
154 Returns:
155 
156   None
157 
158 --*/
159 ;
160 
161 static
162 void
163 Usage (
164   VOID
165   )
166 /*++
167 
168 Routine Description:
169 
170   Displays the utility usage syntax to STDOUT
171 
172 Arguments:
173 
174   None
175 
176 Returns:
177 
178   None
179 
180 --*/
181 ;
182 
183 static
184 int
185 ParseCommandLine (
186   int       Argc,
187   char      *Argv[],
188   OPTIONS   *Options
189   )
190 /*++
191 
192 Routine Description:
193 
194   Given the Argc/Argv program arguments, and a pointer to an options structure,
195   parse the command-line options and check their validity.
196 
197 Arguments:
198 
199   Argc            - standard C main() argument count
200   Argv[]          - standard C main() argument list
201   Options         - pointer to a structure to store the options in
202 
203 Returns:
204 
205   STATUS_SUCCESS    success
206   non-zero          otherwise
207 
208 --*/
209 ;
210 
211 static
212 int
213 CheckPE32File (
214   FILE      *Fptr,
215   UINT16    *MachineType,
216   UINT16    *SubSystem
217   )
218 /*++
219 
220 Routine Description:
221 
222   Given the Argc/Argv program arguments, and a pointer to an options structure,
223   parse the command-line options and check their validity.
224 
225 Arguments:
226 
227   Argc            - standard C main() argument count
228   Argv[]          - standard C main() argument list
229   Options         - pointer to a structure to store the options in
230 
231 Returns:
232 
233   STATUS_SUCCESS    success
234   non-zero          otherwise
235 
236 --*/
237 ;
238 
239 static
240 int
241 ProcessEfiFile (
242   FILE      *OutFptr,
243   FILE_LIST *InFile,
244   UINT16    VendId,
245   UINT16    DevId,
246   UINT32    *Size
247   )
248 /*++
249 
250 Routine Description:
251 
252   Process a PE32 EFI file.
253 
254 Arguments:
255 
256   OutFptr     - file pointer to output binary ROM image file we're creating
257   InFile      - structure contains information on the PE32 file to process
258   VendId      - vendor ID as required in the option ROM header
259   DevId       - device ID as required in the option ROM header
260   Size        - pointer to where to return the size added to the output file
261 
262 Returns:
263 
264   0 - successful
265 
266 --*/
267 ;
268 
269 static
270 int
271 ProcessBinFile (
272   FILE      *OutFptr,
273   FILE_LIST *InFile,
274   UINT32    *Size
275   )
276 /*++
277 
278 Routine Description:
279 
280   Process a binary input file.
281 
282 Arguments:
283 
284   OutFptr     - file pointer to output binary ROM image file we're creating
285   InFile      - structure contains information on the binary file to process
286   Size        - pointer to where to return the size added to the output file
287 
288 Returns:
289 
290   0 - successful
291 
292 --*/
293 ;
294 
295 static
296 void
297 DumpImage (
298   FILE_LIST *InFile
299   )
300 /*++
301 
302 Routine Description:
303 
304   Dump the headers of an existing option ROM image
305 
306 Arguments:
307 
308   InFile  - the file name of an existing option ROM image
309 
310 Returns:
311 
312   none
313 
314 --*/
315 ;
316 
317 char                  *
318 GetMachineTypeStr (
319   UINT16    MachineType
320   )
321 /*++
322 
323 Routine Description:
324 
325   GC_TODO: Add function description
326 
327 Arguments:
328 
329   MachineType - GC_TODO: add argument description
330 
331 Returns:
332 
333   GC_TODO: add return values
334 
335 --*/
336 ;
337 
338 static
339 char                  *
340 GetSubsystemTypeStr (
341   UINT16  SubsystemType
342   )
343 /*++
344 
345 Routine Description:
346 
347   GC_TODO: Add function description
348 
349 Arguments:
350 
351   SubsystemType - GC_TODO: add argument description
352 
353 Returns:
354 
355   GC_TODO: add return values
356 
357 --*/
358 ;
359 
360 #endif
361