]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/build/BuildReport.py
IntelSiliconPkg IntelVTdDxe: Fix incorrect code to clear VTd error
[mirror_edk2.git] / BaseTools / Source / Python / build / BuildReport.py
index f2a6e6d87eced2e072fe931cd8479ecd9180de37..3c495a6b1b312a70d1a0c22c62a498a5d52f0386 100644 (file)
@@ -33,19 +33,19 @@ from Common import EdkLogger
 from Common.Misc import SaveFileOnChange\r
 from Common.Misc import GuidStructureByteArrayToGuidString\r
 from Common.Misc import GuidStructureStringToGuidString\r
-from Common.InfClassObject import gComponentType2ModuleType\r
 from Common.BuildToolError import FILE_WRITE_FAILURE\r
 from Common.BuildToolError import CODE_ERROR\r
 from Common.BuildToolError import COMMAND_FAILURE\r
+from Common.BuildToolError import FORMAT_INVALID\r
 from Common.LongFilePathSupport import OpenLongFilePath as open\r
 from Common.MultipleWorkspace import MultipleWorkspace as mws\r
 import Common.GlobalData as GlobalData\r
 from AutoGen.AutoGen import ModuleAutoGen\r
 from Common.Misc import PathClass\r
-from Common.String import NormPath\r
+from Common.StringUtils import NormPath\r
 from Common.DataType import *\r
 import collections\r
-from Common.Expression import ValueExpressionEx\r
+from Common.Expression import *\r
 \r
 ## Pattern to extract contents in EDK DXS files\r
 gDxsDependencyPattern = re.compile(r"DEPENDENCY_START(.+)DEPENDENCY_END", re.DOTALL)\r
@@ -94,33 +94,33 @@ gSubSectionSep = "-" * gLineMaxLength
 \r
 ## The look up table to map PCD type to pair of report display type and DEC type\r
 gPcdTypeMap = {\r
-  'FixedAtBuild'     : ('FIXED',  'FixedAtBuild'),\r
-  'PatchableInModule': ('PATCH',  'PatchableInModule'),\r
-  'FeatureFlag'      : ('FLAG',   'FeatureFlag'),\r
-  'Dynamic'          : ('DYN',    'Dynamic'),\r
-  'DynamicHii'       : ('DYNHII', 'Dynamic'),\r
-  'DynamicVpd'       : ('DYNVPD', 'Dynamic'),\r
-  'DynamicEx'        : ('DEX',    'DynamicEx'),\r
-  'DynamicExHii'     : ('DEXHII', 'DynamicEx'),\r
-  'DynamicExVpd'     : ('DEXVPD', 'DynamicEx'),\r
+  TAB_PCDS_FIXED_AT_BUILD     : ('FIXED',  TAB_PCDS_FIXED_AT_BUILD),\r
+  TAB_PCDS_PATCHABLE_IN_MODULE: ('PATCH',  TAB_PCDS_PATCHABLE_IN_MODULE),\r
+  TAB_PCDS_FEATURE_FLAG       : ('FLAG',   TAB_PCDS_FEATURE_FLAG),\r
+  TAB_PCDS_DYNAMIC            : ('DYN',    TAB_PCDS_DYNAMIC),\r
+  TAB_PCDS_DYNAMIC_HII        : ('DYNHII', TAB_PCDS_DYNAMIC),\r
+  TAB_PCDS_DYNAMIC_VPD        : ('DYNVPD', TAB_PCDS_DYNAMIC),\r
+  TAB_PCDS_DYNAMIC_EX         : ('DEX',    TAB_PCDS_DYNAMIC_EX),\r
+  TAB_PCDS_DYNAMIC_EX_HII     : ('DEXHII', TAB_PCDS_DYNAMIC_EX),\r
+  TAB_PCDS_DYNAMIC_EX_VPD     : ('DEXVPD', TAB_PCDS_DYNAMIC_EX),\r
   }\r
 \r
 ## The look up table to map module type to driver type\r
 gDriverTypeMap = {\r
-  'SEC'               : '0x3 (SECURITY_CORE)',\r
-  'PEI_CORE'          : '0x4 (PEI_CORE)',\r
-  'PEIM'              : '0x6 (PEIM)',\r
-  'DXE_CORE'          : '0x5 (DXE_CORE)',\r
-  'DXE_DRIVER'        : '0x7 (DRIVER)',\r
-  'DXE_SAL_DRIVER'    : '0x7 (DRIVER)',\r
-  'DXE_SMM_DRIVER'    : '0x7 (DRIVER)',\r
-  'DXE_RUNTIME_DRIVER': '0x7 (DRIVER)',\r
-  'UEFI_DRIVER'       : '0x7 (DRIVER)',\r
-  'UEFI_APPLICATION'  : '0x9 (APPLICATION)',\r
-  'SMM_CORE'          : '0xD (SMM_CORE)',\r
+  SUP_MODULE_SEC               : '0x3 (SECURITY_CORE)',\r
+  SUP_MODULE_PEI_CORE          : '0x4 (PEI_CORE)',\r
+  SUP_MODULE_PEIM              : '0x6 (PEIM)',\r
+  SUP_MODULE_DXE_CORE          : '0x5 (DXE_CORE)',\r
+  SUP_MODULE_DXE_DRIVER        : '0x7 (DRIVER)',\r
+  SUP_MODULE_DXE_SAL_DRIVER    : '0x7 (DRIVER)',\r
+  SUP_MODULE_DXE_SMM_DRIVER    : '0x7 (DRIVER)',\r
+  SUP_MODULE_DXE_RUNTIME_DRIVER: '0x7 (DRIVER)',\r
+  SUP_MODULE_UEFI_DRIVER       : '0x7 (DRIVER)',\r
+  SUP_MODULE_UEFI_APPLICATION  : '0x9 (APPLICATION)',\r
+  SUP_MODULE_SMM_CORE          : '0xD (SMM_CORE)',\r
   'SMM_DRIVER'        : '0xA (SMM)', # Extension of module type to support PI 1.1 SMM drivers\r
-  'MM_STANDALONE'     : '0xE (MM_STANDALONE)',\r
-  'MM_CORE_STANDALONE' : '0xF (MM_CORE_STANDALONE)'\r
+  SUP_MODULE_MM_STANDALONE     : '0xE (MM_STANDALONE)',\r
+  SUP_MODULE_MM_CORE_STANDALONE : '0xF (MM_CORE_STANDALONE)'\r
   }\r
 \r
 ## The look up table of the supported opcode in the dependency expression binaries\r
