This patch is going to fix the issue that
The Pcd field value is override incorrectly when there
is no Pcd overall value assignment in Dsc file.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Bob Feng <bob.c.f...@intel.com>
Cc: Liming Gao <liming....@intel.com>
---
 BaseTools/Source/Python/AutoGen/AutoGen.py         |  1 +
 .../Source/Python/Workspace/BuildClassObject.py    |  2 +-
 BaseTools/Source/Python/Workspace/DscBuildData.py  | 54 ++++++++++++----------
 3 files changed, 31 insertions(+), 26 deletions(-)

diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py 
b/BaseTools/Source/Python/AutoGen/AutoGen.py
index 95370d1821..ac3cf7eef3 100644
--- a/BaseTools/Source/Python/AutoGen/AutoGen.py
+++ b/BaseTools/Source/Python/AutoGen/AutoGen.py
@@ -1653,10 +1653,11 @@ class PlatformAutoGen(AutoGen):
                 for (SkuName, SkuId) in allskuset:
                     if type(SkuId) in (str, unicode) and eval(SkuId) == 0 or 
SkuId == 0:
                         continue
                     pcd.SkuInfoList[SkuName] = 
copy.deepcopy(pcd.SkuInfoList[TAB_DEFAULT])
                     pcd.SkuInfoList[SkuName].SkuId = SkuId
+                    pcd.SkuInfoList[SkuName].SkuIdName = SkuName
         self.AllPcdList = self._NonDynamicPcdList + self._DynamicPcdList
 
     def FixVpdOffset(self, VpdFile ):
         FvPath = os.path.join(self.BuildDir, TAB_FV_DIRECTORY)
         if not os.path.exists(FvPath):
diff --git a/BaseTools/Source/Python/Workspace/BuildClassObject.py 
b/BaseTools/Source/Python/Workspace/BuildClassObject.py
index b2e5309a90..b0f3cde81a 100644
--- a/BaseTools/Source/Python/Workspace/BuildClassObject.py
+++ b/BaseTools/Source/Python/Workspace/BuildClassObject.py
@@ -59,11 +59,11 @@ class PcdClassObject(object):
         self.IsFromDsc = False
         self.validateranges = validateranges
         self.validlists = validlists
         self.expressions = expressions
         self.DscDefaultValue = None
-        self.DscRawValue = None
+        self.DscRawValue = {}
         if IsDsc:
             self.DscDefaultValue = Value
         self.PcdValueFromComm = ""
         self.PcdValueFromFdf = ""
         self.DefinitionPosition = ("","")
diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py 
b/BaseTools/Source/Python/Workspace/DscBuildData.py
index 7d6536c4b6..f2fff4d9fd 100644
--- a/BaseTools/Source/Python/Workspace/DscBuildData.py
+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py
@@ -1403,11 +1403,11 @@ class DscBuildData(PlatformBuildClassObject):
                     while nextskuid not in stru_pcd.SkuOverrideValues:
                         if nextskuid == TAB_DEFAULT:
                             NoDefault = True
                             break
                         nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)
-                    stru_pcd.SkuOverrideValues[skuid] = 
copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid]) if not NoDefault else 
copy.deepcopy({defaultstorename: stru_pcd.DefaultValues for defaultstorename in 
DefaultStores} if DefaultStores else 
{TAB_DEFAULT_STORES_DEFAULT:stru_pcd.DefaultValues})
+                    stru_pcd.SkuOverrideValues[skuid] = 
copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid]) if not NoDefault else 
copy.deepcopy({defaultstorename: stru_pcd.DefaultValues for defaultstorename in 
DefaultStores} if DefaultStores else {}) 
#{TAB_DEFAULT_STORES_DEFAULT:stru_pcd.DefaultValues})
                     if not NoDefault:
                         stru_pcd.ValueChain.add((skuid, ''))
             if stru_pcd.Type in 
[self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], 
self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:
                 for skuid in SkuIds:
                     nextskuid = skuid
@@ -1556,11 +1556,13 @@ class DscBuildData(PlatformBuildClassObject):
                                                 {},
                                                 False,
                                                 None,
                                                 IsDsc=True)
 
