• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1## @file
2# generate capsule
3#
4#  Copyright (c) 2007-2013, Intel Corporation. All rights reserved.<BR>
5#
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
10#
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.
13#
14
15##
16# Import Modules
17#
18import Ffs
19from GenFdsGlobalVariable import GenFdsGlobalVariable
20import StringIO
21from struct import pack
22import os
23from Common.Misc import SaveFileOnChange
24
25## base class for capsule data
26#
27#
28class CapsuleData:
29    ## The constructor
30    #
31    #   @param  self        The object pointer
32    def __init__(self):
33        pass
34
35    ## generate capsule data
36    #
37    #   @param  self        The object pointer
38    def GenCapsuleSubItem(self):
39        pass
40
41## FFS class for capsule data
42#
43#
44class CapsuleFfs (CapsuleData):
45    ## The constructor
46    #
47    #   @param  self        The object pointer
48    #
49    def __init__(self) :
50        self.Ffs = None
51        self.FvName = None
52
53    ## generate FFS capsule data
54    #
55    #   @param  self        The object pointer
56    #   @retval string      Generated file name
57    #
58    def GenCapsuleSubItem(self):
59        FfsFile = self.Ffs.GenFfs()
60        return FfsFile
61
62## FV class for capsule data
63#
64#
65class CapsuleFv (CapsuleData):
66    ## The constructor
67    #
68    #   @param  self        The object pointer
69    #
70    def __init__(self) :
71        self.Ffs = None
72        self.FvName = None
73        self.CapsuleName = None
74
75    ## generate FV capsule data
76    #
77    #   @param  self        The object pointer
78    #   @retval string      Generated file name
79    #
80    def GenCapsuleSubItem(self):
81        if self.FvName.find('.fv') == -1:
82            if self.FvName.upper() in GenFdsGlobalVariable.FdfParser.Profile.FvDict.keys():
83                FvObj = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(self.FvName.upper())
84                FdBuffer = StringIO.StringIO('')
85                FvObj.CapsuleName = self.CapsuleName
86                FvFile = FvObj.AddToBuffer(FdBuffer)
87                FvObj.CapsuleName = None
88                FdBuffer.close()
89                return FvFile
90        else:
91            FvFile = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FvName)
92            return FvFile
93
94## FD class for capsule data
95#
96#
97class CapsuleFd (CapsuleData):
98    ## The constructor
99    #
100    #   @param  self        The object pointer
101    #
102    def __init__(self) :
103        self.Ffs = None
104        self.FdName = None
105        self.CapsuleName = None
106
107    ## generate FD capsule data
108    #
109    #   @param  self        The object pointer
110    #   @retval string      Generated file name
111    #
112    def GenCapsuleSubItem(self):
113        if self.FdName.find('.fd') == -1:
114            if self.FdName.upper() in GenFdsGlobalVariable.FdfParser.Profile.FdDict.keys():
115                FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict.get(self.FdName.upper())
116                FdFile = FdObj.GenFd()
117                return FdFile
118        else:
119            FdFile = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FdName)
120            return FdFile
121
122## AnyFile class for capsule data
123#
124#
125class CapsuleAnyFile (CapsuleData):
126    ## The constructor
127    #
128    #   @param  self        The object pointer
129    #
130    def __init__(self) :
131        self.Ffs = None
132        self.FileName = None
133
134    ## generate AnyFile capsule data
135    #
136    #   @param  self        The object pointer
137    #   @retval string      Generated file name
138    #
139    def GenCapsuleSubItem(self):
140        return self.FileName
141
142## Afile class for capsule data
143#
144#
145class CapsuleAfile (CapsuleData):
146    ## The constructor
147    #
148    #   @param  self        The object pointer
149    #
150    def __init__(self) :
151        self.Ffs = None
152        self.FileName = None
153
154    ## generate Afile capsule data
155    #
156    #   @param  self        The object pointer
157    #   @retval string      Generated file name
158    #
159    def GenCapsuleSubItem(self):
160        return self.FileName
161
162class CapsulePayload(CapsuleData):
163    '''Generate payload file, the header is defined below:
164    #pragma pack(1)
165    typedef struct {
166        UINT32 Version;
167        EFI_GUID UpdateImageTypeId;
168        UINT8 UpdateImageIndex;
169        UINT8 reserved_bytes[3];
170        UINT32 UpdateImageSize;
171        UINT32 UpdateVendorCodeSize;
172        UINT64 UpdateHardwareInstance; //Introduced in v2
173    } EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER;
174    '''
175    def __init__(self):
176        self.UiName = None
177        self.Version = None
178        self.ImageTypeId = None
179        self.ImageIndex = None
180        self.HardwareInstance = None
181        self.ImageFile = None
182        self.VendorCodeFile = None
183
184    def GenCapsuleSubItem(self):
185        if not self.Version:
186            self.Version = 0x00000002
187        ImageFileSize = os.path.getsize(self.ImageFile)
188        VendorFileSize = 0
189        if self.VendorCodeFile:
190            VendorFileSize = os.path.getsize(self.VendorCodeFile)
191
192        #
193        # Fill structure
194        #
195        Guid = self.ImageTypeId.split('-')
196        Buffer = pack('=ILHHBBBBBBBBBBBBIIQ',
197                       int(self.Version,16),
198                       int(Guid[0], 16),
199                       int(Guid[1], 16),
200                       int(Guid[2], 16),
201                       int(Guid[3][-4:-2], 16),
202                       int(Guid[3][-2:], 16),
203                       int(Guid[4][-12:-10], 16),
204                       int(Guid[4][-10:-8], 16),
205                       int(Guid[4][-8:-6], 16),
206                       int(Guid[4][-6:-4], 16),
207                       int(Guid[4][-4:-2], 16),
208                       int(Guid[4][-2:], 16),
209                       int(self.ImageIndex, 16),
210                       0,
211                       0,
212                       0,
213                       ImageFileSize,
214                       VendorFileSize,
215                       int(self.HardwareInstance, 16)
216                       )
217        #
218        # Append file content to the structure
219        #
220        ImageFile = open(self.ImageFile, 'rb')
221        Buffer += ImageFile.read()
222        ImageFile.close()
223        if self.VendorCodeFile:
224            VendorFile = open(self.VendorCodeFile, 'rb')
225            Buffer += VendorFile.read()
226            VendorFile.close()
227        return Buffer
228