]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools: Enable Module Scope Structure Pcd
authorBob Feng <bob.c.feng@intel.com>
Wed, 4 Nov 2020 03:01:39 +0000 (11:01 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Thu, 5 Nov 2020 04:27:28 +0000 (04:27 +0000)
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2648

This patch is to enable the Module scoped Structure Pcd usage.
User can set structure pcd field value in module scope. For example,
under the [components] section of a dsc file, user can override some
field value for a specific module.

  Package/Module.inf{
      <PcdsFixedAtBuild>
      gUefiTokenSpaceGuid.StructurePcdModule.FieldName | 5
  }

Signed-off-by: Bob Feng <bob.c.feng@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Yuwei Chen <yuwei.chen@intel.com>
Tested-by: Liming Gao <gaoliming@byosoft.com.cn>
Acked-by: Liming Gao <gaoliming@byosoft.com.cn>
BaseTools/Source/Python/AutoGen/DataPipe.py
BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py
BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
BaseTools/Source/Python/Workspace/BuildClassObject.py
BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools/Source/Python/build/BuildReport.py

index 50403fbfb56285becc51c3353a49881f93e103ce..86ac2b928d9c4afc9318f0f47d4fa7e8f132db52 100755 (executable)
@@ -72,9 +72,10 @@ class MemoryDataPipe(DataPipe):
         #Platform Module Pcds\r
         ModulePcds = {}\r
         for m in PlatformInfo.Platform.Modules:\r
-            m_pcds =  PlatformInfo.Platform.Modules[m].Pcds\r
+            module = PlatformInfo.Platform.Modules[m]\r
+            m_pcds =  module.Pcds\r
             if m_pcds:\r
-                ModulePcds[(m.File,m.Root,m.Arch)] = [PCD_DATA(\r
+                ModulePcds[module.Guid] = [PCD_DATA(\r
             pcd.TokenCName,pcd.TokenSpaceGuidCName,pcd.Type,\r
             pcd.DatumType,pcd.SkuInfoList,pcd.DefaultValue,\r
             pcd.MaxDatumSize,pcd.UserDefinedDefaultStoresFlag,pcd.validateranges,\r
index eebf6e87f5b4eb11922d9216628d63d5c832a938..d70b0d7ae828d9da65100bcefb3e8f0bf78981dc 100755 (executable)
@@ -1032,7 +1032,7 @@ class ModuleAutoGen(AutoGen):
     @cached_property\r
     def ModulePcdList(self):\r
         # apply PCD settings from platform\r
-        RetVal = self.PlatformInfo.ApplyPcdSetting(self.Module, self.Module.Pcds)\r
+        RetVal = self.PlatformInfo.ApplyPcdSetting(self, self.Module.Pcds)\r
 \r
         return RetVal\r
     @cached_property\r
@@ -1063,7 +1063,7 @@ class ModuleAutoGen(AutoGen):
                     continue\r
                 Pcds.add(Key)\r
                 PcdsInLibrary[Key] = copy.copy(Library.Pcds[Key])\r
-            RetVal.extend(self.PlatformInfo.ApplyPcdSetting(self.Module, PcdsInLibrary, Library=Library))\r
+            RetVal.extend(self.PlatformInfo.ApplyPcdSetting(self, PcdsInLibrary, Library=Library))\r
         return RetVal\r
 \r
     ## Get the GUID value mapping\r
index 9dd93b9beb1214f531f7793f3364004e753f8b9a..8e60643d1fd9cc4b21c6d03682f476e4c1b93351 100644 (file)
@@ -479,8 +479,9 @@ class PlatformInfo(AutoGenInfo):
                 SkuName : SkuInfoClass(SkuName, self.Platform.SkuIds[SkuName][0], '', '', '', '', '', ToPcd.DefaultValue)\r
             }\r
 \r
-    def ApplyPcdSetting(self, Module, Pcds, Library=""):\r
+    def ApplyPcdSetting(self, Ma, Pcds, Library=""):\r
         # for each PCD in module\r
+        Module=Ma.Module\r
         for Name, Guid in Pcds:\r
             PcdInModule = Pcds[Name, Guid]\r
             # find out the PCD setting in platform\r
@@ -507,9 +508,12 @@ class PlatformInfo(AutoGenInfo):
                                 )\r
 \r
         # override PCD settings with module specific setting\r
+        ModuleScopePcds = self.DataPipe.Get("MOL_PCDS")\r
         if Module in self.Platform.Modules:\r
             PlatformModule = self.Platform.Modules[str(Module)]\r
-            for Key  in PlatformModule.Pcds:\r
+            PCD_DATA = ModuleScopePcds.get(Ma.Guid,{})\r
+            mPcds = {(pcd.TokenCName,pcd.TokenSpaceGuidCName): pcd for pcd in PCD_DATA}\r
+            for Key  in mPcds:\r
                 if self.BuildOptionPcd:\r
                     for pcd in self.BuildOptionPcd:\r
                         (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, _) = pcd\r
@@ -528,7 +532,7 @@ class PlatformInfo(AutoGenInfo):
                             Flag = True\r
                             break\r
                 if Flag:\r
-                    self._OverridePcd(ToPcd, PlatformModule.Pcds[Key], Module, Msg="DSC Components Module scoped PCD section", Library=Library)\r
+                    self._OverridePcd(ToPcd, mPcds[Key], Module, Msg="DSC Components Module scoped PCD section", Library=Library)\r
         # use PCD value to calculate the MaxDatumSize when it is not specified\r
         for Name, Guid in Pcds:\r
             Pcd = Pcds[Name, Guid]\r
index 26ab8e7f360897d41eccc51b3e0654bfff49eb14..c001828937ea85f3f6192e42b9ec94956cbb0e72 100644 (file)
@@ -1043,7 +1043,13 @@ class PlatformAutoGen(AutoGen):
 \r
     @cached_property\r
     def _MbList(self):\r
-        return [self.BuildDatabase[m, self.Arch, self.BuildTarget, self.ToolChain] for m in self.Platform.Modules]\r
+        ModuleList = []\r
+        for m in self.Platform.Modules:\r
+            component = self.Platform.Modules[m]\r
+            module = self.BuildDatabase[m, self.Arch, self.BuildTarget, self.ToolChain]\r
+            module.Guid = component.Guid\r
+            ModuleList.append(module)\r
+        return ModuleList\r
 \r
     @cached_property\r
     def _MaList(self):\r
index db40e3b10c3cf63c5f1a5934fa721fd71b8fe458..ebb65fc2fe932d8b91e1fe1f852bd759ff04bf3f 100644 (file)
@@ -70,6 +70,7 @@ class PcdClassObject(object):
             self.DscDefaultValue = Value\r
         self.PcdValueFromComm = ""\r
         self.PcdValueFromFdf = ""\r
+        self.PcdValueFromComponents = {} #{ModuleGuid:value, file_path,lineNo}\r
         self.CustomAttribute = {}\r
         self.UserDefinedDefaultStoresFlag = UserDefinedDefaultStoresFlag\r
         self._Capacity = None\r
@@ -298,6 +299,7 @@ class StructurePcd(PcdClassObject):
         self.PcdFieldValueFromComm = OrderedDict()\r
         self.PcdFieldValueFromFdf = OrderedDict()\r
         self.DefaultFromDSC=None\r
+        self.PcdFiledValueFromDscComponent = OrderedDict()\r
     def __repr__(self):\r
         return self.TypeName\r
 \r
@@ -324,6 +326,12 @@ class StructurePcd(PcdClassObject):
         self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldName] = [Value.strip(), FileName, LineNo]\r
         return self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldName]\r
 \r
+    def AddComponentOverrideValue(self,FieldName, Value, ModuleGuid, FileName="", LineNo=0, DimensionAttr = '-1'):\r
+        self.PcdFiledValueFromDscComponent.setdefault(ModuleGuid, OrderedDict())\r
+        self.PcdFiledValueFromDscComponent[ModuleGuid].setdefault(DimensionAttr,OrderedDict())\r
+        self.PcdFiledValueFromDscComponent[ModuleGuid][DimensionAttr][FieldName] =  [Value.strip(), FileName, LineNo]\r
+        return self.PcdFiledValueFromDscComponent[ModuleGuid][DimensionAttr][FieldName]\r
+\r
     def SetPcdMode (self, PcdMode):\r
         self.PcdMode = PcdMode\r
 \r
@@ -365,6 +373,7 @@ class StructurePcd(PcdClassObject):
             self.ValueChain = PcdObject.ValueChain if PcdObject.ValueChain else self.ValueChain\r
             self.PcdFieldValueFromComm = PcdObject.PcdFieldValueFromComm if PcdObject.PcdFieldValueFromComm else self.PcdFieldValueFromComm\r
             self.PcdFieldValueFromFdf = PcdObject.PcdFieldValueFromFdf if PcdObject.PcdFieldValueFromFdf else self.PcdFieldValueFromFdf\r
+            self.PcdFiledValueFromDscComponent = PcdObject.PcdFiledValueFromDscComponent if PcdObject.PcdFiledValueFromDscComponent else self.PcdFiledValueFromDscComponent\r
 \r
     def __deepcopy__(self,memo):\r
         new_pcd = StructurePcd()\r
@@ -383,6 +392,7 @@ class StructurePcd(PcdClassObject):
         new_pcd.SkuOverrideValues = CopyDict(self.SkuOverrideValues)\r
         new_pcd.PcdFieldValueFromComm = CopyDict(self.PcdFieldValueFromComm)\r
         new_pcd.PcdFieldValueFromFdf = CopyDict(self.PcdFieldValueFromFdf)\r
+        new_pcd.PcdFiledValueFromDscComponent = CopyDict(self.PcdFiledValueFromDscComponent)\r
         new_pcd.ValueChain = {item for item in self.ValueChain}\r
         return new_pcd\r
 \r
@@ -463,6 +473,8 @@ class ModuleBuildClassObject(object):
         self.Pcds                    = {}\r
         self.BuildOptions            = {}\r
         self.Depex                   = {}\r
+        self.StrPcdSet               = []\r
+        self.StrPcdOverallValue      = {}\r
 \r
     ## Convert the class to a string\r
     #\r
index 1ed3d9b909586a6d65d184343c98555b8513a76c..5f07d3e75c88cd39102b8054a579474a18d313b7 100644 (file)
@@ -755,9 +755,10 @@ class DscBuildData(PlatformBuildClassObject):
                 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
                                 ExtraData=ErrorInfo)\r
 \r