-
+            if self.SkuIdMgr.SystemSkuId not in Pcds[PcdCName, 
TokenSpaceGuid].DscRawValue:
+                Pcds[PcdCName, 
TokenSpaceGuid].DscRawValue[self.SkuIdMgr.SystemSkuId] = {}
+            Pcds[PcdCName, 
TokenSpaceGuid].DscRawValue[self.SkuIdMgr.SystemSkuId][TAB_DEFAULT_STORES_DEFAULT]
 = PcdValue
         return Pcds
 
     def GetStructurePcdMaxSize(self, str_pcd):
         pcd_default_value = str_pcd.DefaultValue
         sku_values = [skuobj.HiiDefaultValue if str_pcd.Type in 
[self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], 
self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]] else skuobj.DefaultValue for 
skuobj in str_pcd.SkuInfoList.values()]
@@ -1788,15 +1790,12 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = CApp + '  CHAR8   *Value;\n'
 
         CApp = CApp + "// SkuName: %s,  DefaultStoreName: %s \n" % 
(TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT)
         inherit_OverrideValues = Pcd.SkuOverrideValues[SkuName]
         if (SkuName, DefaultStoreName) == (TAB_DEFAULT, 
TAB_DEFAULT_STORES_DEFAULT):
-            pcddefaultvalue = Pcd.DefaultFromDSC.get(TAB_DEFAULT, 
{}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC 
else Pcd.DefaultValue
+            pcddefaultvalue = Pcd.DefaultFromDSC.get(TAB_DEFAULT, 
{}).get(TAB_DEFAULT_STORES_DEFAULT) if Pcd.DefaultFromDSC else None
         else:
-            if not Pcd.DscRawValue:
-                # handle the case that structure pcd is not appear in DSC
-                self.CopyDscRawValue(Pcd)
             pcddefaultvalue = Pcd.DscRawValue.get(SkuName, 
{}).get(DefaultStoreName)
         for FieldList in [pcddefaultvalue, 
inherit_OverrideValues.get(DefaultStoreName)]:
             if not FieldList:
                 continue
             if pcddefaultvalue and FieldList == pcddefaultvalue:
@@ -1994,10 +1993,12 @@ class DscBuildData(PlatformBuildClassObject):
 
     def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, 
InitByteValue, CApp):
         OverrideValues = {DefaultStore:""}
         if Pcd.SkuOverrideValues:
             OverrideValues = Pcd.SkuOverrideValues[SkuName]
+        if not OverrideValues:
+            OverrideValues = {TAB_DEFAULT_STORES_DEFAULT:Pcd.DefaultValues}
         for DefaultStoreName in OverrideValues:
             CApp = CApp + 'void\n'
             CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (SkuName, 
DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
             CApp = CApp + '  void\n'
             CApp = CApp + '  )\n'
@@ -2075,10 +2076,17 @@ class DscBuildData(PlatformBuildClassObject):
             #
             CApp = CApp + '  free (Pcd);\n'
             CApp = CApp + '}\n'
             CApp = CApp + '\n'
         return InitByteValue, CApp
+    def SkuOverrideValuesEmpty(self,OverrideValues):
+        if not OverrideValues:
+            return True
+        for key in OverrideValues:
+            if OverrideValues[key]:
+                return False
+        return True
 
     def GenerateByteArrayValue (self, StructuredPcds):
         #
         # Generate/Compile/Run C application to determine if there are any 
flexible array members
         #
@@ -2100,20 +2108,20 @@ class DscBuildData(PlatformBuildClassObject):
             Pcd = StructuredPcds[PcdName]
             CApp = CApp + self.GenerateSizeFunction(Pcd)
             CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd)
             CApp = CApp + self.GenerateFdfValue(Pcd)
             CApp = CApp + self.GenerateCommandLineValue(Pcd)
-            if not Pcd.SkuOverrideValues or Pcd.Type in 
[self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],
+            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]]:
                 CApp = CApp + self.GenerateInitValueFunction(Pcd, 
self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT)
             else:
                 for SkuName in self.SkuIdMgr.SkuOverrideOrder():
                     if SkuName not in Pcd.SkuOverrideValues:
                         continue
                     for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:
                         CApp = CApp + self.GenerateInitValueFunction(Pcd, 
SkuName, DefaultStoreName)
-            if not Pcd.SkuOverrideValues or Pcd.Type in 
[self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],
+            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]]:
                 InitByteValue, CApp = 
self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, 
TAB_DEFAULT_STORES_DEFAULT, Pcd, InitByteValue, CApp)
             else:
                 for SkuName in self.SkuIdMgr.SkuOverrideOrder():
                     if SkuName not in Pcd.SkuOverrideValues:
@@ -2126,11 +2134,11 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = CApp + 'PcdEntryPoint(\n'
         CApp = CApp + '  VOID\n'
         CApp = CApp + '  )\n'
         CApp = CApp + '{\n'
         for Pcd in StructuredPcds.values():
