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 { 0, NULL } 121 }; 122 123 // 124 // Subsystem Types 125 // 126 static STRING_LOOKUP mSubsystemTypes[] = { 127 { EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION, "EFI application" }, 128 { EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER, "EFI boot service driver" }, 129 { EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER, "EFI runtime driver" }, 130 { 0, NULL } 131 }; 132 133 // 134 // Function prototypes 135 // 136 static 137 void 138 Version ( 139 VOID 140 ) 141 /*++ 142 143 Routine Description: 144 145 Displays the utility version to STDOUT 146 147 Arguments: 148 149 None 150 151 Returns: 152 153 None 154 155 --*/ 156 ; 157 158 static 159 void 160 Usage ( 161 VOID 162 ) 163 /*++ 164 165 Routine Description: 166 167 Displays the utility usage syntax to STDOUT 168 169 Arguments: 170 171 None 172 173 Returns: 174 175 None 176 177 --*/ 178 ; 179 180 static 181 int 182 ParseCommandLine ( 183 int Argc, 184 char *Argv[], 185 OPTIONS *Options 186 ) 187 /*++ 188 189 Routine Description: 190 191 Given the Argc/Argv program arguments, and a pointer to an options structure, 192 parse the command-line options and check their validity. 193 194 Arguments: 195 196 Argc - standard C main() argument count 197 Argv[] - standard C main() argument list 198 Options - pointer to a structure to store the options in 199 200 Returns: 201 202 STATUS_SUCCESS success 203 non-zero otherwise 204 205 --*/ 206 ; 207 208 static 209 int 210 CheckPE32File ( 211 FILE *Fptr, 212 UINT16 *MachineType, 213 UINT16 *SubSystem 214 ) 215 /*++ 216 217 Routine Description: 218 219 Given the Argc/Argv program arguments, and a pointer to an options structure, 220 parse the command-line options and check their validity. 221 222 Arguments: 223 224 Argc - standard C main() argument count 225 Argv[] - standard C main() argument list 226 Options - pointer to a structure to store the options in 227 228 Returns: 229 230 STATUS_SUCCESS success 231 non-zero otherwise 232 233 --*/ 234 ; 235 236 static 237 int 238 ProcessEfiFile ( 239 FILE *OutFptr, 240 FILE_LIST *InFile, 241 UINT16 VendId, 242 UINT16 DevId, 243 UINT32 *Size 244 ) 245 /*++ 246 247 Routine Description: 248 249 Process a PE32 EFI file. 250 251 Arguments: 252 253 OutFptr - file pointer to output binary ROM image file we're creating 254 InFile - structure contains information on the PE32 file to process 255 VendId - vendor ID as required in the option ROM header 256 DevId - device ID as required in the option ROM header 257 Size - pointer to where to return the size added to the output file 258 259 Returns: 260 261 0 - successful 262 263 --*/ 264 ; 265 266 static 267 int 268 ProcessBinFile ( 269 FILE *OutFptr, 270 FILE_LIST *InFile, 271 UINT32 *Size 272 ) 273 /*++ 274 275 Routine Description: 276 277 Process a binary input file. 278 279 Arguments: 280 281 OutFptr - file pointer to output binary ROM image file we're creating 282 InFile - structure contains information on the binary file to process 283 Size - pointer to where to return the size added to the output file 284 285 Returns: 286 287 0 - successful 288 289 --*/ 290 ; 291 292 static 293 void 294 DumpImage ( 295 FILE_LIST *InFile 296 ) 297 /*++ 298 299 Routine Description: 300 301 Dump the headers of an existing option ROM image 302 303 Arguments: 304 305 InFile - the file name of an existing option ROM image 306 307 Returns: 308 309 none 310 311 --*/ 312 ; 313 314 char * 315 GetMachineTypeStr ( 316 UINT16 MachineType 317 ) 318 /*++ 319 320 Routine Description: 321 322 GC_TODO: Add function description 323 324 Arguments: 325 326 MachineType - GC_TODO: add argument description 327 328 Returns: 329 330 GC_TODO: add return values 331 332 --*/ 333 ; 334 335 static 336 char * 337 GetSubsystemTypeStr ( 338 UINT16 SubsystemType 339 ) 340 /*++ 341 342 Routine Description: 343 344 GC_TODO: Add function description 345 346 Arguments: 347 348 SubsystemType - GC_TODO: add argument description 349 350 Returns: 351 352 GC_TODO: add return values 353 354 --*/ 355 ; 356 357 #endif 358