]>
git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/GenFds/Capsule.py
4 # Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
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
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.
18 from GenFdsGlobalVariable
import GenFdsGlobalVariable
19 from CommonDataClass
.FdfClass
import CapsuleClassObject
20 import Common
.LongFilePathOs
as os
23 from Common
.Misc
import SaveFileOnChange
24 from GenFds
import GenFds
25 from Common
.Misc
import PackRegistryFormatGuid
27 from struct
import pack
32 ## create inf file describes what goes into capsule and call GenFv to generate capsule
35 class Capsule (CapsuleClassObject
) :
38 # @param self The object pointer
41 CapsuleClassObject
.__init
__(self
)
46 self
.CapsuleName
= None
48 ## Generate FMP capsule
50 # @retval string Generated Capsule file path
52 def GenFmpCapsule(self
):
54 # Generate capsule header
56 # EFI_GUID CapsuleGuid;
59 # UINT32 CapsuleImageSize;
60 # } EFI_CAPSULE_HEADER;
62 Header
= StringIO
.StringIO()
64 # Use FMP capsule GUID: 6DCBD5ED-E82D-4C44-BDA1-7194199AD92A
66 Header
.write(PackRegistryFormatGuid('6DCBD5ED-E82D-4C44-BDA1-7194199AD92A'))
68 if 'CAPSULE_HEADER_SIZE' in self
.TokensDict
:
69 Header
.write(pack('=I', int(self
.TokensDict
['CAPSULE_HEADER_SIZE'], 16)))
70 HdrSize
= int(self
.TokensDict
['CAPSULE_HEADER_SIZE'], 16)
72 Header
.write(pack('=I', 0x20))
75 if 'CAPSULE_FLAGS' in self
.TokensDict
:
76 for flag
in self
.TokensDict
['CAPSULE_FLAGS'].split(','):
78 if flag
== 'PopulateSystemTable':
79 Flags |
= 0x00010000 |
0x00020000
80 elif flag
== 'PersistAcrossReset':
82 elif flag
== 'InitiateReset':
84 Header
.write(pack('=I', Flags
))
88 # UINT16 EmbeddedDriverCount;
89 # UINT16 PayloadItemCount;
90 # // UINT64 ItemOffsetList[];
91 # } EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER;
93 FwMgrHdr
= StringIO
.StringIO()
94 if 'CAPSULE_HEADER_INIT_VERSION' in self
.TokensDict
:
95 FwMgrHdr
.write(pack('=I', int(self
.TokensDict
['CAPSULE_HEADER_INIT_VERSION'], 16)))
97 FwMgrHdr
.write(pack('=I', 0x00000001))
98 FwMgrHdr
.write(pack('=HH', len(self
.CapsuleDataList
), len(self
.FmpPayloadList
)))
99 FwMgrHdrSize
= 4+2+2+8*(len(self
.CapsuleDataList
)+len(self
.FmpPayloadList
))
101 PreSize
= FwMgrHdrSize
102 Content
= StringIO
.StringIO()
103 for driver
in self
.CapsuleDataList
:
104 FileName
= driver
.GenCapsuleSubItem()
105 FwMgrHdr
.write(pack('=Q', PreSize
))
106 PreSize
+= os
.path
.getsize(FileName
)
107 File
= open(FileName
, 'rb')
108 Content
.write(File
.read())
110 for fmp
in self
.FmpPayloadList
:
111 payload
= fmp
.GenCapsuleSubItem()
112 FwMgrHdr
.write(pack('=Q', PreSize
))
113 PreSize
+= len(payload
)
114 Content
.write(payload
)
115 BodySize
= len(FwMgrHdr
.getvalue()) + len(Content
.getvalue())
116 Header
.write(pack('=I', HdrSize
+ BodySize
))
118 # The real capsule header structure is 28 bytes
120 Header
.write('\x00'*(HdrSize
-28))
121 Header
.write(FwMgrHdr
.getvalue())
122 Header
.write(Content
.getvalue())
124 # Generate FMP capsule file
126 CapOutputFile
= os
.path
.join(GenFdsGlobalVariable
.FvDir
, self
.UiCapsuleName
) + '.Cap'
127 SaveFileOnChange(CapOutputFile
, Header
.getvalue(), True)
132 # @param self The object pointer
133 # @retval string Generated Capsule file path
135 def GenCapsule(self
):
136 if self
.UiCapsuleName
.upper() + 'cap' in GenFds
.ImageBinDict
.keys():
137 return GenFds
.ImageBinDict
[self
.UiCapsuleName
.upper() + 'cap']
139 GenFdsGlobalVariable
.InfLogger( "\nGenerate %s Capsule" %self
.UiCapsuleName
)
140 if ('CAPSULE_GUID' in self
.TokensDict
and
141 uuid
.UUID(self
.TokensDict
['CAPSULE_GUID']) == uuid
.UUID('6DCBD5ED-E82D-4C44-BDA1-7194199AD92A')):
142 return self
.GenFmpCapsule()
144 CapInfFile
= self
.GenCapInf()
145 CapInfFile
.writelines("[files]" + T_CHAR_LF
)
147 for CapsuleDataObj
in self
.CapsuleDataList
:
148 CapsuleDataObj
.CapsuleName
= self
.CapsuleName
149 FileName
= CapsuleDataObj
.GenCapsuleSubItem()
150 CapsuleDataObj
.CapsuleName
= None
151 CapFileList
.append(FileName
)
152 CapInfFile
.writelines("EFI_FILE_NAME = " + \
155 SaveFileOnChange(self
.CapInfFileName
, CapInfFile
.getvalue(), False)
158 # Call GenFv tool to generate capsule
160 CapOutputFile
= os
.path
.join(GenFdsGlobalVariable
.FvDir
, self
.UiCapsuleName
)
161 CapOutputFile
= CapOutputFile
+ '.Cap'
162 GenFdsGlobalVariable
.GenerateFirmwareVolume(
164 [self
.CapInfFileName
],
169 GenFdsGlobalVariable
.VerboseLogger( "\nGenerate %s Capsule Successfully" %self
.UiCapsuleName
)
170 GenFdsGlobalVariable
.SharpCounter
= 0
171 GenFds
.ImageBinDict
[self
.UiCapsuleName
.upper() + 'cap'] = CapOutputFile
174 ## Generate inf file for capsule
176 # @param self The object pointer
177 # @retval file inf file object
180 self
.CapInfFileName
= os
.path
.join(GenFdsGlobalVariable
.FvDir
,
181 self
.UiCapsuleName
+ "_Cap" + '.inf')
182 CapInfFile
= StringIO
.StringIO() #open (self.CapInfFileName , 'w+')
184 CapInfFile
.writelines("[options]" + T_CHAR_LF
)
186 for Item
in self
.TokensDict
.keys():
187 CapInfFile
.writelines("EFI_" + \
190 self
.TokensDict
.get(Item
) + \