+            ModuleBuildData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
             Module = ModuleBuildClassObject()\r
             Module.MetaFile = ModuleFile\r
-\r
+            Module.Guid = ModuleBuildData.Guid\r
             # get module private library instance\r
             RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, ModuleId]\r
             for Record in RecordList:\r
@@ -778,7 +779,7 @@ class DscBuildData(PlatformBuildClassObject):
                 Module.LibraryClasses[LibraryClass] = LibraryPath\r
                 if LibraryPath not in self.LibraryInstances:\r
                     self.LibraryInstances.append(LibraryPath)\r
-\r
+            S_PcdSet = []\r
             # get module private PCD setting\r
             for Type in [MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, \\r
                          MODEL_PCD_FEATURE_FLAG, MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]:\r
@@ -792,20 +793,31 @@ class DscBuildData(PlatformBuildClassObject):
                     else:\r
                         MaxDatumSize = ''\r
                     TypeString = self._PCD_TYPE_STRING_[Type]\r
-                    Pcd = PcdClassObject(\r
-                            PcdCName,\r
-                            TokenSpaceGuid,\r
-                            TypeString,\r
-                            '',\r
-                            DefaultValue,\r
-                            '',\r
-                            MaxDatumSize,\r
-                            {},\r
-                            False,\r
-                            None\r
-                            )\r
-                    Module.Pcds[PcdCName, TokenSpaceGuid] = Pcd\r
 \r
