Home | History | Annotate | Download | only in GenFds
      1 ## @file

      2 # generate capsule

      3 #

      4 #  Copyright (c) 2007-2016, Intel Corporation. All rights reserved.<BR>

      5 #

      6 #  This program and the accompanying materials

      7 #  are licensed and made available under the terms and conditions of the BSD License

      8 #  which accompanies this distribution.  The full text of the license may be found at

      9 #  http://opensource.org/licenses/bsd-license.php

     10 #

     11 #  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

     12 #  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

     13 #

     14 
     15 ##

     16 # Import Modules

     17 #

     18 import Ffs
     19 from GenFdsGlobalVariable import GenFdsGlobalVariable
     20 import StringIO
     21 from struct import pack
     22 import os
     23 from Common.Misc import SaveFileOnChange
     24 import uuid
     25 
     26 ## base class for capsule data

     27 #

     28 #

     29 class CapsuleData:
     30     ## The constructor

     31     #

     32     #   @param  self        The object pointer

     33     def __init__(self):
     34         pass
     35     
     36     ## generate capsule data

     37     #

     38     #   @param  self        The object pointer

     39     def GenCapsuleSubItem(self):
     40         pass
     41         
     42 ## FFS class for capsule data

     43 #

     44 #

     45 class CapsuleFfs (CapsuleData):
     46     ## The constructor

     47     #

     48     #   @param  self        The object pointer

     49     #

     50     def __init__(self) :
     51         self.Ffs = None
     52         self.FvName = None
     53 
     54     ## generate FFS capsule data

     55     #

     56     #   @param  self        The object pointer

     57     #   @retval string      Generated file name

     58     #

     59     def GenCapsuleSubItem(self):
     60         FfsFile = self.Ffs.GenFfs()
     61         return FfsFile
     62 
     63 ## FV class for capsule data

     64 #

     65 #

     66 class CapsuleFv (CapsuleData):
     67     ## The constructor

     68     #

     69     #   @param  self        The object pointer

     70     #

     71     def __init__(self) :
     72         self.Ffs = None
     73         self.FvName = None
     74         self.CapsuleName = None
     75 
     76     ## generate FV capsule data

     77     #

     78     #   @param  self        The object pointer

     79     #   @retval string      Generated file name

     80     #

     81     def GenCapsuleSubItem(self):
     82         if self.FvName.find('.fv') == -1:
     83             if self.FvName.upper() in GenFdsGlobalVariable.FdfParser.Profile.FvDict.keys():
     84                 FvObj = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(self.FvName.upper())
     85                 FdBuffer = StringIO.StringIO('')
     86                 FvObj.CapsuleName = self.CapsuleName
     87                 FvFile = FvObj.AddToBuffer(FdBuffer)
     88                 FvObj.CapsuleName = None
     89                 FdBuffer.close()
     90                 return FvFile
     91         else:
     92             FvFile = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FvName)
     93             return FvFile
     94 
     95 ## FD class for capsule data

     96 #

     97 #

     98 class CapsuleFd (CapsuleData):
     99     ## The constructor

    100     #

    101     #   @param  self        The object pointer

    102     #

    103     def __init__(self) :
    104         self.Ffs = None
    105         self.FdName = None
    106         self.CapsuleName = None
    107 
    108     ## generate FD capsule data

    109     #

    110     #   @param  self        The object pointer

    111     #   @retval string      Generated file name

    112     #

    113     def GenCapsuleSubItem(self):
    114         if self.FdName.find('.fd') == -1:
    115             if self.FdName.upper() in GenFdsGlobalVariable.FdfParser.Profile.FdDict.keys():
    116                 FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict.get(self.FdName.upper())
    117                 FdFile = FdObj.GenFd()
    118                 return FdFile
    119         else:
    120             FdFile = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FdName)
    121             return FdFile
    122         
    123 ## AnyFile class for capsule data

    124 #

    125 #

    126 class CapsuleAnyFile (CapsuleData):
    127     ## The constructor

    128     #

    129     #   @param  self        The object pointer

    130     #

    131     def __init__(self) :
    132         self.Ffs = None
    133         self.FileName = None
    134 
    135     ## generate AnyFile capsule data

    136     #

    137     #   @param  self        The object pointer

    138     #   @retval string      Generated file name

    139     #

    140     def GenCapsuleSubItem(self):
    141         return self.FileName
    142     
    143 ## Afile class for capsule data

    144 #

    145 #

    146 class CapsuleAfile (CapsuleData):
    147     ## The constructor

    148     #

    149     #   @param  self        The object pointer

    150     #

    151     def __init__(self) :
    152         self.Ffs = None
    153         self.FileName = None
    154 
    155     ## generate Afile capsule data

    156     #

    157     #   @param  self        The object pointer

    158     #   @retval string      Generated file name

    159     #

    160     def GenCapsuleSubItem(self):
    161         return self.FileName
    162 
    163 class CapsulePayload(CapsuleData):
    164     '''Generate payload file, the header is defined below:
    165     #pragma pack(1)
    166     typedef struct {
    167         UINT32 Version;
    168         EFI_GUID UpdateImageTypeId;
    169         UINT8 UpdateImageIndex;
    170         UINT8 reserved_bytes[3];
    171         UINT32 UpdateImageSize;
    172         UINT32 UpdateVendorCodeSize;
    173         UINT64 UpdateHardwareInstance; //Introduced in v2
    174     } EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER;
    175     '''
    176     def __init__(self):
    177         self.UiName = None
    178         self.Version = None
    179         self.ImageTypeId = None
    180         self.ImageIndex = None
    181         self.HardwareInstance = None
    182         self.ImageFile = []
    183         self.VendorCodeFile = []
    184         self.Certificate_Guid = None
    185         self.MonotonicCount = None
    186 
    187     def GenCapsuleSubItem(self, AuthData=[]):
    188         if not self.Version:
    189             self.Version = 0x00000002
    190         ImageFileSize = os.path.getsize(self.ImageFile)
    191         if AuthData:
    192             # the ImageFileSize need include the full authenticated info size. From first bytes of MonotonicCount to last bytes of certificate.

    193             # the 32 bit is the MonotonicCount, dwLength, wRevision, wCertificateType and CertType

    194             ImageFileSize += 32
    195         VendorFileSize = 0
    196         if self.VendorCodeFile:
    197             VendorFileSize = os.path.getsize(self.VendorCodeFile)
    198 
    199         #

    200         # Fill structure

    201         #

    202         Guid = self.ImageTypeId.split('-')
    203         Buffer = pack('=ILHHBBBBBBBBBBBBIIQ',
    204                        int(self.Version,16),
    205                        int(Guid[0], 16), 
    206                        int(Guid[1], 16), 
    207                        int(Guid[2], 16), 
    208                        int(Guid[3][-4:-2], 16), 
    209                        int(Guid[3][-2:], 16),  
    210                        int(Guid[4][-12:-10], 16),
    211                        int(Guid[4][-10:-8], 16),
    212                        int(Guid[4][-8:-6], 16),
    213                        int(Guid[4][-6:-4], 16),
    214                        int(Guid[4][-4:-2], 16),
    215                        int(Guid[4][-2:], 16),
    216                        int(self.ImageIndex, 16),
    217                        0,
    218                        0,
    219                        0,
    220                        ImageFileSize,
    221                        VendorFileSize,
    222                        int(self.HardwareInstance, 16)
    223                        )
    224         if AuthData:
    225             Buffer += pack('QIHH', AuthData[0], AuthData[1], AuthData[2], AuthData[3])
    226             Buffer += uuid.UUID(AuthData[4]).get_bytes_le()
    227 
    228         #

    229         # Append file content to the structure

    230         #

    231         ImageFile = open(self.ImageFile, 'rb')
    232         Buffer += ImageFile.read()
    233         ImageFile.close()
    234         if self.VendorCodeFile:
    235             VendorFile = open(self.VendorCodeFile, 'rb')
    236             Buffer += VendorFile.read()
    237             VendorFile.close()
    238         return Buffer
    239