@@ -208,7 +208,7 @@ def FindIncludeFiles(Source, IncludePathList, IncludeFiles):
             FileName = "Protocol/%(Key)s/%(Key)s.h" % {"Key" : Key}\r
         elif "PPI" in Type:\r
             FileName = "Ppi/%(Key)s/%(Key)s.h" % {"Key" : Key}\r
-        elif "GUID" in Type:\r
+        elif TAB_GUID in Type:\r
             FileName = "Guid/%(Key)s/%(Key)s.h" % {"Key" : Key}\r
         else:\r
             continue\r
@@ -298,7 +298,7 @@ class DepexParser(object):
             Statement = gOpCodeList[struct.unpack("B", OpCode)[0]]\r
             if Statement in ["BEFORE", "AFTER", "PUSH"]:\r
                 GuidValue = "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X" % \\r
-                            struct.unpack("=LHHBBBBBBBB", DepexFile.read(16))\r
+                            struct.unpack(PACK_PATTERN_GUID, DepexFile.read(16))\r
                 GuidString = self._GuidDb.get(GuidValue, GuidValue)\r
                 Statement = "%s %s" % (Statement, GuidString)\r
             DepexStatement.append(Statement)\r
@@ -407,9 +407,9 @@ class DepexReport(object):
         self._DepexFileName = os.path.join(M.BuildDir, "OUTPUT", M.Module.BaseName + ".depex")\r
         ModuleType = M.ModuleType\r
         if not ModuleType:\r
-            ModuleType = gComponentType2ModuleType.get(M.ComponentType, "")\r
+            ModuleType = COMPONENT_TO_MODULE_MAP_DICT.get(M.ComponentType, "")\r
 \r