+                    TCName,PCName,DimensionAttr,Field = self.ParsePcdNameStruct(TokenSpaceGuid, PcdCName)\r
+\r
+                    if ("." in TokenSpaceGuid or "[" in PcdCName):\r
+                        S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, ModuleBuildData.Guid, "", Dummy5, AnalyzePcdExpression(Setting)[0]])\r
+                        DefaultValue = ''\r
+                    if ( PCName,TCName) not in Module.Pcds:\r
+                        Pcd = PcdClassObject(\r
+                                PCName,\r
+                                TCName,\r
+                                TypeString,\r
+                                '',\r
+                                DefaultValue,\r
+                                '',\r
+                                MaxDatumSize,\r
+                                {},\r
+                                False,\r
+                                None,\r
+                                IsDsc=True)\r
+                        Module.Pcds[PCName, TCName] = Pcd\r
+\r
+            Module.StrPcdSet = S_PcdSet\r
+            for TCName,PCName, _,_,_,_,_,_ in S_PcdSet:\r
+                if (PCName,TCName) in Module.Pcds:\r
+                    Module.StrPcdOverallValue[(PCName,TCName)] = Module.Pcds[(PCName,TCName)].DefaultValue, self.MetaFile,Dummy5\r
             # get module private build options\r
             RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, None, ModuleId]\r
             for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList:\r
@@ -822,7 +834,9 @@ class DscBuildData(PlatformBuildClassObject):
                                     File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)\r
                 ModuleFile = ProcessDuplicatedInf(ModuleFile, RecordList[0][2], GlobalData.gWorkspace)\r
                 ModuleFile.Arch = self._Arch\r
-\r
+                Module.Guid = RecordList[0][2]\r
+                for item in Module.StrPcdSet:\r
+                    item[4] = RecordList[0][2]\r
             self._Modules[ModuleFile] = Module\r
         return self._Modules\r
 \r
@@ -1499,7 +1513,15 @@ class DscBuildData(PlatformBuildClassObject):
                                 File=self.MetaFile, Line = Dummy5)\r
 \r
                 S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])\r
-\r
+        ModuleScopeOverallValue = {}\r
+        for m in self.Modules.values():\r
+            mguid = m.Guid\r
+            if m.StrPcdSet:\r
+                S_PcdSet.extend(m.StrPcdSet)\r
+                mguid = m.StrPcdSet[0][4]\r
+            for (PCName,TCName) in m.StrPcdOverallValue:\r
+                Value, dsc_file, lineNo = m.StrPcdOverallValue[(PCName,TCName)]\r
+                ModuleScopeOverallValue.setdefault((PCName,TCName),{})[mguid] = Value, dsc_file, lineNo\r
         # handle pcd value override\r
         StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet)\r
         S_pcd_set = OrderedDict()\r
