]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/BPDG/GenVpd.py
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Source / Python / BPDG / GenVpd.py
index c5e91a3e812ad71ccb2ab88085986db97c2c34e7..887a0c4a1f5a3a39a3a5b9ccc6dd2ef48c953a23 100644 (file)
@@ -4,13 +4,7 @@
 #\r
 #  Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<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
-#  which accompanies this distribution.  The full text of the license may be found at\r
-#  http://opensource.org/licenses/bsd-license.php\r
-#\r
-#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
 \r
 from __future__ import absolute_import\r
@@ -21,6 +15,7 @@ import array
 import re\r
 from Common.LongFilePathSupport import OpenLongFilePath as open\r
 from struct import *\r
+from Common.DataType import MAX_SIZE_TYPE, MAX_VAL_TYPE, TAB_STAR\r
 import Common.EdkLogger as EdkLogger\r
 import Common.BuildToolError as BuildToolError\r
 \r
@@ -86,7 +81,7 @@ class PcdEntry:
     #  for both hexadecimal and decimal.\r
     #\r
     def _GenOffsetValue(self):\r
-        if self.PcdOffset != "*" :\r
+        if self.PcdOffset != TAB_STAR:\r
             try:\r
                 self.PcdBinOffset = int (self.PcdOffset)\r
             except:\r
@@ -125,37 +120,18 @@ class PcdEntry:
             EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID,\r
                             "Invalid size %d for PCD %s in integer datum size(File: %s Line: %s)." % (Size, self.PcdCName, self.FileName, self.Lineno))\r
 \r
-        if Size == 1:\r
-            if IntValue < 0:\r
-                EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID,\r
-                                "PCD can't be set to negative value %d for PCD %s in UINT8 datum type(File: %s Line: %s)." % (IntValue, self.PcdCName, self.FileName, self.Lineno))\r
-            elif IntValue >= 0x100:\r
-                EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID,\r
-                                "Too large PCD value %d for datum type UINT8 for PCD %s(File: %s Line: %s)." % (IntValue, self.PcdCName, self.FileName, self.Lineno))\r
-        elif Size == 2:\r
-            if IntValue < 0:\r
-                EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID,\r
-                                "PCD can't be set to negative value %d for PCD %s in UINT16 datum type(File: %s Line: %s)." % (IntValue, self.PcdCName, self.FileName, self.Lineno))\r
-            elif IntValue >= 0x10000:\r
-                EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID,\r
-                                "Too large PCD value %d for datum type UINT16 for PCD %s(File: %s Line: %s)." % (IntValue, self.PcdCName, self.FileName, self.Lineno))\r
-        elif Size == 4:\r
-            if IntValue < 0:\r
-                EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID,\r
-                                "PCD can't be set to negative value %d for PCD %s in UINT32 datum type(File: %s Line: %s)." % (IntValue, self.PcdCName, self.FileName, self.Lineno))\r
-            elif IntValue >= 0x100000000:\r
-                EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID,\r
-                                "Too large PCD value %d for datum type UINT32 for PCD %s(File: %s Line: %s)." % (IntValue, self.PcdCName, self.FileName, self.Lineno))\r
-        elif Size == 8:\r
-            if IntValue < 0:\r
-                EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID,\r
-                                "PCD can't be set to negative value %d for PCD %s in UINT32 datum type(File: %s Line: %s)." % (IntValue, self.PcdCName, self.FileName, self.Lineno))\r
-            elif IntValue >= 0x10000000000000000:\r
-                EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID,\r
-                                "Too large PCD value %d for datum type UINT32 for PCD %s(File: %s Line: %s)." % (IntValue, self.PcdCName, self.FileName, self.Lineno))\r
-        else:\r
-            EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID,\r
-                            "Invalid size %d for PCD %s in integer datum size(File: %s Line: %s)." % (Size, self.PcdCName, self.FileName, self.Lineno))\r
+        for Type, MaxSize in MAX_SIZE_TYPE.items():\r
+            if Type == 'BOOLEAN':\r
+                continue\r
+            if Size == MaxSize:\r
+                if IntValue < 0:\r
+                    EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID,\r
+                                    "PCD can't be set to negative value %d for PCD %s in %s datum type(File: %s Line: %s)." % (\r
+                                    IntValue, self.PcdCName, Type, self.FileName, self.Lineno))\r
+                elif IntValue > MAX_VAL_TYPE[Type]:\r
+                    EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID,\r
+                                    "Too large PCD value %d for datum type %s for PCD %s(File: %s Line: %s)." % (\r
+                                    IntValue, Type, self.PcdCName, self.FileName, self.Lineno))\r
 \r
         try:\r
             self.PcdValue = pack(_FORMAT_CHAR[Size], IntValue)\r