-        if ModuleType in ["SEC", "PEI_CORE", "DXE_CORE", "SMM_CORE", "MM_CORE_STANDALONE", "UEFI_APPLICATION"]:\r
+        if ModuleType in [SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_DXE_CORE, SUP_MODULE_SMM_CORE, SUP_MODULE_MM_CORE_STANDALONE, SUP_MODULE_UEFI_APPLICATION]:\r
             return\r
       \r
         for Source in M.SourceFileList:\r
@@ -572,11 +572,11 @@ class ModuleReport(object):
         if not M.IsLibrary:\r
             ModuleType = M.ModuleType\r
             if not ModuleType:\r
-                ModuleType = gComponentType2ModuleType.get(M.ComponentType, "")\r
+                ModuleType = COMPONENT_TO_MODULE_MAP_DICT.get(M.ComponentType, "")\r
             #\r
             # If a module complies to PI 1.1, promote Module type to "SMM_DRIVER"\r
             #\r
-            if ModuleType == "DXE_SMM_DRIVER":\r
+            if ModuleType == SUP_MODULE_DXE_SMM_DRIVER:\r
                 PiSpec = M.Module.Specification.get("PI_SPECIFICATION_VERSION", "0x00010000")\r
                 if int(PiSpec, 0) >= 0x0001000A:\r
                     ModuleType = "SMM_DRIVER"\r
@@ -721,7 +721,7 @@ def ReadMessage(From, To, ExitFlag):
         # read one line a time\r
         Line = From.readline()\r
         # empty string means "end"\r
-        if Line != None and Line != "":\r
+        if Line is not None and Line != "":\r
             To(Line.rstrip())\r
         else:\r
             break\r
@@ -784,7 +784,7 @@ class PcdReport(object):
                 Pcd = Pa.Platform.Pcds[item]\r
                 if not Pcd.Type:\r
                     # check the Pcd in FDF file, whether it is used in module first\r
-                    for T in ["FixedAtBuild", "PatchableInModule", "FeatureFlag", "Dynamic", "DynamicEx"]:\r
+                    for T in PCD_TYPE_LIST:\r
                         PcdList = self.AllPcds.setdefault(Pcd.TokenSpaceGuidCName, {}).setdefault(T, [])\r
                         if Pcd in PcdList:\r
                             Pcd.Type = T\r
@@ -792,7 +792,7 @@ class PcdReport(object):
                 if not Pcd.Type:\r
                     PcdTypeFlag = False\r
                     for package in Pa.PackageList:\r
-                        for T in ["FixedAtBuild", "PatchableInModule", "FeatureFlag", "Dynamic", "DynamicEx"]:\r
+                        for T in PCD_TYPE_LIST:\r
                             if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, T) in package.Pcds:\r
                                 Pcd.Type = T\r
                                 PcdTypeFlag = True\r
@@ -804,10 +804,10 @@ class PcdReport(object):
                 if not Pcd.DatumType:\r
                     PcdType = Pcd.Type\r
                     # Try to remove Hii and Vpd suffix\r
-                    if PcdType.startswith("DynamicEx"):\r
-                        PcdType = "DynamicEx"\r
-                    elif PcdType.startswith("Dynamic"):\r
-                        PcdType = "Dynamic"\r
+                    if PcdType.startswith(TAB_PCDS_DYNAMIC_EX):\r
+                        PcdType = TAB_PCDS_DYNAMIC_EX\r
+                    elif PcdType.startswith(TAB_PCDS_DYNAMIC):\r
+                        PcdType = TAB_PCDS_DYNAMIC\r
                     for package in Pa.PackageList:\r
                         if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, PcdType) in package.Pcds:\r
                             Pcd.DatumType = package.Pcds[(Pcd.TokenCName, Pcd.TokenSpaceGuidCName, PcdType)].DatumType\r
@@ -823,7 +823,7 @@ class PcdReport(object):
                 for PcdItem in GlobalData.gConditionalPcds:\r
                     if '.' in PcdItem:\r
                         (TokenSpaceGuidCName, TokenCName) = PcdItem.split('.')\r
-                        if (TokenCName, TokenSpaceGuidCName) in Pa.Platform.Pcds.keys():\r
+                        if (TokenCName, TokenSpaceGuidCName) in Pa.Platform.Pcds:\r
                             Pcd = Pa.Platform.Pcds[(TokenCName, TokenSpaceGuidCName)]\r
                             PcdList = self.ConditionalPcds.setdefault(Pcd.TokenSpaceGuidCName, {}).setdefault(Pcd.Type, [])\r
                             if Pcd not in PcdList:\r
