]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/FdfParser.py
Sync BaseTool trunk (version r2599) into EDKII BaseTools.
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / FdfParser.py
index c9c620d853803170fe056ffd5946ce786e7ea936..a468a5ec995d082539320c190724043606a288c2 100644 (file)
@@ -1707,6 +1707,38 @@ class FdfParser:
 \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
@@ -1717,19 +1749,21 @@ class FdfParser:
     #   @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
@@ -2503,16 +2537,16 @@ class FdfParser:
         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
@@ -3186,7 +3220,7 @@ class FdfParser:
             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
@@ -3764,7 +3798,7 @@ class FdfParser:
             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
@@ -3778,7 +3812,7 @@ class FdfParser:
         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