## @file\r
# parse FDF file\r
#\r
-# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2007 - 2016, 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
# are licensed and made available under the terms and conditions of the BSD License\r
\r
from Common.Misc import tdict\r
\r
-import re\r
-import os\r
+import Common.LongFilePathOs as os\r
+from Common.LongFilePathSupport import OpenLongFilePath as open\r
\r
##define T_CHAR_SPACE ' '\r
##define T_CHAR_NULL '\0'\r
RegionOffsetPcdPattern = re.compile("\s*(?P<base>\w+\.\w+)\s*$")\r
ShortcutPcdPattern = re.compile("\s*\w+\s*=\s*(?P<value>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<name>\w+\.\w+)\s*")\r
\r
-IncludeFileList = []\r
+AllIncludeFileList = []\r
+\r
+# Get the closest parent\r
+def GetParentAtLine (Line):\r
+ for Profile in AllIncludeFileList:\r
+ if Profile.IsLineInFile(Line):\r
+ return Profile\r
+ return None\r
+\r
+# Check include loop\r
+def IsValidInclude (File, Line):\r
+ for Profile in AllIncludeFileList:\r
+ if Profile.IsLineInFile(Line) and Profile.FileName == File:\r
+ return False\r
+\r
+ return True\r
\r
def GetRealFileLine (File, Line):\r
\r
InsertedLines = 0\r
- for Profile in IncludeFileList:\r
- if Line >= Profile.InsertStartLineNumber and Line < Profile.InsertStartLineNumber + Profile.InsertAdjust + len(Profile.FileLinesList):\r
- return (Profile.FileName, Line - Profile.InsertStartLineNumber + 1)\r
- if Line >= Profile.InsertStartLineNumber + Profile.InsertAdjust + len(Profile.FileLinesList):\r
- InsertedLines += Profile.InsertAdjust + len(Profile.FileLinesList)\r
+ for Profile in AllIncludeFileList:\r
+ if Profile.IsLineInFile(Line):\r
+ return Profile.GetLineInFile(Line)\r
+ elif Line >= Profile.InsertStartLineNumber and Profile.Level == 1:\r
+ InsertedLines += Profile.GetTotalLines()\r
\r
return (File, Line - InsertedLines)\r
\r
FileLineTuple = GetRealFileLine(File, Line)\r
self.FileName = FileLineTuple[0]\r
self.LineNumber = FileLineTuple[1]\r
+ self.OriginalLineNumber = Line\r
self.Message = Str\r
self.ToolName = 'FdfParser'\r
\r
\r
self.InsertStartLineNumber = None\r
self.InsertAdjust = 0\r
+ self.IncludeFileList = []\r
+ self.Level = 1 # first level include file\r
+ \r
+ def GetTotalLines(self):\r
+ TotalLines = self.InsertAdjust + len(self.FileLinesList)\r
+\r
+ for Profile in self.IncludeFileList:\r
+ TotalLines += Profile.GetTotalLines()\r
+\r
+ return TotalLines\r
+\r
+ def IsLineInFile(self, Line):\r
+ if Line >= self.InsertStartLineNumber and Line < self.InsertStartLineNumber + self.GetTotalLines():\r
+ return True\r
+\r
+ return False\r
+\r
+ def GetLineInFile(self, Line):\r
+ if not self.IsLineInFile (Line):\r
+ return (self.FileName, -1)\r
+ \r
+ InsertedLines = self.InsertStartLineNumber\r
+\r
+ for Profile in self.IncludeFileList:\r
+ if Profile.IsLineInFile(Line):\r
+ return Profile.GetLineInFile(Line)\r
+ elif Line >= Profile.InsertStartLineNumber:\r
+ InsertedLines += Profile.GetTotalLines()\r
+\r
+ return (self.FileName, Line - InsertedLines + 1)\r
+\r
+\r
\r
## The FDF content class that used to record file data when parsing FDF\r
#\r
self.VtfList = []\r
self.RuleDict = {}\r
self.OptRomDict = {}\r
+ self.FmpPayloadDict = {}\r
\r
## The syntax parser for FDF\r
#\r
self.CurrentFvName = None\r
self.__Token = ""\r
self.__SkippedChars = ""\r
+ GlobalData.gFdfParser = self\r
\r
# Used to section info\r
self.__CurSection = []\r
# Reset file data buffer to the initial state\r
#\r
# @param self The object pointer\r
+ # @param DestLine Optional new destination line number.\r
+ # @param DestOffset Optional new destination offset. \r
#\r
- def Rewind(self):\r
- self.CurrentLineNumber = 1\r
- self.CurrentOffsetWithinLine = 0\r
+ def Rewind(self, DestLine = 1, DestOffset = 0): \r
+ self.CurrentLineNumber = DestLine \r
+ self.CurrentOffsetWithinLine = DestOffset \r
\r
## __UndoOneChar() method\r
#\r
# @param self The object pointer\r
#\r
def PreprocessIncludeFile(self):\r
-\r
+ # nested include support\r
+ Processed = False\r
while self.__GetNextToken():\r
\r
if self.__Token == '!include':\r
+ Processed = True\r
IncludeLine = self.CurrentLineNumber\r
IncludeOffset = self.CurrentOffsetWithinLine - len('!include')\r
if not self.__GetNextToken():\r
raise Warning("The include file does not exist under below directories: \n%s\n%s\n%s\n"%(os.path.dirname(self.FileName), PlatformDir, GlobalData.gWorkspace), \r
self.FileName, self.CurrentLineNumber)\r
\r
+ if not IsValidInclude (IncludedFile1.Path, self.CurrentLineNumber):\r
+ raise Warning("The include file {0} is causing a include loop.\n".format (IncludedFile1.Path), self.FileName, self.CurrentLineNumber)\r
+\r
IncFileProfile = IncludeFileProfile(IncludedFile1.Path)\r
\r
CurrentLine = self.CurrentLineNumber\r
CurrentOffset = self.CurrentOffsetWithinLine\r
# list index of the insertion, note that line number is 'CurrentLine + 1'\r
InsertAtLine = CurrentLine\r
+ ParentProfile = GetParentAtLine (CurrentLine)\r
+ if ParentProfile != None:\r
+ ParentProfile.IncludeFileList.insert(0, IncFileProfile)\r
+ IncFileProfile.Level = ParentProfile.Level + 1\r
IncFileProfile.InsertStartLineNumber = InsertAtLine + 1\r
# deal with remaining portions after "!include filename", if exists.\r
if self.__GetNextToken():\r
self.CurrentLineNumber += 1\r
InsertAtLine += 1\r
\r
- IncludeFileList.append(IncFileProfile)\r
+ # reversely sorted to better determine error in file\r
+ AllIncludeFileList.insert(0, IncFileProfile)\r
\r
# comment out the processed include file statement\r
TempList = list(self.Profile.FileLinesList[IncludeLine - 1])\r
TempList.insert(IncludeOffset, '#')\r
self.Profile.FileLinesList[IncludeLine - 1] = ''.join(TempList)\r
-\r
+ if Processed: # Nested and back-to-back support\r
+ self.Rewind(DestLine = IncFileProfile.InsertStartLineNumber - 1)\r
+ Processed = False\r
+ # Preprocess done.\r
self.Rewind()\r
\r
def __GetIfListCurrentItemStat(self, IfList):\r
self.__SetMacroValue(Macro, Value)\r
self.__WipeOffArea.append(((DefineLine, DefineOffset), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
elif self.__Token == 'SET':\r
+ if not self.__GetIfListCurrentItemStat(IfList):\r
+ continue\r
SetLine = self.CurrentLineNumber - 1\r
SetOffset = self.CurrentOffsetWithinLine - len('SET')\r
PcdPair = self.__GetNextPcdName()\r
while self.__GetFv():\r
pass\r
\r
+ while self.__GetFmp():\r
+ pass\r
+\r
while self.__GetCapsule():\r
pass\r
\r
\r
except Warning, X:\r
self.__UndoToken()\r
- FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
#'\n\tGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \\r
- X.Message += ' near line %d, column %d: %s' \\r
+ # At this point, the closest parent would be the included file itself\r
+ Profile = GetParentAtLine(X.OriginalLineNumber)\r
+ if Profile != None:\r
+ X.Message += ' near line %d, column %d: %s' \\r
+ % (X.LineNumber, 0, Profile.FileLinesList[X.LineNumber-1])\r
+ else:\r
+ FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
+ X.Message += ' near line %d, column %d: %s' \\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
\r
S = self.__Token.upper()\r
if S.startswith("[") and not S.startswith("[FD."):\r
- if not S.startswith("[FV.") and not S.startswith("[CAPSULE.") \\r
+ if not S.startswith("[FV.") and 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", self.FileName, self.CurrentLineNumber)\r
self.__UndoToken()\r
if not self.__GetNextWord():\r
return True\r
\r
- if not self.__Token in ("SET", "FV", "FILE", "DATA", "CAPSULE"):\r
+ if not self.__Token in ("SET", "FV", "FILE", "DATA", "CAPSULE", "INF"):\r
#\r
# If next token is a word which is not a valid FV type, it might be part of [PcdOffset[|PcdSize]]\r
# Or it might be next region's offset described by an expression which starts with a PCD.\r
\r
elif self.__Token == "FILE":\r
self.__UndoToken()\r
- self.__GetRegionFileType( RegionObj)\r
+ self.__GetRegionFileType(RegionObj)\r
+\r
+ elif self.__Token == "INF":\r
+ self.__UndoToken()\r
+ RegionObj.RegionType = "INF"\r
+ while self.__IsKeyword("INF"):\r
+ self.__UndoToken()\r
+ ffsInf = self.__ParseInfStatement()\r
+ if not ffsInf:\r
+ break\r
+ RegionObj.RegionDataList.append(ffsInf)\r
\r
elif self.__Token == "DATA":\r
self.__UndoToken()\r
- self.__GetRegionDataType( RegionObj)\r
+ self.__GetRegionDataType(RegionObj)\r
else:\r
self.__UndoToken()\r
if self.__GetRegionLayout(Fd):\r
return True\r
raise Warning("A valid region type was not found. "\r
- "Valid types are [SET, FV, CAPSULE, FILE, DATA]. This error occurred",\r
+ "Valid types are [SET, FV, CAPSULE, FILE, DATA, INF]. This error occurred",\r
self.FileName, self.CurrentLineNumber)\r
\r
return True\r
\r
S = self.__Token.upper()\r
if S.startswith("[") and not S.startswith("[FV."):\r
- if 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
if not (self.__GetBlockStatement(FvObj) or self.__GetFvBaseAddress(FvObj) or \r
self.__GetFvForceRebase(FvObj) or self.__GetFvAlignment(FvObj) or \r
self.__GetFvAttributes(FvObj) or self.__GetFvNameGuid(FvObj) or \r
- self.__GetFvExtEntryStatement(FvObj)):\r
+ self.__GetFvExtEntryStatement(FvObj) or self.__GetFvNameString(FvObj)):\r
break\r
\r
+ if FvObj.FvNameString == 'TRUE' and not FvObj.FvNameGuid:\r
+ raise Warning("FvNameString found but FvNameGuid was not found", self.FileName, self.CurrentLineNumber)\r
+\r
self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
\r
\r
return True\r
\r
+ def __GetFvNameString(self, FvObj):\r
+\r
+ if not self.__IsKeyword( "FvNameString"):\r
+ return False\r
+\r
+ if not self.__IsToken( "="):\r
+ raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+\r
+ if not self.__GetNextToken() or self.__Token not in ('TRUE', 'FALSE'):\r
+ raise Warning("expected TRUE or FALSE for FvNameString", self.FileName, self.CurrentLineNumber)\r
+\r
+ FvObj.FvNameString = self.__Token\r
+\r
+ return True\r
+\r
def __GetFvExtEntryStatement(self, FvObj):\r
\r
if not self.__IsKeyword( "FV_EXT_ENTRY"):\r
FvObj.AprioriSectionList.append(AprSectionObj)\r
return True\r
\r
- ## __GetInfStatement() method\r
- #\r
- # Get INF statements\r
- #\r
- # @param self The object pointer\r
- # @param Obj for whom inf statement is got\r
- # @param MacroDict dictionary used to replace macro\r
- # @retval True Successfully find inf statement\r
- # @retval False Not able to find inf statement\r
- #\r
- def __GetInfStatement(self, Obj, ForCapsule = False, MacroDict = {}):\r
-\r
- if not self.__IsKeyword( "INF"):\r
- return False\r
+ def __ParseInfStatement(self):\r
+ if not self.__IsKeyword("INF"):\r
+ return None\r
\r
ffsInf = FfsInfStatement.FfsInfStatement()\r
- self.__GetInfOptions( ffsInf)\r
+ self.__GetInfOptions(ffsInf)\r
\r
if not self.__GetNextToken():\r
raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber)\r
ffsInf.CurrentLineNum = self.CurrentLineNumber\r
ffsInf.CurrentLineContent = self.__CurrentLine()\r
\r
+ #Replace $(SAPCE) with real space\r
+ ffsInf.InfFileName = ffsInf.InfFileName.replace('$(SPACE)', ' ')\r
+\r
if ffsInf.InfFileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
#do case sensitive check for file path\r
ErrorCode, ErrorInfo = PathClass(NormPath(ffsInf.InfFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
ffsInf.KeepReloc = True\r
else:\r
raise Warning("Unknown reloc strip flag '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
- \r
+ return ffsInf\r
+\r
+ ## __GetInfStatement() method\r
+ #\r
+ # Get INF statements\r
+ #\r
+ # @param self The object pointer\r
+ # @param Obj for whom inf statement is got\r
+ # @param MacroDict dictionary used to replace macro\r
+ # @retval True Successfully find inf statement\r
+ # @retval False Not able to find inf statement\r
+ #\r
+ def __GetInfStatement(self, Obj, ForCapsule=False, MacroDict={}):\r
+ ffsInf = self.__ParseInfStatement()\r
+ if not ffsInf:\r
+ return False\r
+\r
if ForCapsule:\r
capsuleFfs = CapsuleData.CapsuleFfs()\r
capsuleFfs.Ffs = ffsInf\r
# @param FfsInfObj for whom option is got\r
#\r
def __GetInfOptions(self, FfsInfObj):\r
+ if self.__IsKeyword("FILE_GUID"):\r
+ if not self.__IsToken("="):\r
+ raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+ if not self.__GetNextGuid():\r
+ raise Warning("expected GUID value", self.FileName, self.CurrentLineNumber)\r
+ FfsInfObj.OverrideGuid = self.__Token\r
\r
if self.__IsKeyword( "RuleOverride"):\r
if not self.__IsToken( "="):\r
\r
\r
if self.__GetNextToken():\r
- p = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
- if p.match(self.__Token):\r
+ p = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\))')\r
+ if p.match(self.__Token) and p.match(self.__Token).span()[1] == len(self.__Token):\r
FfsInfObj.KeyStringList.append(self.__Token)\r
if not self.__IsToken(","):\r
return\r
elif self.__Token in ("DEFINE", "APRIORI", "SECTION"):\r
self.__UndoToken()\r
self.__GetSectionData( FfsFileObj, MacroDict)\r
+\r
+ elif hasattr(FfsFileObj, 'FvFileType') and FfsFileObj.FvFileType == 'RAW':\r
+ self.__UndoToken()\r
+ self.__GetRAWData(FfsFileObj, MacroDict)\r
+\r
else:\r
FfsFileObj.CurrentLineNum = self.CurrentLineNumber\r
FfsFileObj.CurrentLineContent = self.__CurrentLine()\r
- FfsFileObj.FileName = self.__Token\r
+ FfsFileObj.FileName = self.__Token.replace('$(SPACE)', ' ')\r
self.__VerifyFile(FfsFileObj.FileName)\r
\r
if not self.__IsToken( "}"):\r
raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
\r
+ ## __GetRAWData() method\r
+ #\r
+ # Get RAW data for FILE statement\r
+ #\r
+ # @param self The object pointer\r
+ # @param FfsFileObj for whom section is got\r
+ # @param MacroDict dictionary used to replace macro\r
+ #\r
+ def __GetRAWData(self, FfsFileObj, MacroDict = {}):\r
+ FfsFileObj.FileName = []\r
+ FfsFileObj.SubAlignment = []\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
+ raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
+ AlignValue = self.__Token\r
+ if not self.__GetNextToken():\r
+ raise Warning("expected Filename value", self.FileName, self.CurrentLineNumber)\r
+\r
+ FileName = self.__Token.replace('$(SPACE)', ' ')\r
+ if FileName == '}':\r
+ self.__UndoToken()\r
+ raise Warning("expected Filename value", self.FileName, self.CurrentLineNumber)\r
+\r
+ self.__VerifyFile(FileName)\r
+ File = PathClass(NormPath(FileName), GenFdsGlobalVariable.WorkSpaceDir)\r
+ FfsFileObj.FileName.append(File.Path)\r
+ FfsFileObj.SubAlignment.append(AlignValue)\r
+\r
+ if self.__IsToken( "}"):\r
+ self.__UndoToken()\r
+ break\r
+\r
+ if len(FfsFileObj.SubAlignment) == 1:\r
+ FfsFileObj.SubAlignment = FfsFileObj.SubAlignment[0]\r
+ if len(FfsFileObj.FileName) == 1:\r
+ FfsFileObj.FileName = FfsFileObj.FileName[0]\r
+\r
## __GetFileOpts() method\r
#\r
# Get options for FILE statement\r
else:\r
return True\r
\r
+ def __GetFmp(self):\r
+ if not self.__GetNextToken():\r
+ return False\r
+ S = self.__Token.upper()\r
+ if S.startswith("[") and not S.startswith("[FMPPAYLOAD."):\r
+ self.SectionParser(S)\r
+ self.__UndoToken()\r
+ return False\r
+\r
+ self.__UndoToken()\r
+ self.__SkipToToken("[FMPPAYLOAD.", True)\r
+ FmpUiName = self.__GetUiName().upper()\r
+ if FmpUiName in self.Profile.FmpPayloadDict:\r
+ raise Warning("Duplicated FMP UI name found: %s" % FmpUiName, self.FileName, self.CurrentLineNumber)\r
+\r
+ FmpData = CapsuleData.CapsulePayload()\r
+ FmpData.UiName = FmpUiName\r
+\r
+ if not self.__IsToken( "]"):\r
+ raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\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
+ while self.__Token in FmpKeyList:\r
+ Name = self.__Token\r
+ FmpKeyList.remove(Name)\r
+ if not self.__IsToken("="):\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
+ FmpData.ImageTypeId = self.__Token\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
+ elif Name == 'IMAGE_INDEX':\r
+ FmpData.ImageIndex = Value\r
+ elif Name == 'HARDWARE_INSTANCE':\r
+ FmpData.HardwareInstance = Value\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
+ self.Profile.FmpPayloadDict[FmpUiName] = FmpData\r
+ return True\r
+\r
## __GetCapsule() method\r
#\r
# Get capsule section contents and store its data into capsule list of self.Profile\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
def __GetCapsuleTokens(self, Obj):\r
if not self.__GetNextToken():\r
return False\r
- while self.__Token in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS", "OEM_CAPSULE_FLAGS"):\r
+ while self.__Token in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS", "OEM_CAPSULE_FLAGS", "CAPSULE_HEADER_INIT_VERSION"):\r
Name = self.__Token.strip()\r
if not self.__IsToken("="):\r
raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
IsFd = self.__GetFdStatement(Obj)\r
IsAnyFile = self.__GetAnyFileStatement(Obj)\r
IsAfile = self.__GetAfileStatement(Obj)\r
- if not (IsInf or IsFile or IsFv or IsFd or IsAnyFile or IsAfile):\r
+ IsFmp = self.__GetFmpStatement(Obj)\r
+ if not (IsInf or IsFile or IsFv or IsFd or IsAnyFile or IsAfile or IsFmp):\r
break\r
\r
## __GetFvStatement() method\r
CapsuleObj.CapsuleDataList.append(CapsuleFd)\r
return True\r
\r
- ## __GetAnyFileStatement() method\r
- #\r
- # Get AnyFile for capsule\r
- #\r
- # @param self The object pointer\r
- # @param CapsuleObj for whom AnyFile is got\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 __GetFmpStatement(self, CapsuleObj):\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
+\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
+ 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
+ CapsuleObj.FmpPayloadList.append(self.Profile.FmpPayloadDict[Payload])\r
+ return True\r
\r
+ def __ParseRawFileStatement(self):\r
if not self.__IsKeyword("FILE"):\r
- return False\r
+ return None\r
\r
if not self.__IsKeyword("DATA"):\r
self.__UndoToken()\r
- return False\r
+ return None\r
\r
if not self.__IsToken("="):\r
raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\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
+ return AnyFileName\r
+\r
+ ## __GetAnyFileStatement() method\r
+ #\r
+ # Get AnyFile for capsule\r
+ #\r
+ # @param self The object pointer\r
+ # @param CapsuleObj for whom AnyFile is got\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
+ AnyFileName = self.__ParseRawFileStatement()\r
+ if not AnyFileName:\r
+ return False\r
\r
CapsuleAnyFile = CapsuleData.CapsuleAnyFile()\r
CapsuleAnyFile.FileName = AnyFileName\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
#\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
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