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