@@ -876,10 +876,11 @@ class PcdReport(object):
                     self.DscPcdDefault[(TokenCName, TokenSpaceGuidCName)] = DscDefaultValue\r
 \r
     def GenerateReport(self, File, ModulePcdSet):\r
-        if self.ConditionalPcds:\r
-            self.GenerateReportDetail(File, ModulePcdSet, 1)\r
-        if self.UnusedPcds:\r
-            self.GenerateReportDetail(File, ModulePcdSet, 2)\r
+        if not ModulePcdSet:\r
+            if self.ConditionalPcds:\r
+                self.GenerateReportDetail(File, ModulePcdSet, 1)\r
+            if self.UnusedPcds:\r
+                self.GenerateReportDetail(File, ModulePcdSet, 2)\r
         self.GenerateReportDetail(File, ModulePcdSet)\r
 \r
     ##\r
@@ -903,7 +904,7 @@ class PcdReport(object):
         elif ReportSubType == 2:\r
             PcdDict = self.UnusedPcds\r
 \r
-        if ModulePcdSet == None:\r
+        if not ModulePcdSet:\r
             FileWrite(File, gSectionStart)\r
             if ReportSubType == 1:\r
                 FileWrite(File, "Conditional Directives used by the build system")\r
@@ -955,16 +956,21 @@ class PcdReport(object):
                     DscDefaultValBak = DscDefaultValue\r
                     DscDefaultValue = self.FdfPcdSet.get((Pcd.TokenCName, Key), DscDefaultValue)\r
                     if DscDefaultValue != DscDefaultValBak:\r
-                        DscDefaultValue = ValueExpressionEx(DscDefaultValue, Pcd.DatumType, self._GuidDict)(True)\r
+                        try:\r
+                            DscDefaultValue = ValueExpressionEx(DscDefaultValue, Pcd.DatumType, self._GuidDict)(True)\r
+                        except BadExpression, DscDefaultValue:\r
+                            EdkLogger.error('BuildReport', FORMAT_INVALID, "PCD Value: %s, Type: %s" %(DscDefaultValue, Pcd.DatumType))\r
+\r
                     InfDefaultValue = None\r
                     \r
                     PcdValue = DecDefaultValue\r
                     if DscDefaultValue:\r
                         PcdValue = DscDefaultValue\r
-                    if ModulePcdSet != None:\r
+                    if ModulePcdSet is not None:\r
                         if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type) not in ModulePcdSet:\r
                             continue\r
                         InfDefault, PcdValue = ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type]\r
+                        Pcd.DefaultValue = PcdValue\r
                         if InfDefault == "":\r
                             InfDefault = None\r
 \r
@@ -972,54 +978,57 @@ class PcdReport(object):
                     if GlobalData.BuildOptionPcd:\r
                         for pcd in GlobalData.BuildOptionPcd:\r
                             if (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) == (pcd[0], pcd[1]):\r
-                                PcdValue = pcd[2]\r
+                                if pcd[2]:\r
+                                    continue\r
+                                PcdValue = pcd[3]\r
+                                Pcd.DefaultValue = PcdValue\r
                                 BuildOptionMatch = True\r
                                 break\r
 \r
                     if First:\r
-                        if ModulePcdSet == None:\r
+                        if ModulePcdSet is None:\r
                             FileWrite(File, "")\r
                         FileWrite(File, Key)\r
                         First = False\r
 \r
 \r
-                    if Pcd.DatumType in ('UINT8', 'UINT16', 'UINT32', 'UINT64'):\r
+                    if Pcd.DatumType in TAB_PCD_CLEAN_NUMERIC_TYPES:\r
                         PcdValueNumber = int(PcdValue.strip(), 0)\r
-                        if DecDefaultValue == None:\r
+                        if DecDefaultValue is None:\r
                             DecMatch = True\r
                         else:\r
                             DecDefaultValueNumber = int(DecDefaultValue.strip(), 0)\r
                             DecMatch = (DecDefaultValueNumber == PcdValueNumber)\r
 \r
