]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/build/BuildReport.py
BaseTools: Fixed the issue of Multiple Skus are always disables
[mirror_edk2.git] / BaseTools / Source / Python / build / BuildReport.py
index f0e9093c7abd9b349029536a2f93632a6355e02f..75e8ec97ab8a74e224aebc4008627099c8c5384b 100644 (file)
@@ -37,19 +37,14 @@ from Common.InfClassObject import gComponentType2ModuleType
 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 FILE_WRITE_FAILURE\r
 from Common.BuildToolError import CODE_ERROR\r
 from Common.BuildToolError import COMMAND_FAILURE\r
-from Common.DataType import TAB_LINE_BREAK\r
-from Common.DataType import TAB_DEPEX\r
-from Common.DataType import TAB_SLASH\r
-from Common.DataType import TAB_SPACE_SPLIT\r
-from Common.DataType import TAB_BRG_PCD\r
-from Common.DataType import TAB_BRG_LIBRARY\r
-from Common.DataType import TAB_BACK_SLASH\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.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.DataType import *\r
+import collections\r
 \r
 ## Pattern to extract contents in EDK DXS files\r
 gDxsDependencyPattern = re.compile(r"DEPENDENCY_START(.+)DEPENDENCY_END", re.DOTALL)\r
 \r
 ## Pattern to extract contents in EDK DXS files\r
 gDxsDependencyPattern = re.compile(r"DEPENDENCY_START(.+)DEPENDENCY_END", re.DOTALL)\r
@@ -145,6 +140,37 @@ def FileWrite(File, String, Wrapper=False):
         String = textwrap.fill(String, 120)\r
     File.write(String + gEndOfLine)\r
 \r
         String = textwrap.fill(String, 120)\r
     File.write(String + gEndOfLine)\r
 \r
+def ByteArrayForamt(Value):\r
+    IsByteArray = False\r
+    SplitNum = 16\r
+    ArrayList = []\r
+    if Value.startswith('{') and Value.endswith('}'):\r
+        Value = Value[1:-1]\r
+        ValueList = Value.split(',')\r
+        if len(ValueList) >= SplitNum:\r
+            IsByteArray = True\r
+    if IsByteArray:\r
+        if ValueList:\r
+            Len = len(ValueList)/SplitNum\r
+            for i, element in enumerate(ValueList):\r
+                ValueList[i] = '0x%02X' % int(element.strip(), 16)\r
+        if Len:\r
+            Id = 0\r
+            while (Id <= Len):\r
+                End = min(SplitNum*(Id+1), len(ValueList))\r
+                Str = ','.join(ValueList[SplitNum*Id : End])\r
+                if End == len(ValueList):\r
+                    Str += '}'\r
+                    ArrayList.append(Str)\r
+                    break\r
+                else:\r
+                    Str += ','\r
+                    ArrayList.append(Str)\r
+                Id += 1\r
+        else:\r
+            ArrayList = [Value + '}']\r
+    return IsByteArray, ArrayList\r
+\r
 ##\r
 # Find all the header file that the module source directly includes.\r
 #\r
 ##\r
 # Find all the header file that the module source directly includes.\r
 #\r
@@ -723,6 +749,7 @@ class PcdReport(object):
         self.UnusedPcds = {}\r
         self.ConditionalPcds = {}\r
         self.MaxLen = 0\r
         self.UnusedPcds = {}\r
         self.ConditionalPcds = {}\r
         self.MaxLen = 0\r
+        self.Arch = None\r
         if Wa.FdfProfile:\r
             self.FdfPcdSet = Wa.FdfProfile.PcdDict\r
         else:\r
         if Wa.FdfProfile:\r
             self.FdfPcdSet = Wa.FdfProfile.PcdDict\r
         else:\r
@@ -730,6 +757,7 @@ class PcdReport(object):
 \r
         self.ModulePcdOverride = {}\r
         for Pa in Wa.AutoGenObjectList:\r
 \r
         self.ModulePcdOverride = {}\r
         for Pa in Wa.AutoGenObjectList:\r
+            self.Arch = Pa.Arch\r
             #\r
             # Collect all platform referenced PCDs and grouped them by PCD token space\r
             # GUID C Names\r
             #\r
             # Collect all platform referenced PCDs and grouped them by PCD token space\r
             # GUID C Names\r
@@ -830,10 +858,9 @@ class PcdReport(object):
         # Collect PCDs defined in DSC common section\r
         #\r
         self.DscPcdDefault = {}\r
         # Collect PCDs defined in DSC common section\r
         #\r
         self.DscPcdDefault = {}\r
