\r
return False\r
\r
+ ## __CalcRegionExpr(self)\r
+ #\r
+ # Calculate expression for offset or size of a region\r
+ #\r
+ # @return: None if invalid expression\r
+ # Calculated number if successfully\r
+ #\r
+ def __CalcRegionExpr(self):\r
+ StartPos = self.GetFileBufferPos()\r
+ Expr = ''\r
+ PairCount = 0\r
+ while not self.__EndOfFile():\r
+ CurCh = self.__CurrentChar()\r
+ if CurCh == '(':\r
+ PairCount += 1\r
+ elif CurCh == ')':\r
+ PairCount -= 1\r
+\r
+ if CurCh in '|\r\n' and PairCount == 0:\r
+ break\r
+ Expr += CurCh\r
+ self.__GetOneChar()\r
+ try:\r
+ return long(\r
+ ValueExpression(Expr,\r
+ dict(['%s.%s' % (Pcd[1], Pcd[0]), Val] \r
+ for Pcd, Val in self.Profile.PcdDict.iteritems())\r
+ )(True),0)\r
+ except Exception:\r
+ self.SetFileBufferPos(StartPos)\r
+ return None\r
+\r
## __GetRegionLayout() method\r
#\r
# Get region layout for FD\r
# @retval False Not able to find\r
#\r
def __GetRegionLayout(self, Fd):\r
- if not self.__GetNextHexNumber():\r
+ Offset = self.__CalcRegionExpr() \r
+ if Offset == None:\r
return False\r
\r
RegionObj = Region.Region()\r
- RegionObj.Offset = long(self.__Token, 0)\r
+ RegionObj.Offset = Offset\r
Fd.RegionList.append(RegionObj)\r
\r
if not self.__IsToken( "|"):\r
raise Warning("expected '|'", self.FileName, self.CurrentLineNumber)\r
\r
- if not self.__GetNextHexNumber():\r
+ Size = self.__CalcRegionExpr()\r
+ if Size == None:\r
raise Warning("expected Region Size", self.FileName, self.CurrentLineNumber)\r
- RegionObj.Size = long(self.__Token, 0)\r
+ RegionObj.Size = Size\r
\r
if not self.__GetNextWord():\r
return True\r
self.__GetFileOpts( FfsFileObj)\r
\r
if not self.__IsToken("{"):\r
-# if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
-# if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):\r
-# if self.__Token == 'RELOCS_STRIPPED':\r
-# FfsFileObj.KeepReloc = False\r
-# else:\r
-# FfsFileObj.KeepReloc = True\r
-# else:\r
-# raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
-#\r
-# if not self.__IsToken("{"):\r
+ if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
+ if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):\r
+ if self.__Token == 'RELOCS_STRIPPED':\r
+ FfsFileObj.KeepReloc = False\r
+ else:\r
+ FfsFileObj.KeepReloc = True\r
+ else:\r
+ raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
+\r
+ if not self.__IsToken("{"):\r
raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
\r
if not self.__GetNextToken():\r
GuidSectionObj.SectionType = "GUIDED"\r
GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
+ GuidSectionObj.ExtraHeaderSize = AttribDict["EXTRA_HEADER_SIZE"]\r
# Recursive sections...\r
while True:\r
IsLeafSection = self.__GetLeafSection(GuidSectionObj)\r
AttribDict = {}\r
AttribDict["PROCESSING_REQUIRED"] = "NONE"\r
AttribDict["AUTH_STATUS_VALID"] = "NONE"\r
- if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):\r
+ AttribDict["EXTRA_HEADER_SIZE"] = -1\r
+ while self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID") \\r
+ or self.__IsKeyword("EXTRA_HEADER_SIZE"):\r
AttribKey = self.__Token\r
\r
if not self.__IsToken("="):\r
raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
\r
- if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
- raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
- AttribDict[AttribKey] = self.__Token\r
-\r
- if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):\r
- AttribKey = self.__Token\r
-\r
- if not self.__IsToken("="):\r
- raise Warning("expected '='")\r
-\r
- if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
+ if not self.__GetNextToken():\r
+ raise Warning("expected TRUE(1)/FALSE(0)/Number", self.FileName, self.CurrentLineNumber)\r
+ elif AttribKey == "EXTRA_HEADER_SIZE":\r
+ Base = 10\r
+ if self.__Token[0:2].upper() == "0X":\r
+ Base = 16\r
+ try:\r
+ AttribDict[AttribKey] = int(self.__Token, Base)\r
+ continue\r
+ except ValueError:\r
+ raise Warning("expected Number", self.FileName, self.CurrentLineNumber)\r
+ elif self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
AttribDict[AttribKey] = self.__Token\r
\r
raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
\r
Arch = self.__SkippedChars.rstrip(".")\r
- if Arch.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "COMMON"):\r
+ if Arch.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "AARCH64", "COMMON"):\r
raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
\r
ModuleType = self.__GetModuleType()\r
GuidSectionObj.SectionType = "GUIDED"\r
GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
+ GuidSectionObj.ExtraHeaderSize = AttribDict["EXTRA_HEADER_SIZE"]\r
\r
# Efi sections...\r
while True:\r
raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
\r
Arch = self.__SkippedChars.rstrip(".").upper()\r
- if Arch not in ("IA32", "X64", "IPF", "ARM"):\r
+ if Arch not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):\r
raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
\r
if not self.__GetNextWord():\r
if self.__IsToken(","):\r
if not self.__GetNextWord():\r
raise Warning("expected Arch list", self.FileName, self.CurrentLineNumber)\r
- if self.__Token.upper() not in ("IA32", "X64", "IPF", "ARM"):\r
+ if self.__Token.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):\r
raise Warning("Unknown Arch '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
VtfObj.ArchList = self.__Token.upper()\r
\r