+ 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