1## @file 2# generate capsule 3# 4# Copyright (c) 2007-2013, 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# 18import Ffs 19from GenFdsGlobalVariable import GenFdsGlobalVariable 20import StringIO 21from struct import pack 22import os 23from Common.Misc import SaveFileOnChange 24 25## base class for capsule data 26# 27# 28class CapsuleData: 29 ## The constructor 30 # 31 # @param self The object pointer 32 def __init__(self): 33 pass 34 35 ## generate capsule data 36 # 37 # @param self The object pointer 38 def GenCapsuleSubItem(self): 39 pass 40 41## FFS class for capsule data 42# 43# 44class CapsuleFfs (CapsuleData): 45 ## The constructor 46 # 47 # @param self The object pointer 48 # 49 def __init__(self) : 50 self.Ffs = None 51 self.FvName = None 52 53 ## generate FFS capsule data 54 # 55 # @param self The object pointer 56 # @retval string Generated file name 57 # 58 def GenCapsuleSubItem(self): 59 FfsFile = self.Ffs.GenFfs() 60 return FfsFile 61 62## FV class for capsule data 63# 64# 65class CapsuleFv (CapsuleData): 66 ## The constructor 67 # 68 # @param self The object pointer 69 # 70 def __init__(self) : 71 self.Ffs = None 72 self.FvName = None 73 self.CapsuleName = None 74 75 ## generate FV capsule data 76 # 77 # @param self The object pointer 78 # @retval string Generated file name 79 # 80 def GenCapsuleSubItem(self): 81 if self.FvName.find('.fv') == -1: 82 if self.FvName.upper() in GenFdsGlobalVariable.FdfParser.Profile.FvDict.keys(): 83 FvObj = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(self.FvName.upper()) 84 FdBuffer = StringIO.StringIO('') 85 FvObj.CapsuleName = self.CapsuleName 86 FvFile = FvObj.AddToBuffer(FdBuffer) 87 FvObj.CapsuleName = None 88 FdBuffer.close() 89 return FvFile 90 else: 91 FvFile = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FvName) 92 return FvFile 93 94## FD class for capsule data 95# 96# 97class CapsuleFd (CapsuleData): 98 ## The constructor 99 # 100 # @param self The object pointer 101 # 102 def __init__(self) : 103 self.Ffs = None 104 self.FdName = None 105 self.CapsuleName = None 106 107 ## generate FD capsule data 108 # 109 # @param self The object pointer 110 # @retval string Generated file name 111 # 112 def GenCapsuleSubItem(self): 113 if self.FdName.find('.fd') == -1: 114 if self.FdName.upper() in GenFdsGlobalVariable.FdfParser.Profile.FdDict.keys(): 115 FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict.get(self.FdName.upper()) 116 FdFile = FdObj.GenFd() 117 return FdFile 118 else: 119 FdFile = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FdName) 120 return FdFile 121 122## AnyFile class for capsule data 123# 124# 125class CapsuleAnyFile (CapsuleData): 126 ## The constructor 127 # 128 # @param self The object pointer 129 # 130 def __init__(self) : 131 self.Ffs = None 132 self.FileName = None 133 134 ## generate AnyFile capsule data 135 # 136 # @param self The object pointer 137 # @retval string Generated file name 138 # 139 def GenCapsuleSubItem(self): 140 return self.FileName 141 142## Afile class for capsule data 143# 144# 145class CapsuleAfile (CapsuleData): 146 ## The constructor 147 # 148 # @param self The object pointer 149 # 150 def __init__(self) : 151 self.Ffs = None 152 self.FileName = None 153 154 ## generate Afile capsule data 155 # 156 # @param self The object pointer 157 # @retval string Generated file name 158 # 159 def GenCapsuleSubItem(self): 160 return self.FileName 161 162class CapsulePayload(CapsuleData): 163 '''Generate payload file, the header is defined below: 164 #pragma pack(1) 165 typedef struct { 166 UINT32 Version; 167 EFI_GUID UpdateImageTypeId; 168 UINT8 UpdateImageIndex; 169 UINT8 reserved_bytes[3]; 170 UINT32 UpdateImageSize; 171 UINT32 UpdateVendorCodeSize; 172 UINT64 UpdateHardwareInstance; //Introduced in v2 173 } EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER; 174 ''' 175 def __init__(self): 176 self.UiName = None 177 self.Version = None 178 self.ImageTypeId = None 179 self.ImageIndex = None 180 self.HardwareInstance = None 181 self.ImageFile = None 182 self.VendorCodeFile = None 183 184 def GenCapsuleSubItem(self): 185 if not self.Version: 186 self.Version = 0x00000002 187 ImageFileSize = os.path.getsize(self.ImageFile) 188 VendorFileSize = 0 189 if self.VendorCodeFile: 190 VendorFileSize = os.path.getsize(self.VendorCodeFile) 191 192 # 193 # Fill structure 194 # 195 Guid = self.ImageTypeId.split('-') 196 Buffer = pack('=ILHHBBBBBBBBBBBBIIQ', 197 int(self.Version,16), 198 int(Guid[0], 16), 199 int(Guid[1], 16), 200 int(Guid[2], 16), 201 int(Guid[3][-4:-2], 16), 202 int(Guid[3][-2:], 16), 203 int(Guid[4][-12:-10], 16), 204 int(Guid[4][-10:-8], 16), 205 int(Guid[4][-8:-6], 16), 206 int(Guid[4][-6:-4], 16), 207 int(Guid[4][-4:-2], 16), 208 int(Guid[4][-2:], 16), 209 int(self.ImageIndex, 16), 210 0, 211 0, 212 0, 213 ImageFileSize, 214 VendorFileSize, 215 int(self.HardwareInstance, 16) 216 ) 217 # 218 # Append file content to the structure 219 # 220 ImageFile = open(self.ImageFile, 'rb') 221 Buffer += ImageFile.read() 222 ImageFile.close() 223 if self.VendorCodeFile: 224 VendorFile = open(self.VendorCodeFile, 'rb') 225 Buffer += VendorFile.read() 226 VendorFile.close() 227 return Buffer 228