@@ -1517,6 +1539,11 @@ class DscBuildData(PlatformBuildClassObject):
             for str_pcd_data in StrPcdSet[str_pcd]:\r
                 if str_pcd_data[4] in SkuIds:\r
                     str_pcd_obj_str.AddOverrideValue(str_pcd_data[3], str(str_pcd_data[7]), TAB_DEFAULT if str_pcd_data[4] == TAB_COMMON else str_pcd_data[4], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[5] == TAB_COMMON else str_pcd_data[5], self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2])\r
+                elif GlobalData.gGuidPattern.match(str_pcd_data[4]):\r
+                    str_pcd_obj_str.AddComponentOverrideValue(str_pcd_data[3], str(str_pcd_data[7]), str_pcd_data[4].replace("-","S"), self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2])\r
+                    PcdComponentValue = ModuleScopeOverallValue.get((str_pcd_obj_str.TokenCName,str_pcd_obj_str.TokenSpaceGuidCName))\r
+                    for module_guid in PcdComponentValue:\r
+                        str_pcd_obj_str.PcdValueFromComponents[module_guid.replace("-","S")] = PcdComponentValue[module_guid]\r
             S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str\r
 \r
         # Add the Structure PCD that only defined in DEC, don't have override in DSC file\r
@@ -1575,7 +1602,10 @@ class DscBuildData(PlatformBuildClassObject):
                             stru_pcd.ValueChain.add((skuid, defaultstoreid))\r
         S_pcd_set = DscBuildData.OverrideByFdf(S_pcd_set,self.WorkspaceDir)\r
         S_pcd_set = DscBuildData.OverrideByComm(S_pcd_set)\r
+\r
+        # Create a tool to caculate structure pcd value\r
         Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set)\r
+\r
         if Str_Pcd_Values:\r
             for (skuname, StoreName, PcdGuid, PcdName, PcdValue) in Str_Pcd_Values:\r
                 str_pcd_obj = S_pcd_set.get((PcdName, PcdGuid))\r
@@ -1593,6 +1623,14 @@ class DscBuildData(PlatformBuildClassObject):
                                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
                     if skuname in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON):\r
                         str_pcd_obj.DefaultValue = PcdValue\r
+                    else:\r
+                        #Module Scope Structure Pcd\r
+                        moduleguid = skuname.replace("S","-")\r
+                        if GlobalData.gGuidPattern.match(moduleguid):\r
+                            for component in self.Modules.values():\r
+                                if component.Guid == moduleguid:\r
+                                    component.Pcds[(PcdName, PcdGuid)].DefaultValue = PcdValue\r
+\r
                 else:\r
                     if skuname not in str_pcd_obj.SkuInfoList:\r
                         nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)\r
@@ -2341,6 +2379,75 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = CApp + "}\n"\r
         return CApp\r
 \r
