## @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
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
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.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
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
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