]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/GenFds/CapsuleData.py
BaseTools: Replace StringIO.StringIO with io.BytesIO
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / CapsuleData.py
CommitLineData
30fdf114
LG
1## @file\r
2# generate capsule\r
3#\r
9eb87141 4# Copyright (c) 2007-2018, Intel Corporation. All rights reserved.<BR>\r
30fdf114 5#\r
40d841f6 6# This program and the accompanying materials\r
30fdf114
LG
7# are licensed and made available under the terms and conditions of the BSD License\r
8# which accompanies this distribution. The full text of the license may be found at\r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14\r
15##\r
16# Import Modules\r
17#\r
18import Ffs\r
19from GenFdsGlobalVariable import GenFdsGlobalVariable\r
86379ac4 20from io import BytesIO\r
a3251d84
YL
21from struct import pack\r
22import os\r
23from Common.Misc import SaveFileOnChange\r
5f53a7aa 24import uuid\r
30fdf114
LG
25\r
26## base class for capsule data\r
27#\r
28#\r
29class CapsuleData:\r
30 ## The constructor\r
31 #\r
32 # @param self The object pointer\r
33 def __init__(self):\r
34 pass\r
35 \r
36 ## generate capsule data\r
37 #\r
38 # @param self The object pointer\r
39 def GenCapsuleSubItem(self):\r
40 pass\r
41 \r
42## FFS class for capsule data\r
43#\r
44#\r
45class CapsuleFfs (CapsuleData):\r
46 ## The constructor\r
47 #\r
48 # @param self The object pointer\r
49 #\r
b36d134f 50 def __init__(self) :\r
30fdf114 51 self.Ffs = None\r
fd171542 52 self.FvName = None\r
30fdf114
LG
53\r
54 ## generate FFS capsule data\r
55 #\r
56 # @param self The object pointer\r
57 # @retval string Generated file name\r
58 #\r
59 def GenCapsuleSubItem(self):\r
60 FfsFile = self.Ffs.GenFfs()\r
61 return FfsFile\r
62\r
63## FV class for capsule data\r
64#\r
65#\r
66class CapsuleFv (CapsuleData):\r
67 ## The constructor\r
68 #\r
69 # @param self The object pointer\r
70 #\r
71 def __init__(self) :\r
fd171542 72 self.Ffs = None\r
30fdf114 73 self.FvName = None\r
fd171542 74 self.CapsuleName = None\r
30fdf114
LG
75\r
76 ## generate FV capsule data\r
77 #\r
78 # @param self The object pointer\r
79 # @retval string Generated file name\r
80 #\r
81 def GenCapsuleSubItem(self):\r
82 if self.FvName.find('.fv') == -1:\r
9eb87141
CJ
83 if self.FvName.upper() in GenFdsGlobalVariable.FdfParser.Profile.FvDict:\r
84 FvObj = GenFdsGlobalVariable.FdfParser.Profile.FvDict[self.FvName.upper()]\r
86379ac4 85 FdBuffer = BytesIO('')\r
fd171542 86 FvObj.CapsuleName = self.CapsuleName\r
30fdf114 87 FvFile = FvObj.AddToBuffer(FdBuffer)\r
fd171542 88 FvObj.CapsuleName = None\r
89 FdBuffer.close()\r
30fdf114 90 return FvFile\r
30fdf114
LG
91 else:\r
92 FvFile = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FvName)\r
93 return FvFile\r
b36d134f
LG
94\r
95## FD class for capsule data\r
96#\r
97#\r
98class CapsuleFd (CapsuleData):\r
99 ## The constructor\r
100 #\r
101 # @param self The object pointer\r
102 #\r
103 def __init__(self) :\r
104 self.Ffs = None\r
105 self.FdName = None\r
106 self.CapsuleName = None\r
107\r
108 ## generate FD capsule data\r
109 #\r
110 # @param self The object pointer\r
111 # @retval string Generated file name\r
112 #\r
113 def GenCapsuleSubItem(self):\r
114 if self.FdName.find('.fd') == -1:\r
9eb87141
CJ
115 if self.FdName.upper() in GenFdsGlobalVariable.FdfParser.Profile.FdDict:\r
116 FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict[self.FdName.upper()]\r
b36d134f
LG
117 FdFile = FdObj.GenFd()\r
118 return FdFile\r
119 else:\r
120 FdFile = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FdName)\r
121 return FdFile\r
122 \r
123## AnyFile class for capsule data\r
124#\r
125#\r
126class CapsuleAnyFile (CapsuleData):\r
127 ## The constructor\r
128 #\r
129 # @param self The object pointer\r
130 #\r
131 def __init__(self) :\r
132 self.Ffs = None\r
133 self.FileName = None\r
134\r
135 ## generate AnyFile capsule data\r
136 #\r
137 # @param self The object pointer\r
138 # @retval string Generated file name\r
139 #\r
2bc3256c
LG
140 def GenCapsuleSubItem(self):\r
141 return self.FileName\r
142 \r
143## Afile class for capsule data\r
144#\r
145#\r
146class CapsuleAfile (CapsuleData):\r
147 ## The constructor\r
148 #\r
149 # @param self The object pointer\r
150 #\r
151 def __init__(self) :\r
152 self.Ffs = None\r
153 self.FileName = None\r
154\r
155 ## generate Afile capsule data\r
156 #\r
157 # @param self The object pointer\r
158 # @retval string Generated file name\r
159 #\r
b36d134f 160 def GenCapsuleSubItem(self):\r
a3251d84
YL
161 return self.FileName\r
162\r
163class CapsulePayload(CapsuleData):\r
164 '''Generate payload file, the header is defined below:\r
165 #pragma pack(1)\r
166 typedef struct {\r
167 UINT32 Version;\r
168 EFI_GUID UpdateImageTypeId;\r
169 UINT8 UpdateImageIndex;\r
170 UINT8 reserved_bytes[3];\r
171 UINT32 UpdateImageSize;\r
172 UINT32 UpdateVendorCodeSize;\r
173 UINT64 UpdateHardwareInstance; //Introduced in v2\r
174 } EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER;\r
175 '''\r
176 def __init__(self):\r
177 self.UiName = None\r
178 self.Version = None\r
179 self.ImageTypeId = None\r
180 self.ImageIndex = None\r
181 self.HardwareInstance = None\r
19e3aa7a
YZ
182 self.ImageFile = []\r
183 self.VendorCodeFile = []\r
91ae2988
YZ
184 self.Certificate_Guid = None\r
185 self.MonotonicCount = None\r
d4c558e8
YZ
186 self.Existed = False\r
187 self.Buffer = None\r
a3251d84 188\r
5f53a7aa 189 def GenCapsuleSubItem(self, AuthData=[]):\r
a3251d84 190 if not self.Version:\r
9ce9bf53
YZ
191 self.Version = '0x00000002'\r
192 if not self.ImageIndex:\r
193 self.ImageIndex = '0x1'\r
194 if not self.HardwareInstance:\r
195 self.HardwareInstance = '0x0'\r
a3251d84 196 ImageFileSize = os.path.getsize(self.ImageFile)\r
5f53a7aa
YZ
197 if AuthData:\r
198 # the ImageFileSize need include the full authenticated info size. From first bytes of MonotonicCount to last bytes of certificate.\r
199 # the 32 bit is the MonotonicCount, dwLength, wRevision, wCertificateType and CertType\r
200 ImageFileSize += 32\r
a3251d84
YL
201 VendorFileSize = 0\r
202 if self.VendorCodeFile:\r
203 VendorFileSize = os.path.getsize(self.VendorCodeFile)\r
204\r
205 #\r
206 # Fill structure\r
207 #\r
208 Guid = self.ImageTypeId.split('-')\r
209 Buffer = pack('=ILHHBBBBBBBBBBBBIIQ',\r
ccaa7754 210 int(self.Version, 16),\r
a3251d84
YL
211 int(Guid[0], 16), \r
212 int(Guid[1], 16), \r
213 int(Guid[2], 16), \r
214 int(Guid[3][-4:-2], 16), \r
215 int(Guid[3][-2:], 16), \r
216 int(Guid[4][-12:-10], 16),\r
217 int(Guid[4][-10:-8], 16),\r
218 int(Guid[4][-8:-6], 16),\r
219 int(Guid[4][-6:-4], 16),\r
220 int(Guid[4][-4:-2], 16),\r
221 int(Guid[4][-2:], 16),\r
222 int(self.ImageIndex, 16),\r
223 0,\r
224 0,\r
225 0,\r
226 ImageFileSize,\r
227 VendorFileSize,\r
228 int(self.HardwareInstance, 16)\r
229 )\r
5f53a7aa
YZ
230 if AuthData:\r
231 Buffer += pack('QIHH', AuthData[0], AuthData[1], AuthData[2], AuthData[3])\r
232 Buffer += uuid.UUID(AuthData[4]).get_bytes_le()\r
233\r
234 #\r
235 # Append file content to the structure\r
236 #\r
237 ImageFile = open(self.ImageFile, 'rb')\r
238 Buffer += ImageFile.read()\r
239 ImageFile.close()\r
240 if self.VendorCodeFile:\r
241 VendorFile = open(self.VendorCodeFile, 'rb')\r
242 Buffer += VendorFile.read()\r
243 VendorFile.close()\r
d4c558e8 244 self.Existed = True\r
a3251d84 245 return Buffer\r