]> 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 a1ee43aa26ed41d31b4f3613965876e4b4fe3db6..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.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.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
@@ -145,6 +140,37 @@ def FileWrite(File, String, Wrapper=False):
         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
@@ -307,7 +333,11 @@ class LibraryReport(object):
             LibConstructorList = Lib.ConstructorList\r
             LibDesstructorList = Lib.DestructorList\r
             LibDepexList = Lib.DepexExpression[M.Arch, M.ModuleType]\r
-            self.LibraryList.append((LibInfPath, LibClassList, LibConstructorList, LibDesstructorList, LibDepexList))\r
+            for LibAutoGen in M.LibraryAutoGenList:\r
+                if LibInfPath == LibAutoGen.MetaFile.Path:\r
+                    LibTime = LibAutoGen.BuildTime\r
+                    break\r
+            self.LibraryList.append((LibInfPath, LibClassList, LibConstructorList, LibDesstructorList, LibDepexList, LibTime))\r
 \r
     ##\r
     # Generate report for module library information\r
@@ -344,6 +374,8 @@ class LibraryReport(object):
                     LibDepex = " ".join(LibraryItem[4])\r
                     if LibDepex:\r
                         EdkIILibInfo += " Depex = " + LibDepex\r
+                    if LibraryItem[5]:\r
+                        EdkIILibInfo += " Time = " + LibraryItem[5]\r
                     if EdkIILibInfo:\r
                         FileWrite(File, "{%s: %s}" % (LibClass, EdkIILibInfo))\r
                     else:\r
@@ -553,6 +585,7 @@ class ModuleReport(object):
         self.PciDeviceId = M.Module.Defines.get("PCI_DEVICE_ID", "")\r
         self.PciVendorId = M.Module.Defines.get("PCI_VENDOR_ID", "")\r
         self.PciClassCode = M.Module.Defines.get("PCI_CLASS_CODE", "")\r
+        self.BuildTime = M.BuildTime\r
 \r
         self._BuildDir = M.BuildDir\r
         self.ModulePcdSet = {}\r
@@ -648,6 +681,8 @@ class ModuleReport(object):
             FileWrite(File, "SHA1 HASH:            %s *%s" % (self.Hash, self.ModuleName + ".efi"))\r
         if self.BuildTimeStamp:\r
             FileWrite(File, "Build Time Stamp:     %s" % self.BuildTimeStamp)\r
+        if self.BuildTime:\r
+            FileWrite(File, "Module Build Time:    %s" % self.BuildTime)\r
         if self.DriverType:\r
             FileWrite(File, "Driver Type:          %s" % self.DriverType)\r
         if self.UefiSpecVersion:\r
@@ -714,6 +749,7 @@ class PcdReport(object):
         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
@@ -721,6 +757,7 @@ class PcdReport(object):
 \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
@@ -737,6 +774,13 @@ class PcdReport(object):
             UnusedPcdFullList = []\r
             for item in Pa.Platform.Pcds:\r
                 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
+                        PcdList = self.AllPcds.setdefault(Pcd.TokenSpaceGuidCName, {}).setdefault(T, [])\r
+                        if Pcd in PcdList:\r
+                            Pcd.Type = T\r
+                            break\r
                 if not Pcd.Type:\r
                     PcdTypeFlag = False\r
                     for package in Pa.PackageList:\r
@@ -814,10 +858,9 @@ class PcdReport(object):
         # 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
@@ -898,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
+                    DscDefaultValBak= DscDefaultValue\r
                     DscDefaultValue = self.FdfPcdSet.get((Pcd.TokenCName, Key), DscDefaultValue)\r
                     InfDefaultValue = None\r
                     \r
@@ -961,39 +1005,39 @@ class PcdReport(object):
                         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 BuildOptionMatch:\r
-                        FileWrite(File, ' *B %-*s: %6s %10s = %-22s' % (self.MaxLen, PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', PcdValue.strip()))\r
-                    elif DecMatch and InfMatch:\r
-                        FileWrite(File, '    %-*s: %6s %10s = %-22s' % (self.MaxLen, PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', PcdValue.strip()))\r
+                    if DecMatch and InfMatch:\r
+                        self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '  ')\r
+                    elif BuildOptionMatch:\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
-                                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
-                                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
-                            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
+                        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
@@ -1005,7 +1049,13 @@ class PcdReport(object):
                                     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
@@ -1014,6 +1064,181 @@ class PcdReport(object):
                 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
@@ -1396,10 +1621,9 @@ class FdRegionReport(object):
         #\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
@@ -1603,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, 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
@@ -1689,18 +1922,31 @@ class PlatformReport(object):
     # @param self            The object pointer\r
     # @param File            The file object for report\r
     # @param BuildDuration   The total time to build the modules\r
+    # @param AutoGenTime     The total time of AutoGen Phase\r
+    # @param MakeTime        The total time of Make Phase\r
+    # @param GenFdsTime      The total time of GenFds Phase\r
     # @param ReportType      The kind of report items in the final report file\r
     #\r
-    def GenerateReport(self, File, BuildDuration, ReportType):\r
+    def GenerateReport(self, File, BuildDuration, AutoGenTime, MakeTime, GenFdsTime, ReportType):\r
         FileWrite(File, "Platform Summary")\r
         FileWrite(File, "Platform Name:        %s" % self.PlatformName)\r
         FileWrite(File, "Platform DSC Path:    %s" % self.PlatformDscPath)\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
+        if AutoGenTime:\r
+            FileWrite(File, "AutoGen Duration:     %s" % AutoGenTime)\r
+        if MakeTime:\r
+            FileWrite(File, "Make Duration:        %s" % MakeTime)\r
+        if GenFdsTime:\r
+            FileWrite(File, "GenFds Duration:      %s" % GenFdsTime)\r
         FileWrite(File, "Report Content:       %s" % ", ".join(ReportType))\r
 \r
         if GlobalData.MixedPcd:\r
@@ -1775,13 +2021,16 @@ class BuildReport(object):
     #\r
     # @param self            The object pointer\r
     # @param BuildDuration   The total time to build the modules\r
+    # @param AutoGenTime     The total time of AutoGen phase\r
+    # @param MakeTime        The total time of Make phase\r
+    # @param GenFdsTime      The total time of GenFds phase\r
     #\r
-    def GenerateReport(self, BuildDuration):\r
+    def GenerateReport(self, BuildDuration, AutoGenTime, MakeTime, GenFdsTime):\r
         if self.ReportFile:\r
             try:\r
                 File = StringIO('')\r
                 for (Wa, MaList) in self.ReportList:\r
-                    PlatformReport(Wa, MaList, self.ReportType).GenerateReport(File, BuildDuration, self.ReportType)\r
+                    PlatformReport(Wa, MaList, self.ReportType).GenerateReport(File, BuildDuration, AutoGenTime, MakeTime, GenFdsTime, self.ReportType)\r
                 Content = FileLinesSplit(File.getvalue(), gLineMaxLength)\r
                 SaveFileOnChange(self.ReportFile, Content, True)\r
                 EdkLogger.quiet("Build report can be found at %s" % os.path.abspath(self.ReportFile))\r