@@ -204,7 +180,7 @@ class PcdEntry:
             EdkLogger.error("BPDG", BuildToolError.RESOURCE_OVERFLOW,\r
                             "PCD value string %s is exceed to size %d(File: %s Line: %s)" % (ValueString, Size, self.FileName, self.Lineno))\r
         try:\r
-            self.PcdValue = pack('%ds' % Size, ValueString)\r
+            self.PcdValue = pack('%ds' % Size, ValueString.encode('utf-8'))\r
         except:\r
             EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID,\r
                             "Invalid size or value for PCD %s to pack(File: %s Line: %s)." % (self.PcdCName, self.FileName, self.Lineno))\r
@@ -230,7 +206,7 @@ class PcdEntry:
 \r
         ReturnArray = array.array('B')\r
 \r
-        for Index in xrange(len(ValueList)):\r
+        for Index in range(len(ValueList)):\r
             Value = None\r
             if ValueList[Index].lower().startswith('0x'):\r
                 # translate hex value\r
@@ -256,7 +232,7 @@ class PcdEntry:
 \r
             ReturnArray.append(Value)\r
 \r
-        for Index in xrange(len(ValueList), Size):\r
+        for Index in range(len(ValueList), Size):\r
             ReturnArray.append(0)\r
 \r
         self.PcdValue = ReturnArray.tolist()\r
@@ -291,7 +267,7 @@ class PcdEntry:
                                 "Invalid unicode character %s in unicode string %s(File: %s Line: %s)" % \\r
                                 (Value, UnicodeString, self.FileName, self.Lineno))\r
 \r
-        for Index in xrange(len(UnicodeString) * 2, Size):\r
+        for Index in range(len(UnicodeString) * 2, Size):\r
             ReturnArray.append(0)\r
 \r
         self.PcdValue = ReturnArray.tolist()\r
@@ -324,7 +300,7 @@ class GenVPD :
         self.PcdFixedOffsetSizeList  = []\r
         self.PcdUnknownOffsetList    = []\r
         try:\r
-            fInputfile = open(InputFileName, "r", 0)\r
+            fInputfile = open(InputFileName, "r")\r
             try:\r
                 self.FileLinesList = fInputfile.readlines()\r
             except:\r
@@ -441,7 +417,7 @@ class GenVPD :
                     Alignment = 1\r
 \r
                 PCD.Alignment = Alignment\r
-                if PCD.PcdOffset != '*':\r
+                if PCD.PcdOffset != TAB_STAR:\r
                     if PCD.PcdOccupySize % Alignment != 0:\r
                         if PCD.PcdUnpackValue.startswith("{"):\r
                             EdkLogger.warn("BPDG", "The offset value of PCD %s is not 8-byte aligned!" %(PCD.PcdCName), File=self.InputFileName)\r
@@ -449,7 +425,7 @@ class GenVPD :
                             EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID, 'The offset value of PCD %s should be %s-byte aligned.' % (PCD.PcdCName, Alignment))\r
                 else:\r
                     if PCD.PcdOccupySize % Alignment != 0:\r