-                        if InfDefaultValue == None:\r
+                        if InfDefaultValue is None:\r
                             InfMatch = True\r
                         else:\r
                             InfDefaultValueNumber = int(InfDefaultValue.strip(), 0)\r
                             InfMatch = (InfDefaultValueNumber == PcdValueNumber)\r
 \r
-                        if DscDefaultValue == None:\r
+                        if DscDefaultValue is None:\r
                             DscMatch = True\r
                         else:\r
                             DscDefaultValueNumber = int(DscDefaultValue.strip(), 0)\r
                             DscMatch = (DscDefaultValueNumber == PcdValueNumber)\r
                     else:\r
-                        if DecDefaultValue == None:\r
+                        if DecDefaultValue is None:\r
                             DecMatch = True\r
                         else:\r
                             DecMatch = (DecDefaultValue.strip() == PcdValue.strip())\r
 \r
-                        if InfDefaultValue == None:\r
+                        if InfDefaultValue is None:\r
                             InfMatch = True\r
                         else:\r
                             InfMatch = (InfDefaultValue.strip() == PcdValue.strip())\r
 \r
-                        if DscDefaultValue == None:\r
+                        if DscDefaultValue is None:\r
                             DscMatch = True\r
                         else:\r
                             DscMatch = (DscDefaultValue.strip() == PcdValue.strip())\r
 \r
                     IsStructure = False\r
-                    if GlobalData.gStructurePcd and (self.Arch in GlobalData.gStructurePcd.keys()) and ((Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.gStructurePcd[self.Arch]):\r
+                    if GlobalData.gStructurePcd and (self.Arch in GlobalData.gStructurePcd) and ((Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.gStructurePcd[self.Arch]):\r
                         IsStructure = True\r
                         if TypeName in ('DYNVPD', 'DEXVPD'):\r
                             SkuInfoList = Pcd.SkuInfoList\r
@@ -1027,9 +1036,42 @@ class PcdReport(object):
                         Pcd.DatumType = Pcd.StructName\r
                         if TypeName in ('DYNVPD', 'DEXVPD'):\r
                             Pcd.SkuInfoList = SkuInfoList\r
-                        if Pcd.SkuOverrideValues:\r
-                            DscMatch = True\r
+                        if Pcd.PcdFieldValueFromComm:\r
+                            BuildOptionMatch = True\r
                             DecMatch = False\r
+                        elif Pcd.SkuOverrideValues:\r
+                            DscOverride = False\r
+                            if not Pcd.SkuInfoList:\r
+                                OverrideValues = Pcd.SkuOverrideValues\r
+                                if OverrideValues:\r
+                                    Keys = OverrideValues.keys()\r
+                                    Data = OverrideValues[Keys[0]]\r
+                                    Struct = Data.values()[0]\r
+                                    DscOverride = self.ParseStruct(Struct)\r
+                            else:\r
+                                SkuList = sorted(Pcd.SkuInfoList.keys())\r
+                                for Sku in SkuList:\r
+                                    SkuInfo = Pcd.SkuInfoList[Sku]\r
+                                    if TypeName in ('DYNHII', 'DEXHII'):\r
+                                        if SkuInfo.DefaultStoreDict:\r
+                                            DefaultStoreList = sorted(SkuInfo.DefaultStoreDict.keys())\r
+                                            for DefaultStore in DefaultStoreList:\r
+                                                OverrideValues = Pcd.SkuOverrideValues[Sku]\r
+                                                DscOverride = self.ParseStruct(OverrideValues[DefaultStore])\r
+                                                if DscOverride:\r
+                                                    break\r
+                                    else:\r
+                                        OverrideValues = Pcd.SkuOverrideValues[Sku]\r
+                                        if OverrideValues:\r
+                                            Keys = OverrideValues.keys()\r
+                                            OverrideFieldStruct = self.OverrideFieldValue(Pcd, OverrideValues[Keys[0]])\r
+                                            DscOverride = self.ParseStruct(OverrideFieldStruct)\r
+                                    if DscOverride:\r
+                                        break\r
+                            if DscOverride:\r
+                                DscMatch = True\r
+                                DecMatch = False\r
+\r
                     #\r
                     # Report PCD item according to their override relationship\r
                     #\r
@@ -1046,7 +1088,7 @@ class PcdReport(object):
                         else:\r
                             self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*M')\r
 \r
-                    if ModulePcdSet == None:\r
+                    if ModulePcdSet is None:\r
                         if IsStructure:\r
                             continue\r
                         if not TypeName in ('PATCH', 'FLAG', 'FIXED'):\r
@@ -1055,7 +1097,7 @@ class PcdReport(object):
                             ModuleOverride = self.ModulePcdOverride.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName), {})\r
                             for ModulePath in ModuleOverride:\r
                                 ModuleDefault = ModuleOverride[ModulePath]\r