+    def GenerateModuleScopeValue(self, Pcd):\r
+        CApp = "// Value in Dsc Module scope \n"\r
+        for ModuleGuid in Pcd.PcdFiledValueFromDscComponent:\r
+\r
+            CApp = CApp + "void Assign_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, ModuleGuid,Pcd.BaseDatumType)\r
+            CApp = CApp + '  UINT32  FieldSize;\n'\r
+            CApp = CApp + '  CHAR8   *Value;\n'\r
+            pcddefaultvalue, file_path,lineNo = Pcd.PcdValueFromComponents.get(ModuleGuid,(None,None,None))\r
+\r
+            if pcddefaultvalue:\r
+                IsArray = _IsFieldValueAnArray(pcddefaultvalue)\r
+                if IsArray:\r
+                    try:\r
+                        FieldList = ValueExpressionEx(pcddefaultvalue, TAB_VOID)(True)\r
+                    except BadExpression:\r
+                        EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from %s Line %s: %s" %\r
+                                        (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, file_path, lineNo, FieldList))\r
+                Value, ValueSize = ParseFieldValue (FieldList)\r
+\r
+                if isinstance(Value, str):\r
+                    CApp = CApp + '  Pcd = %s; // From %s Line %s \n' % (Value, file_path, lineNo)\r
+                elif IsArray:\r
+                #\r
+                # Use memcpy() to copy value into field\r
+                #\r
+                    CApp = CApp + '  Value     = %s; // From %s Line %s.\n' % (DscBuildData.IntToCString(Value, ValueSize), file_path, lineNo)\r
+                    CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+\r
+\r
+            PcdFiledValue = Pcd.PcdFiledValueFromDscComponent.get(ModuleGuid)\r
+            for index in PcdFiledValue:\r
+                FieldList = PcdFiledValue[index]\r
+                if not FieldList:\r
+                    continue\r
+                for FieldName in FieldList:\r
+                    IsArray = _IsFieldValueAnArray(FieldList[FieldName][0])\r
+                    if IsArray:\r
+                        try:\r
+                            FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
+                        except BadExpression:\r
+                            EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
+                                            (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
+                        except:\r
+                            print("error")\r
+                    try:\r
+                        Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
+                    except Exception:\r
+                        EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
+                    if isinstance(Value, str):\r
+                        CApp = CApp + '  Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                    elif IsArray:\r
+                    #\r
+                    # Use memcpy() to copy value into field\r
+                    #\r
+                        CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
+                        CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                        CApp = CApp + '  __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.BaseDatumType, FieldName, ValueSize, Pcd.BaseDatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                        CApp = CApp + '  memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
+                    else:\r
+                        if '[' in FieldName and ']' in FieldName:\r
+                            Index = int(FieldName.split('[')[1].split(']')[0])\r
+                            CApp = CApp + '  __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)\r
+                        if ValueSize > 4:\r
+                            CApp = CApp + '  Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                        else:\r
+                            CApp = CApp + '  Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+            CApp = CApp + "}\n"\r
+        return CApp\r
+\r
     @staticmethod\r
     def GenerateCommandLineValueStatement(Pcd):\r
         CApp = '  Assign_%s_%s_CommandLine_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
@@ -2414,6 +2521,85 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = '  Assign_%s_%s_Fdf_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
         return CApp\r
 \r
+    @staticmethod\r
+    def GenerateModuleValueStatement(module_guid, Pcd):\r
+        CApp = "  Assign_%s_%s_%s_Value(Pcd);\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, module_guid)\r
+        return CApp\r
+    def GenerateModuleScopeInitializeFunc(self,SkuName, Pcd,  InitByteValue, CApp):\r
+        for module_guid in Pcd.PcdFiledValueFromDscComponent:\r
+            CApp = CApp + 'void\n'\r
+            CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+            CApp = CApp + '  void\n'\r
+            CApp = CApp + '  )\n'\r
+            CApp = CApp + '{\n'\r
+            CApp = CApp + '  UINT32  Size;\n'\r
+            CApp = CApp + '  UINT32  FieldSize;\n'\r
+            CApp = CApp + '  CHAR8   *Value;\n'\r
+            CApp = CApp + '  UINT32  OriginalSize;\n'\r
+            CApp = CApp + '  VOID    *OriginalPcd;\n'\r
+\r
+            CApp = CApp + '  %s      *Pcd;  // From %s Line %d \n' % (Pcd.BaseDatumType,Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
+\r
+            CApp = CApp + '\n'\r
+\r
+            PcdDefaultValue = StringToArray(Pcd.DefaultValueFromDec.strip())\r
+            InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)\r
+            #\r
+            # Get current PCD value and size\r
+            #\r
+            CApp = CApp + '  OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+\r
+            #\r
+            # Determine the size of the PCD.  For simple structures, sizeof(TYPE) provides\r
+            # the correct value.  For structures with a flexible array member, the flexible\r
+            # array member is detected, and the size is based on the highest index used with\r
+            # the flexible array member.  The flexible array member must be the last field\r
+            # in a structure.  The size formula for this case is:\r
+            # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)\r
+            #\r
+            CApp = CApp + DscBuildData.GenerateSizeStatments(Pcd,SkuName,TAB_DEFAULT_STORES_DEFAULT)\r
+            if Pcd.IsArray() and Pcd.Capacity[-1] != "-1":\r
+                CApp = CApp + '  OriginalSize = OriginalSize < sizeof(%s) * %d? OriginalSize:sizeof(%s) * %d; \n' % (Pcd.BaseDatumType,Pcd.PcdArraySize(),Pcd.BaseDatumType,Pcd.PcdArraySize())\r
+                CApp = CApp + '  Size = sizeof(%s) * %d; \n' % (Pcd.BaseDatumType,Pcd.PcdArraySize())\r
+\r
+            #\r
+            # Allocate and zero buffer for the PCD\r
+            # Must handle cases where current value is smaller, larger, or same size\r
+            # Always keep that larger one as the current size\r
+            #\r
+            CApp = CApp + '  Size = (OriginalSize > Size ? OriginalSize : Size);\n'\r
+            CApp = CApp + '  Pcd     = (%s *)malloc (Size);\n' % (Pcd.BaseDatumType,)\r
+            CApp = CApp + '  memset (Pcd, 0, Size);\n'\r
+\r
+            #\r
+            # Copy current PCD value into allocated buffer.\r
+            #\r
+            CApp = CApp + '  memcpy (Pcd, OriginalPcd, OriginalSize);\n'\r
+\r
+            #\r
+            # Assign field values in PCD\r
+            #\r
+            CApp = CApp + DscBuildData.GenerateDefaultValueAssignStatement(Pcd)\r
+\r
+            CApp = CApp + "// SkuName: %s,  DefaultStoreName: STANDARD \n" % self.SkuIdMgr.SystemSkuId\r
+            CApp = CApp + DscBuildData.GenerateInitValueStatement(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT)\r
+            CApp = CApp + DscBuildData.GenerateModuleValueStatement(module_guid,Pcd)\r
+            CApp = CApp + DscBuildData.GenerateFdfValueStatement(Pcd)\r
+            CApp = CApp + DscBuildData.GenerateCommandLineValueStatement(Pcd)\r
+\r
+            #\r
+            # Set new PCD value and size\r
+            #\r
+            CApp = CApp + '  PcdSetPtr (%s, %s, %s, %s, Size, (void *)Pcd);\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+\r
+            #\r
+            # Free PCD\r
+            #\r
+            CApp = CApp + '  free (Pcd);\n'\r
+            CApp = CApp + '}\n'\r
+            CApp = CApp + '\n'\r
+        return InitByteValue,CApp\r
+\r
     def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp):\r
         OverrideValues = {DefaultStore:{}}\r
         if Pcd.SkuOverrideValues:\r