-        for Arch in Wa.ArchList:\r
-            Platform = Wa.BuildDatabase[Wa.MetaFile, Arch, Wa.BuildTarget, Wa.ToolChain]\r
-            for (TokenCName, TokenSpaceGuidCName) in Platform.Pcds:\r
-                DscDefaultValue = Platform.Pcds[(TokenCName, TokenSpaceGuidCName)].DefaultValue\r
+        for Pa in Wa.AutoGenObjectList:\r
+            for (TokenCName, TokenSpaceGuidCName) in Pa.Platform.Pcds:\r
+                DscDefaultValue = Pa.Platform.Pcds[(TokenCName, TokenSpaceGuidCName)].DefaultValue\r
                 if DscDefaultValue:\r
                     self.DscPcdDefault[(TokenCName, TokenSpaceGuidCName)] = DscDefaultValue\r
 \r
                 if DscDefaultValue:\r
                     self.DscPcdDefault[(TokenCName, TokenSpaceGuidCName)] = DscDefaultValue\r
 \r
@@ -914,6 +941,7 @@ class PcdReport(object):
                     #\r
                     DecDefaultValue = self.DecPcdDefault.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, DecType))\r
                     DscDefaultValue = self.DscPcdDefault.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName))\r
                     #\r
                     DecDefaultValue = self.DecPcdDefault.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, DecType))\r
                     DscDefaultValue = self.DscPcdDefault.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName))\r
+                    DscDefaultValBak= DscDefaultValue\r
                     DscDefaultValue = self.FdfPcdSet.get((Pcd.TokenCName, Key), DscDefaultValue)\r
                     InfDefaultValue = None\r
                     \r
                     DscDefaultValue = self.FdfPcdSet.get((Pcd.TokenCName, Key), DscDefaultValue)\r
                     InfDefaultValue = None\r
                     \r
@@ -977,39 +1005,39 @@ class PcdReport(object):
                         else:\r
                             DscMatch = (DscDefaultValue.strip() == PcdValue.strip())\r
 \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
+                        IsStructure = True\r
+                        if TypeName in ('DYNVPD', 'DEXVPD'):\r
+                            SkuInfoList = Pcd.SkuInfoList\r
+                        Pcd = GlobalData.gStructurePcd[self.Arch][(Pcd.TokenCName, Pcd.TokenSpaceGuidCName)]\r
+                        Pcd.DatumType = Pcd.StructName\r
+                        if TypeName in ('DYNVPD', 'DEXVPD'):\r
+                            Pcd.SkuInfoList = SkuInfoList\r
+                        if Pcd.SkuOverrideValues:\r
+                            DscMatch = True\r
+                            DecMatch = False\r
                     #\r
                     # Report PCD item according to their override relationship\r
                     #\r
                     if DecMatch and InfMatch:\r
                     #\r
                     # Report PCD item according to their override relationship\r
                     #\r
                     if DecMatch and InfMatch:\r
