+ ## Create AsBuilt INF file the module\r
+ #\r
+ def CreateAsBuiltInf(self):\r
+ if self.IsAsBuiltInfCreated:\r
+ return\r
+ \r
+ # Skip the following code for EDK I inf\r
+ if self.AutoGenVersion < 0x00010005:\r
+ return\r
+ \r
+ # Skip the following code for libraries\r
+ if self.IsLibrary:\r
+ return\r
+ \r
+ # Skip the following code for modules with no source files\r
+ if self.SourceFileList == None or self.SourceFileList == []:\r
+ return\r
+\r
+ # Skip the following code for modules without any binary files\r
+ if self.BinaryFileList <> None and self.BinaryFileList <> []:\r
+ return\r
+ \r
+ ### TODO: How to handles mixed source and binary modules\r
+\r
+ # Find all DynamicEx and PatchableInModule PCDs used by this module and dependent libraries\r
+ # Also find all packages that the DynamicEx PCDs depend on\r
+ Pcds = []\r
+ PatchablePcds = {}\r
+ Packages = [] \r
+ PcdCheckList = []\r
+ PcdTokenSpaceList = []\r
+ for Pcd in self.ModulePcdList + self.LibraryPcdList:\r
+ if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
+ PatchablePcds[Pcd.TokenCName] = Pcd\r
+ PcdCheckList.append((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, 'PatchableInModule'))\r
+ elif Pcd.Type in GenC.gDynamicExPcd:\r
+ if Pcd not in Pcds:\r
+ Pcds += [Pcd]\r
+ PcdCheckList.append((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, 'DynamicEx'))\r
+ PcdCheckList.append((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, 'Dynamic'))\r
+ PcdTokenSpaceList.append(Pcd.TokenSpaceGuidCName)\r
+ GuidList = sdict()\r
+ GuidList.update(self.GuidList)\r
+ for TokenSpace in self.GetGuidsUsedByPcd():\r
+ # If token space is not referred by patch PCD or Ex PCD, remove the GUID from GUID list\r
+ # The GUIDs in GUIDs section should really be the GUIDs in source INF or referred by Ex an patch PCDs\r
+ if TokenSpace not in PcdTokenSpaceList and TokenSpace in GuidList:\r
+ GuidList.pop(TokenSpace)\r
+ CheckList = (GuidList, self.PpiList, self.ProtocolList, PcdCheckList)\r
+ for Package in self.DerivedPackageList:\r
+ if Package in Packages:\r
+ continue\r
+ BeChecked = (Package.Guids, Package.Ppis, Package.Protocols, Package.Pcds)\r
+ Found = False\r
+ for Index in range(len(BeChecked)):\r
+ for Item in CheckList[Index]:\r
+ if Item in BeChecked[Index]:\r
+ Packages += [Package]\r
+ Found = True\r
+ break\r
+ if Found: break\r
+\r
+ ModuleType = self.ModuleType\r
+ if ModuleType == 'UEFI_DRIVER' and self.DepexGenerated:\r
+ ModuleType = 'DXE_DRIVER'\r
+\r
+ DriverType = ''\r
+ if self.PcdIsDriver != '':\r
+ DriverType = self.PcdIsDriver\r
+\r
+ AsBuiltInfDict = {\r
+ 'module_name' : self.Name,\r
+ 'module_guid' : self.Guid,\r
+ 'module_module_type' : ModuleType,\r
+ 'module_version_string' : self.Version,\r
+ 'pcd_is_driver_string' : [],\r
+ 'module_uefi_specification_version' : [],\r
+ 'module_pi_specification_version' : [],\r
+ 'module_arch' : self.Arch,\r
+ 'package_item' : ['%s' % (Package.MetaFile.File.replace('\\','/')) for Package in Packages],\r
+ 'binary_item' : [],\r
+ 'patchablepcd_item' : [],\r
+ 'pcd_item' : [],\r
+ 'protocol_item' : [],\r
+ 'ppi_item' : [],\r
+ 'guid_item' : [],\r
+ 'flags_item' : [],\r
+ 'libraryclasses_item' : []\r
+ }\r
+ AsBuiltInfDict['module_inf_version'] = '0x%08x' % self.AutoGenVersion\r
+ if DriverType:\r
+ AsBuiltInfDict['pcd_is_driver_string'] += [DriverType]\r
+\r
+ if 'UEFI_SPECIFICATION_VERSION' in self.Specification:\r
+ AsBuiltInfDict['module_uefi_specification_version'] += [self.Specification['UEFI_SPECIFICATION_VERSION']]\r
+ if 'PI_SPECIFICATION_VERSION' in self.Specification:\r
+ AsBuiltInfDict['module_pi_specification_version'] += [self.Specification['PI_SPECIFICATION_VERSION']]\r
+\r
+ OutputDir = self.OutputDir.replace('\\','/').strip('/')\r
+ if self.ModuleType in ['BASE', 'USER_DEFINED']:\r
+ for Item in self.CodaTargetList:\r
+ File = Item.Target.Path.replace('\\','/').strip('/').replace(OutputDir,'').strip('/')\r
+ if Item.Target.Ext.lower() == '.aml': \r
+ AsBuiltInfDict['binary_item'] += ['ASL|' + File]\r
+ elif Item.Target.Ext.lower() == '.acpi': \r
+ AsBuiltInfDict['binary_item'] += ['ACPI|' + File]\r
+ else:\r
+ AsBuiltInfDict['binary_item'] += ['BIN|' + File]\r
+ else:\r
+ for Item in self.CodaTargetList:\r
+ File = Item.Target.Path.replace('\\','/').strip('/').replace(OutputDir,'').strip('/')\r
+ if Item.Target.Ext.lower() == '.efi': \r
+ AsBuiltInfDict['binary_item'] += ['PE32|' + self.Name + '.efi']\r
+ else:\r
+ AsBuiltInfDict['binary_item'] += ['BIN|' + File]\r
+ if self.DepexGenerated:\r
+ if self.ModuleType in ['PEIM']:\r
+ AsBuiltInfDict['binary_item'] += ['PEI_DEPEX|' + self.Name + '.depex']\r
+ if self.ModuleType in ['DXE_DRIVER','DXE_RUNTIME_DRIVER','DXE_SAL_DRIVER','UEFI_DRIVER']:\r
+ AsBuiltInfDict['binary_item'] += ['DXE_DEPEX|' + self.Name + '.depex']\r
+ if self.ModuleType in ['DXE_SMM_DRIVER']:\r
+ AsBuiltInfDict['binary_item'] += ['SMM_DEPEX|' + self.Name + '.depex']\r
+\r
+ for Root, Dirs, Files in os.walk(OutputDir):\r
+ for File in Files:\r
+ if File.lower().endswith('.pdb'):\r
+ AsBuiltInfDict['binary_item'] += ['DISPOSABLE|' + File]\r
+ HeaderComments = self.Module.HeaderComments\r
+ StartPos = 0\r
+ for Index in range(len(HeaderComments)):\r
+ if HeaderComments[Index].find('@BinaryHeader') != -1:\r
+ HeaderComments[Index] = HeaderComments[Index].replace('@BinaryHeader', '@file')\r
+ StartPos = Index\r
+ break\r
+ AsBuiltInfDict['header_comments'] = '\n'.join(HeaderComments[StartPos:]).replace(':#', '://')\r
+ GenList = [\r
+ (self.ProtocolList, self._ProtocolComments, 'protocol_item'),\r
+ (self.PpiList, self._PpiComments, 'ppi_item'),\r
+ (GuidList, self._GuidComments, 'guid_item')\r
+ ]\r
+ for Item in GenList:\r
+ for CName in Item[0]:\r
+ Comments = ''\r
+ if CName in Item[1]:\r
+ Comments = '\n '.join(Item[1][CName])\r
+ Entry = CName\r
+ if Comments:\r
+ Entry = Comments + '\n ' + CName\r
+ AsBuiltInfDict[Item[2]].append(Entry)\r
+ PatchList = parsePcdInfoFromMapFile(\r
+ os.path.join(self.OutputDir, self.Name + '.map'),\r
+ os.path.join(self.OutputDir, self.Name + '.efi')\r
+ )\r
+ if PatchList:\r
+ for PatchPcd in PatchList:\r
+ if PatchPcd[0] not in PatchablePcds:\r
+ continue\r
+ Pcd = PatchablePcds[PatchPcd[0]]\r
+ PcdValue = ''\r
+ if Pcd.DatumType != 'VOID*':\r
+ HexFormat = '0x%02x'\r
+ if Pcd.DatumType == 'UINT16':\r
+ HexFormat = '0x%04x'\r
+ elif Pcd.DatumType == 'UINT32':\r
+ HexFormat = '0x%08x'\r
+ elif Pcd.DatumType == 'UINT64':\r
+ HexFormat = '0x%016x'\r
+ PcdValue = HexFormat % int(Pcd.DefaultValue, 0)\r
+ else:\r
+ if Pcd.MaxDatumSize == None or Pcd.MaxDatumSize == '':\r
+ EdkLogger.error("build", AUTOGEN_ERROR,\r
+ "Unknown [MaxDatumSize] of PCD [%s.%s]" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+ )\r
+ ArraySize = int(Pcd.MaxDatumSize, 0)\r
+ PcdValue = Pcd.DefaultValue\r
+ if PcdValue[0] != '{':\r
+ Unicode = False\r
+ if PcdValue[0] == 'L':\r
+ Unicode = True\r
+ PcdValue = PcdValue.lstrip('L')\r
+ PcdValue = eval(PcdValue)\r
+ NewValue = '{'\r
+ for Index in range(0, len(PcdValue)):\r
+ if Unicode:\r
+ CharVal = ord(PcdValue[Index])\r
+ NewValue = NewValue + '0x%02x' % (CharVal & 0x00FF) + ', ' \\r
+ + '0x%02x' % (CharVal >> 8) + ', '\r
+ else:\r
+ NewValue = NewValue + '0x%02x' % (ord(PcdValue[Index]) % 0x100) + ', '\r
+ Padding = '0x00, '\r
+ if Unicode:\r
+ Padding = Padding * 2\r
+ ArraySize = ArraySize / 2\r
+ if ArraySize < (len(PcdValue) + 1):\r
+ EdkLogger.error("build", AUTOGEN_ERROR,\r
+ "The maximum size of VOID* type PCD '%s.%s' is less than its actual size occupied." % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+ )\r
+ if ArraySize > len(PcdValue) + 1:\r
+ NewValue = NewValue + Padding * (ArraySize - len(PcdValue) - 1)\r
+ PcdValue = NewValue + Padding.strip().rstrip(',') + '}'\r
+ elif len(PcdValue.split(',')) <= ArraySize:\r
+ PcdValue = PcdValue.rstrip('}') + ', 0x00' * (ArraySize - len(PcdValue.split(',')))\r
+ PcdValue += '}'\r
+ else:\r
+ EdkLogger.error("build", AUTOGEN_ERROR,\r
+ "The maximum size of VOID* type PCD '%s.%s' is less than its actual size occupied." % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+ )\r
+ PcdItem = '%s.%s|%s|0x%X' % \\r
+ (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, PcdValue, PatchPcd[1])\r
+ PcdComments = ''\r
+ if (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) in self._PcdComments:\r
+ PcdComments = '\n '.join(self._PcdComments[Pcd.TokenSpaceGuidCName, Pcd.TokenCName])\r
+ if PcdComments:\r
+ PcdItem = PcdComments + '\n ' + PcdItem\r
+ AsBuiltInfDict['patchablepcd_item'].append(PcdItem)\r
+ for Pcd in Pcds:\r
+ PcdComments = ''\r
+ PcdCommentList = []\r
+ HiiInfo = ''\r
+ if Pcd.Type == TAB_PCDS_DYNAMIC_EX_HII:\r
+ for SkuName in Pcd.SkuInfoList:\r
+ SkuInfo = Pcd.SkuInfoList[SkuName]\r
+ HiiInfo = '## %s|%s|%s' % (SkuInfo.VariableName, SkuInfo.VariableGuid, SkuInfo.VariableOffset)\r
+ break\r
+ if (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) in self._PcdComments:\r
+ PcdCommentList = self._PcdComments[Pcd.TokenSpaceGuidCName, Pcd.TokenCName][:]\r
+ if HiiInfo:\r
+ UsageIndex = -1\r
+ for Index, Comment in enumerate(PcdCommentList):\r
+ for Usage in UsageList:\r
+ if Comment.find(Usage) != -1:\r
+ UsageIndex = Index\r
+ break\r
+ if UsageIndex != -1:\r
+ PcdCommentList[UsageIndex] = PcdCommentList[UsageIndex] + ' ' + HiiInfo\r
+ else:\r
+ PcdCommentList.append('## ' + HiiInfo)\r
+ PcdComments = '\n '.join(PcdCommentList)\r
+ PcdEntry = Pcd.TokenSpaceGuidCName + '.' + Pcd.TokenCName\r
+ if PcdComments:\r
+ PcdEntry = PcdComments + '\n ' + PcdEntry\r
+ AsBuiltInfDict['pcd_item'] += [PcdEntry]\r
+ for Item in self.BuildOption:\r
+ if 'FLAGS' in self.BuildOption[Item]:\r
+ AsBuiltInfDict['flags_item'] += ['%s:%s_%s_%s_%s_FLAGS = %s' % (self.ToolChainFamily, self.BuildTarget, self.ToolChain, self.Arch, Item, self.BuildOption[Item]['FLAGS'].strip())]\r
+ \r
+ AsBuiltInf = TemplateString()\r
+ AsBuiltInf.Append(gAsBuiltInfHeaderString.Replace(AsBuiltInfDict))\r
+ \r
+ SaveFileOnChange(os.path.join(self.OutputDir, self.Name + '.inf'), str(AsBuiltInf), False)\r
+ \r
+ self.IsAsBuiltInfCreated = True\r
+ \r