## @file\r
# parse FDF file\r
#\r
-# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>\r
# Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>\r
#\r
# This program and the accompanying materials\r
from Common.Expression import *\r
from Common import GlobalData\r
from Common.String import ReplaceMacro\r
-\r
+import uuid\r
from Common.Misc import tdict\r
-\r
-import re\r
+from Common.MultipleWorkspace import MultipleWorkspace as mws\r
import Common.LongFilePathOs as os\r
from Common.LongFilePathSupport import OpenLongFilePath as open\r
+from Capsule import EFI_CERT_TYPE_PKCS7_GUID\r
+from Capsule import EFI_CERT_TYPE_RSA2048_SHA256_GUID\r
\r
##define T_CHAR_SPACE ' '\r
##define T_CHAR_NULL '\0'\r
if Profile.IsLineInFile(Line):\r
return Profile.GetLineInFile(Line)\r
elif Line >= Profile.InsertStartLineNumber and Profile.Level == 1:\r
- InsertedLines += Profile.GetTotalLines()\r
+ InsertedLines += Profile.GetTotalLines()\r
\r
return (File, Line - InsertedLines)\r
\r
fsock = open(FileName, "rb", 0)\r
try:\r
self.FileLinesList = fsock.readlines()\r
+ for index, line in enumerate(self.FileLinesList):\r
+ if not line.endswith('\n'):\r
+ self.FileLinesList[index] += '\n'\r
+\r
finally:\r
fsock.close()\r
\r
TotalLines = self.InsertAdjust + len(self.FileLinesList)\r
\r
for Profile in self.IncludeFileList:\r
- TotalLines += Profile.GetTotalLines()\r
+ TotalLines += Profile.GetTotalLines()\r
\r
return TotalLines\r
\r
\r
self.PcdDict = {}\r
self.InfList = []\r
+ self.InfDict = {'ArchTBD':[]}\r
# ECC will use this Dict and List information\r
self.PcdFileLineDict = {}\r
self.InfFileLineList = []\r
def PreprocessIncludeFile(self):\r
# nested include support\r
Processed = False\r
+ MacroDict = {}\r
while self.__GetNextToken():\r
\r
- if self.__Token == '!include':\r
+ if self.__Token == 'DEFINE':\r
+ if not self.__GetNextToken():\r
+ raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)\r
+ Macro = self.__Token\r
+ if not self.__IsToken( "="):\r
+ raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+ Value = self.__GetExpression()\r
+ MacroDict[Macro] = Value\r
+\r
+ elif self.__Token == '!include':\r
Processed = True\r
IncludeLine = self.CurrentLineNumber\r
IncludeOffset = self.CurrentOffsetWithinLine - len('!include')\r
if not self.__GetNextToken():\r
raise Warning("expected include file name", self.FileName, self.CurrentLineNumber)\r
IncFileName = self.__Token\r
- __IncludeMacros = {}\r
- for Macro in ['WORKSPACE', 'ECP_SOURCE', 'EFI_SOURCE', 'EDK_SOURCE']:\r
+ PreIndex = 0\r
+ StartPos = IncFileName.find('$(', PreIndex)\r
+ EndPos = IncFileName.find(')', StartPos+2)\r
+ while StartPos != -1 and EndPos != -1:\r
+ Macro = IncFileName[StartPos+2 : EndPos]\r
MacroVal = self.__GetMacroValue(Macro)\r
- if MacroVal:\r
- __IncludeMacros[Macro] = MacroVal\r
+ if not MacroVal:\r
+ if Macro in MacroDict:\r
+ MacroVal = MacroDict[Macro]\r
+ if MacroVal != None:\r
+ IncFileName = IncFileName.replace('$(' + Macro + ')', MacroVal, 1)\r
+ if MacroVal.find('$(') != -1:\r
+ PreIndex = StartPos\r
+ else:\r
+ PreIndex = StartPos + len(MacroVal)\r
+ else:\r
+ raise Warning("The Macro %s is not defined" %Macro, self.FileName, self.CurrentLineNumber)\r
+ StartPos = IncFileName.find('$(', PreIndex)\r
+ EndPos = IncFileName.find(')', StartPos+2)\r
\r
- try:\r
- IncludedFile = NormPath(ReplaceMacro(IncFileName, __IncludeMacros, RaiseError=True))\r
- except:\r
- raise Warning("only these system environment variables are permitted to start the path of the included file: "\r
- "$(WORKSPACE), $(ECP_SOURCE), $(EFI_SOURCE), $(EDK_SOURCE)",\r
- self.FileName, self.CurrentLineNumber)\r
+ IncludedFile = NormPath(IncFileName)\r
#\r
# First search the include file under the same directory as FDF file\r
#\r
self.__UndoToken()\r
return False\r
\r
+ def __Verify(self, Name, Value, Scope):\r
+ if Scope in ['UINT64', 'UINT8']:\r
+ ValueNumber = 0\r
+ try:\r
+ if Value.upper().startswith('0X'):\r
+ ValueNumber = int (Value, 16)\r
+ else:\r
+ ValueNumber = int (Value)\r
+ except:\r
+ EdkLogger.error("FdfParser", FORMAT_INVALID, "The value is not valid dec or hex number for %s." % Name)\r
+ if ValueNumber < 0:\r
+ EdkLogger.error("FdfParser", FORMAT_INVALID, "The value can't be set to negative value for %s." % Name)\r
+ if Scope == 'UINT64':\r
+ if ValueNumber >= 0x10000000000000000:\r
+ EdkLogger.error("FdfParser", FORMAT_INVALID, "Too large value for %s." % Name)\r
+ if Scope == 'UINT8':\r
+ if ValueNumber >= 0x100:\r
+ EdkLogger.error("FdfParser", FORMAT_INVALID, "Too large value for %s." % Name)\r
+ return True\r
+\r
## __UndoToken() method\r
#\r
# Go back one token unit in file buffer\r
\r
try:\r
self.Preprocess()\r
- while self.__GetFd():\r
- pass\r
-\r
- while self.__GetFv():\r
- pass\r
-\r
- while self.__GetFmp():\r
- pass\r
-\r
- while self.__GetCapsule():\r
- pass\r
-\r
- while self.__GetVtf():\r
- pass\r
-\r
- while self.__GetRule():\r
- pass\r
- \r
- while self.__GetOptionRom():\r
+ #\r
+ # Keep processing sections of the FDF until no new sections or a syntax error is found\r
+ #\r
+ while self.__GetFd() or self.__GetFv() or self.__GetFmp() or self.__GetCapsule() or self.__GetVtf() or self.__GetRule() or self.__GetOptionRom():\r
pass\r
\r
except Warning, X:\r
% (FileLineTuple[1], self.CurrentOffsetWithinLine + 1, self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :].rstrip('\n').rstrip('\r'))\r
raise\r
\r
+ ## SectionParser() method\r
+ #\r
+ # Parse the file section info\r
+ # Exception will be raised if syntax error found\r
+ #\r
+ # @param self The object pointer\r
+ # @param section The section string\r
+\r
+ def SectionParser(self, section):\r
+ S = section.upper()\r
+ if not S.startswith("[DEFINES") and not S.startswith("[FD.") and not S.startswith("[FV.") and not S.startswith("[CAPSULE.") \\r
+ and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM.") and not S.startswith('[FMPPAYLOAD.'):\r
+ raise Warning("Unknown section or section appear sequence error (The correct sequence should be [DEFINES], [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.], [FMPPAYLOAD.])", self.FileName, self.CurrentLineNumber)\r
+\r
## __GetDefines() method\r
#\r
# Get Defines section contents and store its data into AllMacrosList\r
\r
S = self.__Token.upper()\r
if S.startswith("[") and not S.startswith("[DEFINES"):\r
- if not S.startswith("[FD.") and not S.startswith("[FV.") and not S.startswith("[CAPSULE.") \\r
- and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
- raise Warning("Unknown section or section appear sequence error (The correct sequence should be [DEFINES], [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)\r
+ self.SectionParser(S)\r
self.__UndoToken()\r
return False\r
\r
raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
\r
RegionObj.RegionType = "FV"\r
- RegionObj.RegionDataList.append(self.__Token)\r
+ RegionObj.RegionDataList.append((self.__Token).upper())\r
\r
while self.__IsKeyword( "FV"):\r
\r
if not self.__GetNextToken():\r
raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
\r
- RegionObj.RegionDataList.append(self.__Token)\r
+ RegionObj.RegionDataList.append((self.__Token).upper())\r
\r
## __GetRegionCapType() method\r
#\r
\r
S = self.__Token.upper()\r
if S.startswith("[") and not S.startswith("[FV."):\r
- if not S.startswith('[FMPPAYLOAD.') and not S.startswith("[CAPSULE.") \\r
- and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
- raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)\r
+ self.SectionParser(S)\r
self.__UndoToken()\r
return False\r
\r
"WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \\r
"READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \\r
"READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \\r
- "WRITE_POLICY_RELIABLE", "WEAK_ALIGNMENT"):\r
+ "WRITE_POLICY_RELIABLE", "WEAK_ALIGNMENT", "FvUsedSizeEnable"):\r
self.__UndoToken()\r
return False\r
\r
\r
def __GetFvExtEntryStatement(self, FvObj):\r
\r
- if not self.__IsKeyword( "FV_EXT_ENTRY"):\r
+ if not (self.__IsKeyword( "FV_EXT_ENTRY") or self.__IsKeyword( "FV_EXT_ENTRY_TYPE")):\r
return False\r
\r
if not self.__IsKeyword ("TYPE"):\r
self.Profile.InfList.append(ffsInf.InfFileName)\r
FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
self.Profile.InfFileLineList.append(FileLineTuple)\r
+ if ffsInf.UseArch:\r
+ if ffsInf.UseArch not in self.Profile.InfDict:\r
+ self.Profile.InfDict[ffsInf.UseArch] = [ffsInf.InfFileName]\r
+ else:\r
+ self.Profile.InfDict[ffsInf.UseArch].append(ffsInf.InfFileName)\r
+ else:\r
+ self.Profile.InfDict['ArchTBD'].append(ffsInf.InfFileName)\r
\r
if self.__IsToken('|'):\r
if self.__IsKeyword('RELOCS_STRIPPED'):\r
while True:\r
AlignValue = None\r
if self.__GetAlignment():\r
- if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
+ if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
+ "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
- AlignValue = self.__Token\r
+ #For FFS, Auto is default option same to ""\r
+ if not self.__Token == "Auto":\r
+ AlignValue = self.__Token\r
if not self.__GetNextToken():\r
raise Warning("expected Filename value", self.FileName, self.CurrentLineNumber)\r
\r
FfsFileObj.CheckSum = True\r
\r
if self.__GetAlignment():\r
- if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
+ if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
+ "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
#For FFS, Auto is default option same to ""\r
if not self.__Token == "Auto":\r
\r
AlignValue = None\r
if self.__GetAlignment():\r
- if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
+ if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
+ "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
AlignValue = self.__Token\r
\r
\r
AlignValue = None\r
if self.__GetAlignment():\r
- if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
+ if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
+ "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
AlignValue = self.__Token\r
\r
if not self.__GetNextToken():\r
return False\r
S = self.__Token.upper()\r
- if not S.startswith("[FMPPAYLOAD."):\r
- if not S.startswith("[CAPSULE.") and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
- raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [FmpPayload.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)\r
+ if S.startswith("[") and not S.startswith("[FMPPAYLOAD."):\r
+ self.SectionParser(S)\r
self.__UndoToken()\r
return False\r
\r
\r
if not self.__GetNextToken():\r
raise Warning("The FMP payload section is empty!", self.FileName, self.CurrentLineNumber)\r
- FmpKeyList = ['IMAGE_HEADER_INIT_VERSION', 'IMAGE_TYPE_ID', 'IMAGE_INDEX', 'HARDWARE_INSTANCE']\r
+ FmpKeyList = ['IMAGE_HEADER_INIT_VERSION', 'IMAGE_TYPE_ID', 'IMAGE_INDEX', 'HARDWARE_INSTANCE', 'CERTIFICATE_GUID', 'MONOTONIC_COUNT']\r
while self.__Token in FmpKeyList:\r
Name = self.__Token\r
FmpKeyList.remove(Name)\r
raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
if Name == 'IMAGE_TYPE_ID':\r
if not self.__GetNextGuid():\r
- raise Warning("expected GUID value for IMAGE_TYPE_ID", self.FileName, self.CurrentLineNumber)\r
+ raise Warning("expected GUID value for IMAGE_TYPE_ID.", self.FileName, self.CurrentLineNumber)\r
FmpData.ImageTypeId = self.__Token\r
+ elif Name == 'CERTIFICATE_GUID':\r
+ if not self.__GetNextGuid():\r
+ raise Warning("expected GUID value for CERTIFICATE_GUID.", self.FileName, self.CurrentLineNumber)\r
+ FmpData.Certificate_Guid = self.__Token\r
+ if uuid.UUID(FmpData.Certificate_Guid) != EFI_CERT_TYPE_RSA2048_SHA256_GUID and uuid.UUID(FmpData.Certificate_Guid) != EFI_CERT_TYPE_PKCS7_GUID:\r
+ raise Warning("Only support EFI_CERT_TYPE_RSA2048_SHA256_GUID or EFI_CERT_TYPE_PKCS7_GUID for CERTIFICATE_GUID.", self.FileName, self.CurrentLineNumber)\r
else:\r
if not self.__GetNextToken():\r
raise Warning("expected value of %s" % Name, self.FileName, self.CurrentLineNumber)\r
Value = self.__Token\r
if Name == 'IMAGE_HEADER_INIT_VERSION':\r
- FmpData.Version = Value\r
+ if self.__Verify(Name, Value, 'UINT8'):\r
+ FmpData.Version = Value\r
elif Name == 'IMAGE_INDEX':\r
- FmpData.ImageIndex = Value\r
+ if self.__Verify(Name, Value, 'UINT8'):\r
+ FmpData.ImageIndex = Value\r
elif Name == 'HARDWARE_INSTANCE':\r
- FmpData.HardwareInstance = Value\r
+ if self.__Verify(Name, Value, 'UINT8'):\r
+ FmpData.HardwareInstance = Value\r
+ elif Name == 'MONOTONIC_COUNT':\r
+ if self.__Verify(Name, Value, 'UINT64'):\r
+ FmpData.MonotonicCount = Value\r
+ if FmpData.MonotonicCount.upper().startswith('0X'):\r
+ FmpData.MonotonicCount = (long)(FmpData.MonotonicCount, 16)\r
+ else:\r
+ FmpData.MonotonicCount = (long)(FmpData.MonotonicCount)\r
if not self.__GetNextToken():\r
break\r
else:\r
self.__UndoToken()\r
\r
- if FmpKeyList:\r
- raise Warning("Missing keywords %s in FMP payload section" % ', '.join(FmpKeyList), self.FileName, self.CurrentLineNumber)\r
- ImageFile = self.__ParseRawFileStatement()\r
- if not ImageFile:\r
- raise Warning("Missing image file in FMP payload section", self.FileName, self.CurrentLineNumber)\r
- FmpData.ImageFile = ImageFile\r
- VendorCodeFile = self.__ParseRawFileStatement()\r
- if VendorCodeFile:\r
- FmpData.VendorCodeFile = VendorCodeFile\r
+ if (FmpData.MonotonicCount and not FmpData.Certificate_Guid) or (not FmpData.MonotonicCount and FmpData.Certificate_Guid):\r
+ EdkLogger.error("FdfParser", FORMAT_INVALID, "CERTIFICATE_GUID and MONOTONIC_COUNT must be work as a pair.")\r
+\r
+ # Only the IMAGE_TYPE_ID is required item\r
+ if FmpKeyList and 'IMAGE_TYPE_ID' in FmpKeyList:\r
+ raise Warning("Missing keywords IMAGE_TYPE_ID in FMP payload section.", self.FileName, self.CurrentLineNumber)\r
+ # get the Image file and Vendor code file\r
+ self.__GetFMPCapsuleData(FmpData)\r
+ if not FmpData.ImageFile:\r
+ raise Warning("Missing image file in FMP payload section.", self.FileName, self.CurrentLineNumber)\r
+ # check whether more than one Vendor code file\r
+ if len(FmpData.VendorCodeFile) > 1:\r
+ raise Warning("At most one Image file and one Vendor code file are allowed in FMP payload section.", self.FileName, self.CurrentLineNumber)\r
self.Profile.FmpPayloadDict[FmpUiName] = FmpData\r
return True\r
\r
\r
S = self.__Token.upper()\r
if S.startswith("[") and not S.startswith("[CAPSULE."):\r
- if not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
- raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)\r
+ self.SectionParser(S)\r
self.__UndoToken()\r
return False\r
\r
if not (IsInf or IsFile or IsFv or IsFd or IsAnyFile or IsAfile or IsFmp):\r
break\r
\r
+ ## __GetFMPCapsuleData() method\r
+ #\r
+ # Get capsule data for FMP capsule\r
+ #\r
+ # @param self The object pointer\r
+ # @param Obj for whom capsule data are got\r
+ #\r
+ def __GetFMPCapsuleData(self, Obj):\r
+\r
+ while True:\r
+ IsFv = self.__GetFvStatement(Obj, True)\r
+ IsFd = self.__GetFdStatement(Obj, True)\r
+ IsAnyFile = self.__GetAnyFileStatement(Obj, True)\r
+ if not (IsFv or IsFd or IsAnyFile):\r
+ break\r
+\r
## __GetFvStatement() method\r
#\r
# Get FV for capsule\r
# @retval True Successfully find a FV statement\r
# @retval False Not able to find a FV statement\r
#\r
- def __GetFvStatement(self, CapsuleObj):\r
+ def __GetFvStatement(self, CapsuleObj, FMPCapsule = False):\r
\r
if not self.__IsKeyword("FV"):\r
return False\r
\r
CapsuleFv = CapsuleData.CapsuleFv()\r
CapsuleFv.FvName = self.__Token\r
- CapsuleObj.CapsuleDataList.append(CapsuleFv)\r
+ if FMPCapsule:\r
+ if not CapsuleObj.ImageFile:\r
+ CapsuleObj.ImageFile.append(CapsuleFv)\r
+ else:\r
+ CapsuleObj.VendorCodeFile.append(CapsuleFv)\r
+ else:\r
+ CapsuleObj.CapsuleDataList.append(CapsuleFv)\r
return True\r
\r
## __GetFdStatement() method\r
# @retval True Successfully find a FD statement\r
# @retval False Not able to find a FD statement\r
#\r
- def __GetFdStatement(self, CapsuleObj):\r
+ def __GetFdStatement(self, CapsuleObj, FMPCapsule = False):\r
\r
if not self.__IsKeyword("FD"):\r
return False\r
\r
CapsuleFd = CapsuleData.CapsuleFd()\r
CapsuleFd.FdName = self.__Token\r
- CapsuleObj.CapsuleDataList.append(CapsuleFd)\r
+ if FMPCapsule:\r
+ if not CapsuleObj.ImageFile:\r
+ CapsuleObj.ImageFile.append(CapsuleFd)\r
+ else:\r
+ CapsuleObj.VendorCodeFile.append(CapsuleFd)\r
+ else:\r
+ CapsuleObj.CapsuleDataList.append(CapsuleFd)\r
return True\r
\r
def __GetFmpStatement(self, CapsuleObj):\r
- if not self.__IsKeyword("FMP"):\r
- return False\r
+ if not self.__IsKeyword("FMP_PAYLOAD"):\r
+ if not self.__IsKeyword("FMP"):\r
+ return False\r
\r
- if not self.__IsKeyword("PAYLOAD"):\r
- self.__UndoToken()\r
- return False\r
+ if not self.__IsKeyword("PAYLOAD"):\r
+ self.__UndoToken()\r
+ return False\r
\r
if not self.__IsToken("="):\r
raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
\r
if not self.__GetNextToken():\r
- raise Warning("expected payload name after FMP PAYLOAD =", self.FileName, self.CurrentLineNumber)\r
+ raise Warning("expected payload name after FMP_PAYLOAD =", self.FileName, self.CurrentLineNumber)\r
Payload = self.__Token.upper()\r
if Payload not in self.Profile.FmpPayloadDict:\r
raise Warning("This FMP Payload does not exist: %s" % self.__Token, self.FileName, self.CurrentLineNumber)\r
raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
\r
AnyFileName = self.__Token\r
- AnyFileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(AnyFileName)\r
- if not os.path.exists(AnyFileName):\r
- raise Warning("File %s not exists"%AnyFileName, self.FileName, self.CurrentLineNumber)\r
+ self.__VerifyFile(AnyFileName)\r
+\r
+ if not os.path.isabs(AnyFileName):\r
+ AnyFileName = mws.join(GenFdsGlobalVariable.WorkSpaceDir, AnyFileName)\r
+\r
return AnyFileName\r
\r
## __GetAnyFileStatement() method\r
# @retval True Successfully find a Anyfile statement\r
# @retval False Not able to find a AnyFile statement\r
#\r
- def __GetAnyFileStatement(self, CapsuleObj):\r
+ def __GetAnyFileStatement(self, CapsuleObj, FMPCapsule = False):\r
AnyFileName = self.__ParseRawFileStatement()\r
if not AnyFileName:\r
return False\r
\r
CapsuleAnyFile = CapsuleData.CapsuleAnyFile()\r
CapsuleAnyFile.FileName = AnyFileName\r
- CapsuleObj.CapsuleDataList.append(CapsuleAnyFile)\r
+ if FMPCapsule:\r
+ if not CapsuleObj.ImageFile:\r
+ CapsuleObj.ImageFile.append(CapsuleAnyFile)\r
+ else:\r
+ CapsuleObj.VendorCodeFile.append(CapsuleAnyFile)\r
+ else:\r
+ CapsuleObj.CapsuleDataList.append(CapsuleAnyFile)\r
return True\r
\r
## __GetAfileStatement() method\r
\r
S = self.__Token.upper()\r
if S.startswith("[") and not S.startswith("[RULE."):\r
- if not S.startswith("[OPTIONROM."):\r
- raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)\r
+ self.SectionParser(S)\r
self.__UndoToken()\r
return False\r
self.__UndoToken()\r
"DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \\r
"UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \\r
"SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \\r
- "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE"):\r
+ "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE", "MM_STANDALONE", "MM_CORE_STANDALONE"):\r
raise Warning("Unknown Module type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
return self.__Token\r
\r
#\r
def __GetFileExtension(self):\r
if not self.__IsToken("."):\r
- raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
+ raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
\r
Ext = ""\r
if self.__GetNextToken():\r
\r
Type = self.__Token.strip().upper()\r
if Type not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\\r
- "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE"):\r
+ "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE", "MM_STANDALONE", "MM_CORE_STANDALONE"):\r
raise Warning("Unknown FV type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
\r
if not self.__IsToken("="):\r
\r
AlignValue = ""\r
if self.__GetAlignment():\r
- if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
+ if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
+ "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
#For FFS, Auto is default option same to ""\r
if not self.__Token == "Auto":\r
\r
SectAlignment = ""\r
if self.__GetAlignment():\r
- if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
+ if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
+ "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):\r
raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
FvImageSectionObj.FvFileType = self.__Token\r
\r
if self.__GetAlignment():\r
- if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
+ if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
+ "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
FvImageSectionObj.Alignment = self.__Token\r
\r
EfiSectionObj.BuildNum = self.__Token\r
\r
if self.__GetAlignment():\r
- if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
+ if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
+ "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):\r
raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
\r
S = self.__Token.upper()\r
if S.startswith("[") and not S.startswith("[VTF."):\r
- if not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
- raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)\r
+ self.SectionParser(S)\r
self.__UndoToken()\r
return False\r
\r
\r
S = self.__Token.upper()\r
if S.startswith("[") and not S.startswith("[OPTIONROM."):\r
- raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)\r
+ self.SectionParser(S)\r
+ self.__UndoToken()\r
+ return False\r
\r
self.__UndoToken()\r
if not self.__IsToken("[OptionRom.", True):\r
self.Profile.InfList.append(ffsInf.InfFileName)\r
FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
self.Profile.InfFileLineList.append(FileLineTuple)\r
+ if ffsInf.UseArch:\r
+ if ffsInf.UseArch not in self.Profile.InfDict:\r
+ self.Profile.InfDict[ffsInf.UseArch] = [ffsInf.InfFileName]\r
+ else:\r
+ self.Profile.InfDict[ffsInf.UseArch].append(ffsInf.InfFileName)\r
+ else:\r
+ self.Profile.InfDict['ArchTBD'].append(ffsInf.InfFileName)\r
\r
\r
self.__GetOptRomOverrides (ffsInf)\r
\r
return False\r
\r
+ def GetAllIncludedFile (self):\r
+ global AllIncludeFileList\r
+ return AllIncludeFileList\r
+\r
if __name__ == "__main__":\r
import sys\r
try:\r