]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/FdfParser.py
BaseTools/GenFds: Fix the bug for wrong alignment generate for RAW file
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / FdfParser.py
index 664bf8e87d264fdc0e92b56648d16a8244dd44c0..28af09b982005c419738912a702c933774b88576 100644 (file)
@@ -1,7 +1,7 @@
 ## @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
@@ -1846,7 +1846,7 @@ class FdfParser:
         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
@@ -1887,17 +1887,27 @@ class FdfParser:
 \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
@@ -2426,23 +2436,12 @@ class FdfParser:
         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
@@ -2472,7 +2471,23 @@ class FdfParser:
                 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
@@ -2677,6 +2692,11 @@ class FdfParser:
         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
@@ -2686,6 +2706,45 @@ class FdfParser:
         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