@@ -2586,10 +2772,20 @@ class DscBuildData(PlatformBuildClassObject):
             CApp = CApp + self.GenerateArrayAssignment(Pcd)\r
         for PcdName in sorted(StructuredPcds.keys()):\r
             Pcd = StructuredPcds[PcdName]\r
+\r
+            #create void void Cal_tocken_cname_Size functions\r
             CApp = CApp + self.GenerateSizeFunction(Pcd)\r
+\r
+            #create void Assign_ functions\r
+\r
+            # From DEC\r
             CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd)\r
+            # From Fdf\r
             CApp = CApp + self.GenerateFdfValue(Pcd)\r
+            # From CommandLine\r
             CApp = CApp + self.GenerateCommandLineValue(Pcd)\r
+\r
+            # From Dsc Global setting\r
             if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
                 CApp = CApp + self.GenerateInitValueFunction(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT)\r
@@ -2599,9 +2795,15 @@ class DscBuildData(PlatformBuildClassObject):
                         continue\r
                     for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:\r
                         CApp = CApp + self.GenerateInitValueFunction(Pcd, SkuName, DefaultStoreName)\r
+\r
+            # From Dsc module scope setting\r
+            CApp = CApp + self.GenerateModuleScopeValue(Pcd)\r
+\r
+            #create Initialize_ functions\r
             if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
                 InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd, InitByteValue, CApp)\r
+                InitByteValue, CApp =  self.GenerateModuleScopeInitializeFunc(self.SkuIdMgr.SystemSkuId,Pcd,InitByteValue,CApp)\r
             else:\r
                 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
                     if SkuName not in Pcd.SkuOverrideValues:\r
@@ -2618,6 +2820,8 @@ class DscBuildData(PlatformBuildClassObject):
         for Pcd in StructuredPcds.values():\r
             if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
                 CApp = CApp + '  Initialize_%s_%s_%s_%s();\n' % (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+                for ModuleGuid in Pcd.PcdFiledValueFromDscComponent:\r
+                    CApp += "  Initialize_%s_%s_%s_%s();\n" % (ModuleGuid,TAB_DEFAULT_STORES_DEFAULT ,Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
             else:\r
                 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
                     if SkuName not in self.SkuIdMgr.AvailableSkuIdSet:\r
@@ -2633,6 +2837,7 @@ class DscBuildData(PlatformBuildClassObject):
         CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName)\r
         SaveFileOnChange(CAppBaseFileName + '.c', CApp, False)\r
 \r
+        # start generating makefile\r
         MakeApp = PcdMakefileHeader\r
         if sys.platform == "win32":\r
             MakeApp = MakeApp + 'APPFILE = %s\%s.exe\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj %s.obj\n' % (self.OutputPath, PcdValueInitName, os.path.join(self.OutputPath, PcdValueCommonName)) + 'INC = '\r
@@ -2755,6 +2960,7 @@ class DscBuildData(PlatformBuildClassObject):
         MakeApp += "$(OBJECTS) : %s\n" % MakeFileName\r
         SaveFileOnChange(MakeFileName, MakeApp, False)\r
 \r
+        # start generating input file\r
         InputValueFile = os.path.join(self.OutputPath, 'Input.txt')\r
         OutputValueFile = os.path.join(self.OutputPath, 'Output.txt')\r
         SaveFileOnChange(InputValueFile, InitByteValue, False)\r
@@ -2764,6 +2970,8 @@ class DscBuildData(PlatformBuildClassObject):
             Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName)\r
         else:\r
             Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName) +".exe"\r
+\r
+        #start building the structure pcd value tool\r
         Messages = ''\r
         if sys.platform == "win32":\r
             MakeCommand = 'nmake -f %s' % (MakeFileName)\r
@@ -2826,6 +3034,7 @@ class DscBuildData(PlatformBuildClassObject):
             else:\r
                 EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s\n%s\n%s' % (MakeCommand, StdOut, StdErr))\r
 \r
+        #start executing the structure pcd value tool\r
         if DscBuildData.NeedUpdateOutput(OutputValueFile, Dest_PcdValueInitExe, InputValueFile):\r
             Command = Dest_PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile)\r
             returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (Command)\r
@@ -2833,6 +3042,7 @@ class DscBuildData(PlatformBuildClassObject):
             if returncode != 0:\r
                 EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not collect output from command: %s\n%s\n' % (Command, StdOut, StdErr))\r
 \r
+        #start update structure pcd final value\r
         File = open (OutputValueFile, 'r')\r
         FileBuffer = File.readlines()\r
         File.close()\r