-                                if Pcd.DatumType in ('UINT8', 'UINT16', 'UINT32', 'UINT64'):\r
+                                if Pcd.DatumType in TAB_PCD_CLEAN_NUMERIC_TYPES:\r
                                     ModulePcdDefaultValueNumber = int(ModuleDefault.strip(), 0)\r
                                     Match = (ModulePcdDefaultValueNumber == PcdValueNumber)\r
                                 else:\r
@@ -1070,15 +1112,23 @@ class PcdReport(object):
                                 else:\r
                                     FileWrite(File, ' *M %-*s = %s' % (self.MaxLen + 19, ModulePath, ModuleDefault.strip()))\r
 \r
-        if ModulePcdSet == None:\r
+        if ModulePcdSet is None:\r
             FileWrite(File, gSectionEnd)\r
         else:\r
             if not ReportSubType and ModulePcdSet:\r
                 FileWrite(File, gSubSectionEnd)\r
 \r
+    def ParseStruct(self, struct):\r
+        HasDscOverride = False\r
+        if struct:\r
+            for _, Values in struct.items():\r
+                if Values[1] and Values[1].endswith('.dsc'):\r
+                    HasDscOverride = True\r
+                    break\r
+        return HasDscOverride\r
 \r
     def PrintPcdDefault(self, File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue):\r
-        if not DscMatch and DscDefaultValue != None:\r
+        if not DscMatch and DscDefaultValue is not None:\r
             Value = DscDefaultValue.strip()\r
             IsByteArray, ArrayList = ByteArrayForamt(Value)\r
             if IsByteArray:\r
@@ -1087,7 +1137,7 @@ class PcdReport(object):
                     FileWrite(File, '%s' % (Array))\r
             else:\r
                 FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'DSC DEFAULT', Value))\r
-        if not InfMatch and InfDefaultValue != None:\r
+        if not InfMatch and InfDefaultValue is not None:\r
             Value = InfDefaultValue.strip()\r
             IsByteArray, ArrayList = ByteArrayForamt(Value)\r
             if IsByteArray:\r
@@ -1097,7 +1147,7 @@ class PcdReport(object):
             else:\r
                 FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'INF DEFAULT', Value))\r
 \r
-        if not DecMatch and DecDefaultValue != None:\r
+        if not DecMatch and DecDefaultValue is not None:\r
             Value = DecDefaultValue.strip()\r
             IsByteArray, ArrayList = ByteArrayForamt(Value)\r
             if IsByteArray:\r
@@ -1108,6 +1158,8 @@ class PcdReport(object):
                 FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'DEC DEFAULT', Value))\r
             if IsStructure:\r
                 self.PrintStructureInfo(File, Pcd.DefaultValues)\r
+        if DecMatch and IsStructure:\r
+            self.PrintStructureInfo(File, Pcd.DefaultValues)\r
 \r
     def PrintPcdValue(self, File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, Flag = '  '):\r
         if not Pcd.SkuInfoList:\r
@@ -1125,7 +1177,8 @@ class PcdReport(object):
                     Keys = OverrideValues.keys()\r
                     Data = OverrideValues[Keys[0]]\r
                     Struct = Data.values()[0]\r
-                    self.PrintStructureInfo(File, Struct)\r
+                    OverrideFieldStruct = self.OverrideFieldValue(Pcd, Struct)\r
+                    self.PrintStructureInfo(File, OverrideFieldStruct)\r
             self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue)\r
         else:\r
             FirstPrint = True\r
@@ -1185,8 +1238,8 @@ class PcdReport(object):
                             FileWrite(File, '%*s: %s: %s' % (self.MaxLen + 4, SkuInfo.VariableGuid, SkuInfo.VariableName, SkuInfo.VariableOffset))\r
                             if IsStructure:\r
                                 OverrideValues = Pcd.SkuOverrideValues[Sku]\r
