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