index 8efa869162d4d12d47a7ed951a56802b61e01a51..a95bb36811a98529d8002bfca745f9e8bf9f8c4a 100644 (file)
@@ -696,7 +696,7 @@ class ModuleReport(object):
         FileWrite(File, gSectionSep)\r
 \r
         if "PCD" in ReportType:\r
-            GlobalPcdReport.GenerateReport(File, self.ModulePcdSet)\r
+            GlobalPcdReport.GenerateReport(File, self.ModulePcdSet,self.FileGuid)\r
 \r
         if "LIBRARY" in ReportType:\r
             self.LibraryReport.GenerateReport(File)\r
@@ -881,7 +881,7 @@ class PcdReport(object):
                 if DscDefaultValue:\r
                     self.DscPcdDefault[(TokenCName, TokenSpaceGuidCName)] = DscDefaultValue\r
 \r
-    def GenerateReport(self, File, ModulePcdSet):\r
+    def GenerateReport(self, File, ModulePcdSet,ModuleGuid=None):\r
         if not ModulePcdSet:\r
             if self.ConditionalPcds:\r
                 self.GenerateReportDetail(File, ModulePcdSet, 1)\r
@@ -897,7 +897,7 @@ class PcdReport(object):
                         break\r
                 if not IsEmpty:\r
                     self.GenerateReportDetail(File, ModulePcdSet, 2)\r
-        self.GenerateReportDetail(File, ModulePcdSet)\r
+        self.GenerateReportDetail(File, ModulePcdSet,ModuleGuid = ModuleGuid)\r
 \r
     ##\r
     # Generate report for PCD information\r
@@ -913,7 +913,7 @@ class PcdReport(object):
     #                        directives section report, 2 means Unused Pcds section report\r
     # @param DscOverridePcds Module DSC override PCDs set\r
     #\r
-    def GenerateReportDetail(self, File, ModulePcdSet, ReportSubType = 0):\r
+    def GenerateReportDetail(self, File, ModulePcdSet, ReportSubType = 0,ModuleGuid=None):\r
         PcdDict = self.AllPcds\r
         if ReportSubType == 1:\r
             PcdDict = self.ConditionalPcds\r
@@ -993,10 +993,12 @@ class PcdReport(object):
                 #The DefaultValue of StructurePcd already be the latest, no need to update.\r
                 if not self.IsStructurePcd(Pcd.TokenCName, Pcd.TokenSpaceGuidCName):\r
                     Pcd.DefaultValue = PcdValue\r
+                PcdComponentValue = None\r
                 if ModulePcdSet is not None:\r
                     if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type) not in ModulePcdSet:\r
                         continue\r
-                    InfDefaultValue, PcdValue = ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type]\r
+                    InfDefaultValue, PcdComponentValue = ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type]\r
+                    PcdValue = PcdComponentValue\r
                     #The DefaultValue of StructurePcd already be the latest, no need to update.\r
                     if not self.IsStructurePcd(Pcd.TokenCName, Pcd.TokenSpaceGuidCName):\r
                         Pcd.DefaultValue = PcdValue\r
@@ -1081,6 +1083,11 @@ class PcdReport(object):
                     if TypeName in ('DYNVPD', 'DEXVPD'):\r
                         SkuInfoList = Pcd.SkuInfoList\r
                     Pcd = GlobalData.gStructurePcd[self.Arch][(Pcd.TokenCName, Pcd.TokenSpaceGuidCName)]\r
+                    if ModulePcdSet and ModulePcdSet.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type)):\r
+                        InfDefaultValue, PcdComponentValue = ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type]\r
+                        DscDefaultValBak = Pcd.DefaultValue\r
+                        Pcd.DefaultValue = PcdComponentValue\r
+\r
                     Pcd.DatumType = Pcd.StructName\r
                     if TypeName in ('DYNVPD', 'DEXVPD'):\r
                         Pcd.SkuInfoList = SkuInfoList\r
@@ -1091,48 +1098,53 @@ class PcdReport(object):
                         DscDefaultValue = True\r
                         DscMatch = True\r
                         DecMatch = False\r
-                    elif Pcd.SkuOverrideValues:\r
-                        DscOverride = False\r
-                        if Pcd.DefaultFromDSC:\r
-                            DscOverride = True\r
-                        else:\r
-                            DictLen = 0\r
-                            for item in Pcd.SkuOverrideValues:\r
-                                DictLen += len(Pcd.SkuOverrideValues[item])\r
-                            if not DictLen:\r
-                                DscOverride = False\r
+                    else:\r
+                        if Pcd.Type in PCD_DYNAMIC_TYPE_SET | PCD_DYNAMIC_EX_TYPE_SET:\r
+                            DscOverride = False\r
+                            if Pcd.DefaultFromDSC:\r
+                                DscOverride = True\r
                             else:\r
-                                if not Pcd.SkuInfoList:\r
-                                    OverrideValues = Pcd.SkuOverrideValues\r
-                                    if OverrideValues:\r
-                                        for Data in OverrideValues.values():\r
-                                            Struct = list(Data.values())\r
-                                            if Struct:\r
-                                                DscOverride = self.ParseStruct(Struct[0])\r
-                                                break\r
+                                DictLen = 0\r
+                                for item in Pcd.SkuOverrideValues:\r
+                                    DictLen += len(Pcd.SkuOverrideValues[item])\r
+                                if not DictLen:\r
+                                    DscOverride = False\r
                                 else:\r
