Home | History | Annotate | Download | only in EfiRom
      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