-            if not Pcd.SkuOverrideValues or Pcd.Type in 
[self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], 
self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:
+            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]]:
                 CApp = CApp + '  Initialize_%s_%s_%s_%s();\n' % 
(self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, 
Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
             else:
                 for SkuName in self.SkuIdMgr.SkuOverrideOrder():
                     if SkuName not in Pcd.SkuOverrideValues:
                         continue
@@ -2407,10 +2415,14 @@ class DscBuildData(PlatformBuildClassObject):
                                                     {SkuName : SkuInfo},
                                                     False,
                                                     None,
                                                     IsDsc=True)
 
+            if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:
+                Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}
+            Pcds[PcdCName, 
TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = PcdValue
+
         for pcd in Pcds.values():
             pcdDecObject = self._DecPcds[pcd.TokenCName, 
pcd.TokenSpaceGuidCName]
             # Only fix the value while no value provided in DSC file.
             for sku in pcd.SkuInfoList.values():
                 if not sku.DefaultValue:
@@ -2454,32 +2466,18 @@ class DscBuildData(PlatformBuildClassObject):
         if Attr2Set == Attr1Set:
             return True
         else:
             return False
 
-    def CopyDscRawValue(self, Pcd):
-        if Pcd.DscRawValue is None:
-            Pcd.DscRawValue = dict()
-        if Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], 
self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:
-            if self.SkuIdMgr.SystemSkuId not in Pcd.DscRawValue:
-                Pcd.DscRawValue[self.SkuIdMgr.SystemSkuId] = {}
-            
Pcd.DscRawValue[self.SkuIdMgr.SystemSkuId][TAB_DEFAULT_STORES_DEFAULT] = 
Pcd.DefaultValue
-        for skuname in Pcd.SkuInfoList:
-            Pcd.DscRawValue[skuname] = {}
-            if Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], 
self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:
-                for defaultstore in Pcd.SkuInfoList[skuname].DefaultStoreDict:
-                    Pcd.DscRawValue[skuname][defaultstore] = 
Pcd.SkuInfoList[skuname].DefaultStoreDict[defaultstore]
-            else:
-                Pcd.DscRawValue[skuname][TAB_DEFAULT_STORES_DEFAULT] = 
Pcd.SkuInfoList[skuname].DefaultValue
     def CompletePcdValues(self, PcdSet):
         Pcds = {}
         DefaultStoreObj = DefaultStore(self._GetDefaultStores())
         SkuIds = {skuname:skuid for skuname, skuid in 
self.SkuIdMgr.AvailableSkuIdSet.items() if skuname != TAB_COMMON}
         DefaultStores = set(storename for pcdobj in PcdSet.values() for skuobj 
in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict)
         for PcdCName, TokenSpaceGuid in PcdSet:
             PcdObj = PcdSet[(PcdCName, TokenSpaceGuid)]
-            self.CopyDscRawValue(PcdObj)
+
             if PcdObj.Type not in 
[self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],
                         self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],
                         self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD],
                         self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_DEFAULT],
                         self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII],
@@ -2611,11 +2609,13 @@ class DscBuildData(PlatformBuildClassObject):
                                                 pcdDecObject.validateranges,
                                                 pcdDecObject.validlists,
                                                 pcdDecObject.expressions,
                                                 IsDsc=True)
 
-
+            if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:
+                Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}
+            Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][DefaultStore] 
= DefaultValue
         for pcd in Pcds.values():
             SkuInfoObj = pcd.SkuInfoList.values()[0]
             pcdDecObject = self._DecPcds[pcd.TokenCName, 
pcd.TokenSpaceGuidCName]
             pcd.DatumType = pcdDecObject.DatumType
             # Only fix the value while no value provided in DSC file.
@@ -2746,10 +2746,14 @@ class DscBuildData(PlatformBuildClassObject):
                                                 MaxDatumSize,
                                                 {SkuName : SkuInfo},
                                                 False,
                                                 None,
                                                 IsDsc=True)
+
+            if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:
+                Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}
+            Pcds[PcdCName, 
TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = InitialValue
         for pcd in Pcds.values():
             SkuInfoObj = pcd.SkuInfoList.values()[0]
             pcdDecObject = self._DecPcds[pcd.TokenCName, 
pcd.TokenSpaceGuidCName]
             pcd.DatumType = pcdDecObject.DatumType
             # Only fix the value while no value provided in DSC file.
-- 
2.16.2.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to