]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/GenFds/CapsuleData.py
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / CapsuleData.py
1 ## @file
2 # generate capsule
3 #
4 # Copyright (c) 2007-2018, Intel Corporation. All rights reserved.<BR>
5 #
6 # SPDX-License-Identifier: BSD-2-Clause-Patent
7 #
8
9 ##
10 # Import Modules
11 #
12 from __future__ import absolute_import
13 from .GenFdsGlobalVariable import GenFdsGlobalVariable
14 from io import BytesIO
15 from struct import pack
16 import os
17 from Common.Misc import SaveFileOnChange
18 import uuid
19
20 ## base class for capsule data
21 #
22 #
23 class CapsuleData:
24 ## The constructor
25 #
26 # @param self The object pointer
27 def __init__(self):
28 pass
29
30 ## generate capsule data
31 #
32 # @param self The object pointer
33 def GenCapsuleSubItem(self):
34 pass
35
36 ## FFS class for capsule data
37 #
38 #
39 class CapsuleFfs (CapsuleData):
40 ## The constructor
41 #
42 # @param self The object pointer
43 #
44 def __init__(self) :
45 self.Ffs = None
46 self.FvName = None
47
48 ## generate FFS capsule data
49 #
50 # @param self The object pointer
51 # @retval string Generated file name
52 #
53 def GenCapsuleSubItem(self):
54 FfsFile = self.Ffs.GenFfs()
55 return FfsFile
56
57 ## FV class for capsule data
58 #
59 #
60 class CapsuleFv (CapsuleData):
61 ## The constructor
62 #
63 # @param self The object pointer
64 #
65 def __init__(self) :
66 self.Ffs = None
67 self.FvName = None
68 self.CapsuleName = None
69
70 ## generate FV capsule data
71 #
72 # @param self The object pointer
73 # @retval string Generated file name
74 #
75 def GenCapsuleSubItem(self):
76 if self.FvName.find('.fv') == -1:
77 if self.FvName.upper() in GenFdsGlobalVariable.FdfParser.Profile.FvDict:
78 FvObj = GenFdsGlobalVariable.FdfParser.Profile.FvDict[self.FvName.upper()]
79 FdBuffer = BytesIO()
80 FvObj.CapsuleName = self.CapsuleName
81 FvFile = FvObj.AddToBuffer(FdBuffer)
82 FvObj.CapsuleName = None
83 FdBuffer.close()
84 return FvFile
85 else:
86 FvFile = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FvName)
87 return FvFile
88
89 ## FD class for capsule data
90 #
91 #
92 class CapsuleFd (CapsuleData):
93 ## The constructor
94 #
95 # @param self The object pointer
96 #
97 def __init__(self) :
98 self.Ffs = None
99 self.FdName = None
100 self.CapsuleName = None
101
102 ## generate FD capsule data
103 #
104 # @param self The object pointer
105 # @retval string Generated file name
106 #
107 def GenCapsuleSubItem(self):
108 if self.FdName.find('.fd') == -1:
109 if self.FdName.upper() in GenFdsGlobalVariable.FdfParser.Profile.FdDict:
110 FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict[self.FdName.upper()]
111 FdFile = FdObj.GenFd()
112 return FdFile
113 else:
114 FdFile = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FdName)
115 return FdFile
116
117 ## AnyFile class for capsule data
118 #
119 #
120 class CapsuleAnyFile (CapsuleData):
121 ## The constructor
122 #
123 # @param self The object pointer
124 #
125 def __init__(self) :
126 self.Ffs = None
127 self.FileName = None
128
129 ## generate AnyFile capsule data
130 #
131 # @param self The object pointer
132 # @retval string Generated file name
133 #
134 def GenCapsuleSubItem(self):
135 return self.FileName
136
137 ## Afile class for capsule data
138 #
139 #
140 class CapsuleAfile (CapsuleData):
141 ## The constructor
142 #
143 # @param self The object pointer
144 #
145 def __init__(self) :
146 self.Ffs = None
147 self.FileName = None
148
149 ## generate Afile capsule data
150 #
151 # @param self The object pointer
152 # @retval string Generated file name
153 #
154 def GenCapsuleSubItem(self):
155 return self.FileName
156
157 class CapsulePayload(CapsuleData):
158 '''Generate payload file, the header is defined below:
159 #pragma pack(1)
160 typedef struct {
161 UINT32 Version;
162 EFI_GUID UpdateImageTypeId;
163 UINT8 UpdateImageIndex;
164 UINT8 reserved_bytes[3];
165 UINT32 UpdateImageSize;
166 UINT32 UpdateVendorCodeSize;
167 UINT64 UpdateHardwareInstance; //Introduced in v2
168 } EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER;
169 '''
170 def __init__(self):
171 self.UiName = None
172 self.Version = None
173 self.ImageTypeId = None
174 self.ImageIndex = None
175 self.HardwareInstance = None
176 self.ImageFile = []
177 self.VendorCodeFile = []
178 self.Certificate_Guid = None
179 self.MonotonicCount = None
180 self.Existed = False
181 self.Buffer = None
182
183 def GenCapsuleSubItem(self, AuthData=[]):
184 if not self.Version:
185 self.Version = '0x00000002'
186 if not self.ImageIndex:
187 self.ImageIndex = '0x1'
188 if not self.HardwareInstance:
189 self.HardwareInstance = '0x0'
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]).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 self.Existed = True
239 return Buffer