-                                    SkuList = sorted(Pcd.SkuInfoList.keys())\r
-                                    for Sku in SkuList:\r
-                                        SkuInfo = Pcd.SkuInfoList[Sku]\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
+                                    if not Pcd.SkuInfoList:\r
+                                        OverrideValues = Pcd.SkuOverrideValues\r
+                                        if OverrideValues:\r
+                                            for Data in OverrideValues.values():\r
+                                                Struct = list(Data.values())\r
+                                                if Struct:\r
+                                                    DscOverride = self.ParseStruct(Struct[0])\r
                                                     break\r
-                                        if DscOverride:\r
-                                            break\r
-                        if DscOverride:\r
-                            DscDefaultValue = True\r
-                            DscMatch = True\r
-                            DecMatch = False\r
+                                    else:\r
+                                        SkuList = sorted(Pcd.SkuInfoList.keys())\r
+                                        for Sku in SkuList:\r
+                                            SkuInfo = Pcd.SkuInfoList[Sku]\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
+                                            if DscOverride:\r
+                                                break\r
+                            if DscOverride:\r
+                                DscDefaultValue = True\r
+                                DscMatch = True\r
+                                DecMatch = False\r
+                            else:\r
+                                DecMatch = True\r
                         else:\r
-                            DecMatch = True\r
-                    else:\r
-                        DscDefaultValue = True\r
-                        DscMatch = True\r
-                        DecMatch = False\r
+                            if Pcd.DscRawValue or (ModuleGuid and ModuleGuid.replace("-","S") in Pcd.PcdValueFromComponents):\r
+                                DscDefaultValue = True\r
+                                DscMatch = True\r
+                                DecMatch = False\r
+                            else:\r
+                                DscDefaultValue = False\r
+                                DecMatch = True\r
 \r
                 #\r
                 # Report PCD item according to their override relationship\r
@@ -1153,13 +1165,14 @@ class PcdReport(object):
                 elif BuildOptionMatch:\r
                     self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*B')\r
                 else:\r
-                    if DscDefaultValue and DscMatch:\r
+                    if PcdComponentValue:\r
+                        self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, PcdComponentValue, DecMatch, DecDefaultValue, '*M', ModuleGuid)\r
+                    elif DscDefaultValue and DscMatch:\r
                         if (Pcd.TokenCName, Key, Field) in self.FdfPcdSet:\r
                             self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*F')\r
                         else:\r
                             self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*P')\r
-                    else:\r
-                        self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*M')\r
+\r
 \r
                 if ModulePcdSet is None:\r
                     if IsStructure:\r
@@ -1265,7 +1278,7 @@ class PcdReport(object):
             for filedvalues in Pcd.DefaultValues.values():\r
                 self.PrintStructureInfo(File, filedvalues)\r
 \r
-    def PrintPcdValue(self, File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, Flag = '  '):\r
+    def PrintPcdValue(self, File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, Flag = '  ',ModuleGuid=None):\r
         if not Pcd.SkuInfoList:\r
             Value = Pcd.DefaultValue\r
             IsByteArray, ArrayList = ByteArrayForamt(Value)\r
@@ -1288,14 +1301,20 @@ class PcdReport(object):
                     OverrideValues = GlobalData.gPcdSkuOverrides[(Pcd.TokenCName,Pcd.TokenSpaceGuidCName)]\r
                 else:\r
                     OverrideValues = Pcd.SkuOverrideValues\r
+                FieldOverrideValues = None\r
                 if OverrideValues:\r
                     for Data in OverrideValues.values():\r
                         Struct = list(Data.values())\r
                         if Struct:\r
-                            OverrideFieldStruct = self.OverrideFieldValue(Pcd, Struct[0])\r
-                            self.PrintStructureInfo(File, OverrideFieldStruct)\r
+                            FieldOverrideValues = Struct[0]\r
                             FiledOverrideFlag = True\r
                             break\r
+                if Pcd.PcdFiledValueFromDscComponent and ModuleGuid and ModuleGuid.replace("-","S") in Pcd.PcdFiledValueFromDscComponent:\r
+                    FieldOverrideValues = Pcd.PcdFiledValueFromDscComponent[ModuleGuid.replace("-","S")]\r
+                if FieldOverrideValues:\r
+                    OverrideFieldStruct = self.OverrideFieldValue(Pcd, FieldOverrideValues)\r
+                    self.PrintStructureInfo(File, OverrideFieldStruct)\r
+\r
                 if not FiledOverrideFlag and (Pcd.PcdFieldValueFromComm or Pcd.PcdFieldValueFromFdf):\r
                     OverrideFieldStruct = self.OverrideFieldValue(Pcd, {})\r
                     self.PrintStructureInfo(File, OverrideFieldStruct)\r