-                                Struct = OverrideValues[DefaultStore]\r
-                                self.PrintStructureInfo(File, Struct)\r
+                                OverrideFieldStruct = self.OverrideFieldValue(Pcd, OverrideValues[DefaultStore])\r
+                                self.PrintStructureInfo(File, OverrideFieldStruct)\r
                             self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue)\r
                 else:\r
                     Value = SkuInfo.DefaultValue\r
@@ -1224,21 +1277,27 @@ class PcdReport(object):
                         OverrideValues = Pcd.SkuOverrideValues[Sku]\r
                         if OverrideValues:\r
                             Keys = OverrideValues.keys()\r
-                            Struct = OverrideValues[Keys[0]]\r
-                            self.PrintStructureInfo(File, Struct)\r
+                            OverrideFieldStruct = self.OverrideFieldValue(Pcd, OverrideValues[Keys[0]])\r
+                            self.PrintStructureInfo(File, OverrideFieldStruct)\r
                     self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue)\r
 \r
+    def OverrideFieldValue(self, Pcd, OverrideStruct):\r
+        OverrideFieldStruct = collections.OrderedDict()\r
+        if OverrideStruct:\r
+            for Key, Values in OverrideStruct.items():\r
+                if Values[1] and Values[1].endswith('.dsc'):\r
+                    OverrideFieldStruct[Key] = Values\r
+        if Pcd.PcdFieldValueFromComm:\r
+            for Key, Values in Pcd.PcdFieldValueFromComm.items():\r
+                OverrideFieldStruct[Key] = Values\r
+        return OverrideFieldStruct\r
+\r
     def PrintStructureInfo(self, File, Struct):\r
-        NewInfo = collections.OrderedDict()\r
         for Key, Value in Struct.items():\r
-            if Key not in NewInfo:\r
-                NewInfo[Key] = Value[0]\r
+            if Value[1] and 'build command options' in Value[1]:\r
+                FileWrite(File, '    *B  %-*s = %s' % (self.MaxLen + 4, '.' + Key, Value[0]))\r
             else:\r
-                del NewInfo[Key]\r
-                NewInfo[Key] = Value[0]\r
-        if NewInfo:\r
-            for item in NewInfo:\r
-                FileWrite(File, '        %-*s = %s' % (self.MaxLen + 4, '.' + item, NewInfo[item]))\r
+                FileWrite(File, '        %-*s = %s' % (self.MaxLen + 4, '.' + Key, Value[0]))\r
 \r
     def StrtoHex(self, value):\r
         try:\r
@@ -1308,7 +1367,7 @@ class PredictionReport(object):
                 # their source code to find PPI/Protocol produce or consume\r
                 # information.\r
                 #\r
-                if Module.ModuleType == "BASE":\r
+                if Module.ModuleType == SUP_MODULE_BASE:\r
                     continue\r
                 #\r
                 # Add module referenced source files\r
@@ -1351,7 +1410,7 @@ class PredictionReport(object):
         if Wa.FdfProfile:\r
             for Fd in Wa.FdfProfile.FdDict:\r
                 for FdRegion in Wa.FdfProfile.FdDict[Fd].RegionList:\r
-                    if FdRegion.RegionType != "FV":\r
+                    if FdRegion.RegionType != BINARY_FILE_TYPE_FV:\r
                         continue\r
                     for FvName in FdRegion.RegionDataList:\r
                         if FvName in self._FvList:\r
@@ -1621,12 +1680,13 @@ class FdRegionReport(object):
         self.FvInfo = {}\r
         self._GuidsDb = {}\r
         self._FvDir = Wa.FvDir\r
+        self._WorkspaceDir = Wa.WorkspaceDir\r
 \r
         #\r
         # If the input FdRegion is not a firmware volume,\r
         # we are done.\r
         #\r
-        if self.Type != "FV":\r
+        if self.Type != BINARY_FILE_TYPE_FV:\r
             return\r
 \r
         #\r