-                        FileWrite(File, '    %-*s: %6s %10s = %-22s' % (self.MaxLen, PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', PcdValue.strip()))\r
+                        self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '  ')\r
                     elif BuildOptionMatch:\r
                     elif BuildOptionMatch:\r
-                        FileWrite(File, ' *B %-*s: %6s %10s = %-22s' % (self.MaxLen, PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', PcdValue.strip()))\r
+                        self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*B')\r
                     else:\r
                         if DscMatch:\r
                             if (Pcd.TokenCName, Key) in self.FdfPcdSet:\r
                     else:\r
                         if DscMatch:\r
                             if (Pcd.TokenCName, Key) in self.FdfPcdSet:\r
-                                FileWrite(File, ' *F %-*s: %6s %10s = %-22s' % (self.MaxLen, PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', PcdValue.strip()))\r
+                                self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*F')\r
                             else:\r
                             else:\r
-                                FileWrite(File, ' *P %-*s: %6s %10s = %-22s' % (self.MaxLen, PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', PcdValue.strip()))\r
+                                self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*P')\r
                         else:\r
                         else:\r
-                            FileWrite(File, ' *M %-*s: %6s %10s = %-22s' % (self.MaxLen, PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', PcdValue.strip()))\r
-\r
-                    if TypeName in ('DYNHII', 'DEXHII', 'DYNVPD', 'DEXVPD'):\r
-                        for SkuInfo in Pcd.SkuInfoList.values():\r
-                            if TypeName in ('DYNHII', 'DEXHII'):\r
-                                FileWrite(File, '%*s: %s: %s' % (self.MaxLen + 4, SkuInfo.VariableGuid, SkuInfo.VariableName, SkuInfo.VariableOffset))\r
-                            else:\r
-                                FileWrite(File, '%*s' % (self.MaxLen + 4, SkuInfo.VpdOffset))\r
-                               \r
-                    if not DscMatch and DscDefaultValue != None:\r
-                        FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'DSC DEFAULT', DscDefaultValue.strip()))\r
-\r
-                    if not InfMatch and InfDefaultValue != None:\r
-                        FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'INF DEFAULT', InfDefaultValue.strip()))\r
-\r
-                    if not DecMatch and DecDefaultValue != None:\r
-                        FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'DEC DEFAULT', DecDefaultValue.strip()))\r
+                            self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*M')\r
 \r
                     if ModulePcdSet == None:\r
 \r
                     if ModulePcdSet == None:\r
+                        if IsStructure:\r
+                            continue\r
+                        if not TypeName in ('PATCH', 'FLAG', 'FIXED'):\r
+                            continue\r
                         if not BuildOptionMatch:\r
                             ModuleOverride = self.ModulePcdOverride.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName), {})\r
                             for ModulePath in ModuleOverride:\r
                         if not BuildOptionMatch:\r
                             ModuleOverride = self.ModulePcdOverride.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName), {})\r
                             for ModulePath in ModuleOverride:\r
@@ -1021,7 +1049,13 @@ class PcdReport(object):
                                     Match = (ModuleDefault.strip() == PcdValue.strip())\r
                                 if Match:\r
                                     continue\r
                                     Match = (ModuleDefault.strip() == PcdValue.strip())\r
                                 if Match:\r
                                     continue\r
-                                FileWrite(File, ' *M %-*s = %s' % (self.MaxLen + 19, ModulePath, ModuleDefault.strip()))\r
+                                IsByteArray, ArrayList = ByteArrayForamt(ModuleDefault.strip())\r
+                                if IsByteArray:\r
+                                    FileWrite(File, ' *M %-*s = %s' % (self.MaxLen + 19, ModulePath, '{'))\r
+                                    for Array in ArrayList:\r
+                                        FileWrite(File, '%s' % (Array))\r
+                                else:\r
+                                    FileWrite(File, ' *M %-*s = %s' % (self.MaxLen + 19, ModulePath, ModuleDefault.strip()))\r
 \r
         if ModulePcdSet == None:\r
             FileWrite(File, gSectionEnd)\r
 \r
         if ModulePcdSet == None:\r
             FileWrite(File, gSectionEnd)\r
@@ -1030,6 +1064,181 @@ class PcdReport(object):
                 FileWrite(File, gSubSectionEnd)\r
 \r
 \r
                 FileWrite(File, gSubSectionEnd)\r
 \r
 \r