-                        PCD.PcdOccupySize = (PCD.PcdOccupySize / Alignment + 1) * Alignment\r
+                        PCD.PcdOccupySize = (PCD.PcdOccupySize // Alignment + 1) * Alignment\r
 \r
                 PackSize = PCD.PcdOccupySize\r
                 if PCD._IsBoolean(PCD.PcdValue, PCD.PcdSize):\r
@@ -487,7 +463,7 @@ class GenVPD :
     def FormatFileLine (self) :\r
 \r
         for eachPcd in self.FileLinesList :\r
-            if eachPcd.PcdOffset != '*' :\r
+            if eachPcd.PcdOffset != TAB_STAR :\r
                 # Use pcd's Offset value as key, and pcd's Value as value\r
                 self.PcdFixedOffsetSizeList.append(eachPcd)\r
             else :\r
@@ -502,7 +478,7 @@ class GenVPD :
     def FixVpdOffset (self):\r
         # At first, the offset should start at 0\r
         # Sort fixed offset list in order to find out where has free spaces for the pcd's offset\r
-        # value is "*" to insert into.\r
+        # value is TAB_STAR to insert into.\r
 \r
         self.PcdFixedOffsetSizeList.sort(key=lambda x: x.PcdBinOffset)\r
 \r
@@ -520,14 +496,14 @@ class GenVPD :
                         self.PcdUnknownOffsetList[index+i -1 ], self.PcdUnknownOffsetList[index+i] = self.PcdUnknownOffsetList[index+i], self.PcdUnknownOffsetList[index+i -1]\r
 \r
         #\r
-        # Process all Offset value are "*"\r
+        # Process all Offset value are TAB_STAR\r
         #\r
         if (len(self.PcdFixedOffsetSizeList) == 0) and (len(self.PcdUnknownOffsetList) != 0) :\r
             # The offset start from 0\r
             NowOffset = 0\r
             for Pcd in self.PcdUnknownOffsetList :\r
                 if NowOffset % Pcd.Alignment != 0:\r
-                    NowOffset = (NowOffset/ Pcd.Alignment + 1) * Pcd.Alignment\r
+                    NowOffset = (NowOffset// Pcd.Alignment + 1) * Pcd.Alignment\r
                 Pcd.PcdBinOffset = NowOffset\r
                 Pcd.PcdOffset    = str(hex(Pcd.PcdBinOffset))\r
                 NowOffset       += Pcd.PcdOccupySize\r
@@ -589,9 +565,9 @@ class GenVPD :
                         eachUnfixedPcd      = self.PcdUnknownOffsetList[countOfUnfixedList]\r
                         needFixPcdSize      = eachUnfixedPcd.PcdOccupySize\r
                         # Not been fixed\r
-                        if eachUnfixedPcd.PcdOffset == '*' :\r
+                        if eachUnfixedPcd.PcdOffset == TAB_STAR :\r
                             if LastOffset % eachUnfixedPcd.Alignment != 0:\r
-                                LastOffset = (LastOffset / eachUnfixedPcd.Alignment + 1) * eachUnfixedPcd.Alignment\r
+                                LastOffset = (LastOffset // eachUnfixedPcd.Alignment + 1) * eachUnfixedPcd.Alignment\r
                             # The offset un-fixed pcd can write into this free space\r
                             if needFixPcdSize <= (NowOffset - LastOffset) :\r
                                 # Change the offset value of un-fixed pcd\r
@@ -645,7 +621,7 @@ class GenVPD :
 \r
             NeedFixPcd.PcdBinOffset = LastPcd.PcdBinOffset + LastPcd.PcdOccupySize\r
             if NeedFixPcd.PcdBinOffset % NeedFixPcd.Alignment != 0:\r
-                NeedFixPcd.PcdBinOffset = (NeedFixPcd.PcdBinOffset / NeedFixPcd.Alignment + 1) * NeedFixPcd.Alignment\r
+                NeedFixPcd.PcdBinOffset = (NeedFixPcd.PcdBinOffset // NeedFixPcd.Alignment + 1) * NeedFixPcd.Alignment\r
 \r
             NeedFixPcd.PcdOffset    = str(hex(NeedFixPcd.PcdBinOffset))\r
 \r
@@ -663,19 +639,19 @@ class GenVPD :
         #Open an VPD file to process\r
 \r
         try:\r
-            fVpdFile = open(BinFileName, "wb", 0)\r
+            fVpdFile = open(BinFileName, "wb")\r
         except:\r
             # Open failed\r
             EdkLogger.error("BPDG", BuildToolError.FILE_OPEN_FAILURE, "File open failed for %s" % self.VpdFileName, None)\r
 \r
         try :\r
-            fMapFile = open(MapFileName, "w", 0)\r
+            fMapFile = open(MapFileName, "w")\r
         except:\r
             # Open failed\r
             EdkLogger.error("BPDG", BuildToolError.FILE_OPEN_FAILURE, "File open failed for %s" % self.MapFileName, None)\r
 \r
         # Use a instance of BytesIO to cache data\r
-        fStringIO = BytesIO('')\r
+        fStringIO = BytesIO()\r
 \r
         # Write the header of map file.\r
         try :\r
@@ -693,8 +669,12 @@ class GenVPD :
             # Write Vpd binary file\r
             fStringIO.seek (eachPcd.PcdBinOffset)\r
             if isinstance(eachPcd.PcdValue, list):\r
-                ValueList = [chr(Item) for Item in eachPcd.PcdValue]\r
-                fStringIO.write(''.join(ValueList))\r
+                for i in range(len(eachPcd.PcdValue)):\r
+                    Value = eachPcd.PcdValue[i:i + 1]\r
+                    if isinstance(bytes(Value), str):\r
+                        fStringIO.write(chr(Value[0]))\r
+                    else:\r
+                        fStringIO.write(bytes(Value))\r
             else:\r
                 fStringIO.write (eachPcd.PcdValue)\r
 \r