@@ -1720,11 +1780,19 @@ class FdRegionReport(object):
         FileWrite(File, "Type:               %s" % Type)\r
         FileWrite(File, "Base Address:       0x%X" % BaseAddress)\r
 \r
-        if self.Type == "FV":\r
+        if self.Type == BINARY_FILE_TYPE_FV:\r
             FvTotalSize = 0\r
             FvTakenSize = 0\r
             FvFreeSize  = 0\r
-            FvReportFileName = os.path.join(self._FvDir, FvName + ".Fv.txt")\r
+            if FvName.upper().endswith('.FV'):\r
+                FileExt = FvName + ".txt"\r
+            else:\r
+                FileExt = FvName + ".Fv.txt"\r
+\r
+            if not os.path.isfile(FileExt):\r
+                FvReportFileName = mws.join(self._WorkspaceDir, FileExt)\r
+                if not os.path.isfile(FvReportFileName):\r
+                    FvReportFileName = os.path.join(self._FvDir, FileExt)\r
             try:\r
                 #\r
                 # Collect size info in the firmware volume.\r
@@ -1775,7 +1843,7 @@ class FdRegionReport(object):
         if (len(self.FvList) > 0):\r
             for FvItem in self.FvList:\r
                 Info = self.FvInfo[FvItem]\r
-                self._GenerateReport(File, Info[0], "FV", Info[1], Info[2], FvItem)\r
+                self._GenerateReport(File, Info[0], TAB_FV_DIRECTORY, Info[1], Info[2], FvItem)\r
         else:\r
             self._GenerateReport(File, "FD Region", self.Type, self.BaseAddress, self.Size)\r
 \r
@@ -1801,7 +1869,7 @@ class FdReport(object):
         self.BaseAddress = Fd.BaseAddress\r
         self.Size = Fd.Size\r
         self.FdRegionList = [FdRegionReport(FdRegion, Wa) for FdRegion in Fd.RegionList]\r
-        self.FvPath = os.path.join(Wa.BuildDir, "FV")\r
+        self.FvPath = os.path.join(Wa.BuildDir, TAB_FV_DIRECTORY)\r
         self.VpdFilePath = os.path.join(self.FvPath, "%s.map" % Wa.Platform.VpdToolGuid)\r
         self.VPDBaseAddress = 0\r
         self.VPDSize = 0\r
@@ -1904,7 +1972,7 @@ class PlatformReport(object):
             self.PcdReport = PcdReport(Wa)\r
 \r
         self.FdReportList = []\r
-        if "FLASH" in ReportType and Wa.FdfProfile and MaList == None:\r
+        if "FLASH" in ReportType and Wa.FdfProfile and MaList is None:\r
             for Fd in Wa.FdfProfile.FdDict:\r
                 self.FdReportList.append(FdReport(Wa.FdfProfile.FdDict[Fd], Wa))\r
 \r
@@ -1917,7 +1985,7 @@ class PlatformReport(object):
             self.DepexParser = DepexParser(Wa)\r
             \r
         self.ModuleReportList = []\r
-        if MaList != None:\r
+        if MaList is not None:\r
             self._IsModuleBuild = True\r
             for Ma in MaList:\r
                 self.ModuleReportList.append(ModuleReport(Ma, ReportType))\r
@@ -1927,13 +1995,13 @@ class PlatformReport(object):
                 ModuleAutoGenList = []\r
                 for ModuleKey in Pa.Platform.Modules:\r
                     ModuleAutoGenList.append(Pa.Platform.Modules[ModuleKey].M)\r
-                if GlobalData.gFdfParser != None:\r
+                if GlobalData.gFdfParser is not None:\r
                     if Pa.Arch in GlobalData.gFdfParser.Profile.InfDict:\r
                         INFList = GlobalData.gFdfParser.Profile.InfDict[Pa.Arch]\r
                         for InfName in INFList:\r
                             InfClass = PathClass(NormPath(InfName), Wa.WorkspaceDir, Pa.Arch)\r
                             Ma = ModuleAutoGen(Wa, InfClass, Pa.BuildTarget, Pa.ToolChain, Pa.Arch, Wa.MetaFile)\r
-                            if Ma == None:\r
+                            if Ma is None:\r
                                 continue\r
                             if Ma not in ModuleAutoGenList:\r
                                 ModuleAutoGenList.append(Ma)\r