+    def PrintPcdDefault(self, File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue):\r
+        if not DscMatch and DscDefaultValue != None:\r
+            Value = DscDefaultValue.strip()\r
+            IsByteArray, ArrayList = ByteArrayForamt(Value)\r
+            if IsByteArray:\r
+                FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'DSC DEFAULT', "{"))\r
+                for Array in ArrayList:\r
+                    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
+            Value = InfDefaultValue.strip()\r
+            IsByteArray, ArrayList = ByteArrayForamt(Value)\r
+            if IsByteArray:\r
+                FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'INF DEFAULT', "{"))\r
+                for Array in ArrayList:\r
+                    FileWrite(File, '%s' % (Array))\r
+            else:\r
+                FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'INF DEFAULT', Value))\r
+\r
+        if not DecMatch and DecDefaultValue != None:\r
+            Value = DecDefaultValue.strip()\r
+            IsByteArray, ArrayList = ByteArrayForamt(Value)\r
+            if IsByteArray:\r
+                FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'DEC DEFAULT', "{"))\r
+                for Array in ArrayList:\r
+                    FileWrite(File, '%s' % (Array))\r
+            else:\r
+                FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'DEC DEFAULT', Value))\r
+            if 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
+            Value = Pcd.DefaultValue\r
+            IsByteArray, ArrayList = ByteArrayForamt(Value)\r
+            if IsByteArray:\r
+                FileWrite(File, ' %-*s   : %6s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '{'))\r
+                for Array in ArrayList:\r
+                    FileWrite(File, '%s' % (Array))\r
+            else:\r
+                FileWrite(File, ' %-*s   : %6s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', Value))\r
+            if IsStructure:\r
+                OverrideValues = Pcd.SkuOverrideValues\r
+                if OverrideValues:\r
+                    Keys = OverrideValues.keys()\r
+                    Data = OverrideValues[Keys[0]]\r
+                    Struct = Data.values()[0]\r
+                    self.PrintStructureInfo(File, Struct)\r
+            self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue)\r
+        else:\r
+            FirstPrint = True\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
+                            Value = SkuInfo.DefaultStoreDict[DefaultStore]\r
+                            IsByteArray, ArrayList = ByteArrayForamt(Value)\r
+                            if FirstPrint:\r
+                                FirstPrint = False\r
+                                if IsByteArray:\r
+                                    FileWrite(File, ' %-*s   : %6s %10s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', '(' + DefaultStore + ')', '{'))\r
+                                    for Array in ArrayList:\r
+                                        FileWrite(File, '%s' % (Array))\r
+                                else:\r
+                                    FileWrite(File, ' %-*s   : %6s %10s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', '(' + DefaultStore + ')', Value))\r
+                            else:\r
+                                if IsByteArray:\r
+                                    FileWrite(File, ' %-*s   : %6s %10s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', '(' + DefaultStore + ')', '{'))\r
+                                    for Array in ArrayList:\r
+                                        FileWrite(File, '%s' % (Array))\r
+                                else:\r
+                                    FileWrite(File, ' %-*s   : %6s %10s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', '(' + DefaultStore + ')', Value))\r
+                            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
+                            self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue)\r
+                elif TypeName in ('DYNVPD', 'DEXVPD'):\r
+                    Value = SkuInfo.DefaultValue\r
+                    IsByteArray, ArrayList = ByteArrayForamt(Value)\r
+                    if FirstPrint:\r
+                        FirstPrint = False\r
+                        if IsByteArray:\r
+                            FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', "{"))\r
+                            for Array in ArrayList:\r
+                                FileWrite(File, '%s' % (Array))\r
+                        else:\r
+                            FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', Value))\r
+                    else:\r
+                        if IsByteArray:\r
+                            FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, ' ' , TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', "{"))\r
+                            for Array in ArrayList:\r
+                                FileWrite(File, '%s' % (Array))\r
+                        else:\r
+                            FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, ' ' , TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', Value))\r
+                    FileWrite(File, '%*s' % (self.MaxLen + 4, SkuInfo.VpdOffset))\r
+                    if IsStructure:\r
+                        OverrideValues = Pcd.SkuOverrideValues[Sku]\r
+                        if OverrideValues:\r
+                            Keys = OverrideValues.keys()\r
+                            Struct = OverrideValues[Keys[0]]\r
+                            self.PrintStructureInfo(File, Struct)\r
+                    self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue)\r
+                else:\r
+                    Value = SkuInfo.DefaultValue\r
+                    IsByteArray, ArrayList = ByteArrayForamt(Value)\r
+                    if FirstPrint:\r
+                        FirstPrint = False\r
+                        if IsByteArray:\r
+                            FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', '{'))\r
+                            for Array in ArrayList:\r
+                                FileWrite(File, '%s' % (Array))\r
+                        else:\r
+                            FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', Value))\r
+                    else:\r
+                        if IsByteArray:\r
+                            FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', '{'))\r
+                            for Array in ArrayList:\r
+                                FileWrite(File, '%s' % (Array))\r
+                        else:\r
+                            FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', Value))\r
+                    if IsStructure:\r
+                        OverrideValues = Pcd.SkuOverrideValues[Sku]\r
+                        if OverrideValues:\r
+                            Keys = OverrideValues.keys()\r
+                            Struct = OverrideValues[Keys[0]]\r
+                            self.PrintStructureInfo(File, Struct)\r
+                    self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue)\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
+            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
+\r
+    def StrtoHex(self, value):\r
+        try:\r
+            value = hex(int(value))\r
+            return value\r
+        except:\r
+            if value.startswith("L\"") and value.endswith("\""):\r
+                valuelist = []\r
+                for ch in value[2:-1]:\r
+                    valuelist.append(hex(ord(ch)))\r
+                    valuelist.append('0x00')\r
+                return valuelist\r
+            elif value.startswith("\"") and value.endswith("\""):\r
+                return hex(ord(value[1:-1]))\r
+            elif value.startswith("{") and value.endswith("}"):\r
+                valuelist = []\r
+                if ',' not in value:\r
+                    return value[1:-1]\r
+                for ch in value[1:-1].split(','):\r
+                    ch = ch.strip()\r
+                    if ch.startswith('0x') or ch.startswith('0X'):\r
+                        valuelist.append(ch)\r
+                        continue\r
+                    try:\r
+                        valuelist.append(hex(int(ch.strip())))\r
+                    except:\r
+                        pass\r
+                return valuelist\r
+            else:\r
+                return value\r
 \r
 ##\r
 # Reports platform and module Prediction information\r
 \r
 ##\r
 # Reports platform and module Prediction information\r
@@ -1412,10 +1621,9 @@ class FdRegionReport(object):
         #\r
         # Collect PCDs defined in DSC file\r
         #\r
         #\r
         # Collect PCDs defined in DSC file\r
         #\r
-        for arch in Wa.ArchList:\r
-            Platform = Wa.BuildDatabase[Wa.MetaFile, arch]\r
-            for (TokenCName, TokenSpaceGuidCName) in Platform.Pcds:\r
-                DscDefaultValue = Platform.Pcds[(TokenCName, TokenSpaceGuidCName)].DefaultValue\r
+        for Pa in Wa.AutoGenObjectList:\r
+            for (TokenCName, TokenSpaceGuidCName) in Pa.Platform.Pcds:\r
+                DscDefaultValue = Pa.Platform.Pcds[(TokenCName, TokenSpaceGuidCName)].DefaultValue\r
                 PlatformPcds[(TokenCName, TokenSpaceGuidCName)] = DscDefaultValue\r
 \r
         #\r
                 PlatformPcds[(TokenCName, TokenSpaceGuidCName)] = DscDefaultValue\r
 \r
         #\r
@@ -1619,7 +1827,16 @@ class FdReport(object):
             FileWrite(File, "Size:               0x%X (%.0fK)" % (self.VPDSize, self.VPDSize / 1024.0))\r
             FileWrite(File, gSubSectionSep)\r
             for item in self.VPDInfoList:\r
             FileWrite(File, "Size:               0x%X (%.0fK)" % (self.VPDSize, self.VPDSize / 1024.0))\r
             FileWrite(File, gSubSectionSep)\r
             for item in self.VPDInfoList:\r
-                FileWrite(File, item)\r
+                ValueList = item.split('|')\r
+                Value = ValueList[-1].strip()\r
+                IsByteArray, ArrayList = ByteArrayForamt(Value)\r
+                if IsByteArray:\r
+                    ValueList[-1] = ' {'\r
+                    FileWrite(File, '|'.join(ValueList))\r
+                    for Array in ArrayList:\r
+                        FileWrite(File, '%s' % (Array))\r
+                else:\r
+                    FileWrite(File, item)\r
             FileWrite(File, gSubSectionEnd)\r
         FileWrite(File, gSectionEnd)\r
 \r
             FileWrite(File, gSubSectionEnd)\r
         FileWrite(File, gSectionEnd)\r
 \r
@@ -1717,6 +1934,10 @@ class PlatformReport(object):
         FileWrite(File, "Architectures:        %s" % self.Architectures)\r
         FileWrite(File, "Tool Chain:           %s" % self.ToolChain)\r
         FileWrite(File, "Target:               %s" % self.Target)\r
         FileWrite(File, "Architectures:        %s" % self.Architectures)\r
         FileWrite(File, "Tool Chain:           %s" % self.ToolChain)\r
         FileWrite(File, "Target:               %s" % self.Target)\r
+        if GlobalData.gSkuids:\r
+            FileWrite(File, "SKUID:                %s" % " ".join(GlobalData.gSkuids))\r
+        if GlobalData.gDefaultStores:\r
+            FileWrite(File, "DefaultStore:         %s" % " ".join(GlobalData.gDefaultStores))\r
         FileWrite(File, "Output Path:          %s" % self.OutputPath)\r
         FileWrite(File, "Build Environment:    %s" % self.BuildEnvironment)\r
         FileWrite(File, "Build Duration:       %s" % BuildDuration)\r
         FileWrite(File, "Output Path:          %s" % self.OutputPath)\r
         FileWrite(File, "Build Environment:    %s" % self.BuildEnvironment)\r
         FileWrite(File, "Build Duration:       %s" % BuildDuration)\r