+ self.PatchPcds = []\r
+ InfPcds = Inf.Pcds\r
+ Platform = GenFdsGlobalVariable.WorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, self.CurrentArch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]\r
+ FdfPcdDict = GenFdsGlobalVariable.FdfParser.Profile.PcdDict\r
+ DscModules = {}\r
+ for DscModule in Platform.Modules:\r
+ DscModules[str(DscModule).lower()] = Platform.Modules[DscModule]\r
+ for PcdKey in InfPcds:\r
+ Pcd = InfPcds[PcdKey]\r
+ if not hasattr(Pcd, 'Offset'):\r
+ continue\r
+ if Pcd.Type != 'PatchableInModule':\r
+ continue\r
+ PatchPcd = None\r
+ InfLowerPath = str(PathClassObj).lower()\r
+ if InfLowerPath in DscModules and PcdKey in DscModules[InfLowerPath].Pcds:\r
+ PatchPcd = DscModules[InfLowerPath].Pcds[PcdKey]\r
+ elif PcdKey in Platform.Pcds:\r
+ PatchPcd = Platform.Pcds[PcdKey]\r
+ DscOverride = False\r
+ if PatchPcd and Pcd.Type == PatchPcd.Type:\r
+ DefaultValue = PatchPcd.DefaultValue\r
+ DscOverride = True\r
+ FdfOverride = False\r
+ if PcdKey in FdfPcdDict:\r
+ DefaultValue = FdfPcdDict[PcdKey]\r
+ FdfOverride = True\r
+ if not DscOverride and not FdfOverride:\r
+ continue\r
+ if Pcd.DatumType == "VOID*":\r
+ if Pcd.DefaultValue == DefaultValue or DefaultValue in [None, '']:\r
+ continue\r
+ if DefaultValue[0] == 'L':\r
+ MaxDatumSize = str((len(DefaultValue) - 2) * 2)\r
+ elif DefaultValue[0] == '{':\r
+ MaxDatumSize = str(len(DefaultValue.split(',')))\r
+ else:\r
+ MaxDatumSize = str(len(DefaultValue) - 1)\r
+ if DscOverride:\r
+ Pcd.MaxDatumSize = PatchPcd.MaxDatumSize\r
+ if Pcd.MaxDatumSize in ['', None]:\r
+ Pcd.MaxDatumSize = str(len(Pcd.DefaultValue.split(',')))\r
+ else:\r
+ Base1 = Base2 = 10\r
+ if Pcd.DefaultValue.upper().startswith('0X'):\r
+ Base1 = 16\r
+ if DefaultValue.upper().startswith('0X'):\r
+ Base2 = 16\r
+ try:\r
+ PcdValueInImg = int(Pcd.DefaultValue, Base1)\r
+ PcdValueInDscOrFdf = int(DefaultValue, Base2)\r
+ if PcdValueInImg == PcdValueInDscOrFdf:\r
+ continue\r
+ except:\r
+ continue\r
+ if Pcd.DatumType == "VOID*":\r
+ if int(MaxDatumSize) > int(Pcd.MaxDatumSize):\r
+ EdkLogger.error("GenFds", GENFDS_ERROR, "The size of VOID* type PCD '%s.%s' exceeds its maximum size %d bytes." \\r
+ % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, int(MaxDatumSize) - int(Pcd.MaxDatumSize)))\r
+ else:\r
+ if PcdValueInDscOrFdf > FfsInfStatement._MAX_SIZE_TYPE[Pcd.DatumType] \\r
+ or PcdValueInImg > FfsInfStatement._MAX_SIZE_TYPE[Pcd.DatumType]:\r
+ EdkLogger.error("GenFds", GENFDS_ERROR, "The size of %s type PCD '%s.%s' doesn't match its data type." \\r
+ % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName))\r
+ Pcd.DefaultValue = DefaultValue\r
+ self.PatchPcds.append(Pcd)\r