# This module contains the functionality to generate build report after\r
# build all target completes successfully.\r
#\r
-# Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>\r
# This program and the accompanying materials\r
# are licensed and made available under the terms and conditions of the BSD License\r
# which accompanies this distribution. The full text of the license may be found at\r
from Common.DataType import TAB_BACK_SLASH\r
from Common.LongFilePathSupport import OpenLongFilePath as open\r
from Common.MultipleWorkspace import MultipleWorkspace as mws\r
+import Common.GlobalData as GlobalData\r
\r
## Pattern to extract contents in EDK DXS files\r
gDxsDependencyPattern = re.compile(r"DEPENDENCY_START(.+)DEPENDENCY_END", re.DOTALL)\r
gEndOfLine = "\r\n"\r
\r
## Tags for section start, end and separator\r
-gSectionStart = ">" + "=" * (gLineMaxLength-2) + "<"\r
-gSectionEnd = "<" + "=" * (gLineMaxLength-2) + ">" + "\n"\r
+gSectionStart = ">" + "=" * (gLineMaxLength - 2) + "<"\r
+gSectionEnd = "<" + "=" * (gLineMaxLength - 2) + ">" + "\n"\r
gSectionSep = "=" * gLineMaxLength\r
\r
## Tags for subsection start, end and separator\r
-gSubSectionStart = ">" + "-" * (gLineMaxLength-2) + "<"\r
-gSubSectionEnd = "<" + "-" * (gLineMaxLength-2) + ">"\r
+gSubSectionStart = ">" + "-" * (gLineMaxLength - 2) + "<"\r
+gSubSectionEnd = "<" + "-" * (gLineMaxLength - 2) + ">"\r
gSubSectionSep = "-" * gLineMaxLength\r
\r
\r
def __init__(self, Wa):\r
self._GuidDb = {}\r
for Pa in Wa.AutoGenObjectList:\r
- for Package in Pa.PackageList: \r
+ for Package in Pa.PackageList:\r
for Protocol in Package.Protocols:\r
GuidValue = GuidStructureStringToGuidString(Package.Protocols[Protocol])\r
self._GuidDb[GuidValue.upper()] = Protocol\r
GuidString = self._GuidDb.get(GuidValue, GuidValue)\r
Statement = "%s %s" % (Statement, GuidString)\r
DepexStatement.append(Statement)\r
- OpCode = DepexFile.read(1) \r
- \r
+ OpCode = DepexFile.read(1)\r
+\r
return DepexStatement\r
\r
##\r
#\r
def __init__(self, M):\r
self.Depex = ""\r
- self._DepexFileName = os.path.join(M.BuildDir, "OUTPUT", M.Module.BaseName + ".depex") \r
+ self._DepexFileName = os.path.join(M.BuildDir, "OUTPUT", M.Module.BaseName + ".depex")\r
ModuleType = M.ModuleType\r
if not ModuleType:\r
ModuleType = gComponentType2ModuleType.get(M.ComponentType, "")\r
# If a module complies to PI 1.1, promote Module type to "SMM_DRIVER"\r
#\r
if ModuleType == "DXE_SMM_DRIVER":\r
- PiSpec = M.Module.Specification.get("PI_SPECIFICATION_VERSION", "0x00010000")\r
+ PiSpec = M.Module.Specification.get("PI_SPECIFICATION_VERSION", "0x00010000")\r
if int(PiSpec, 0) >= 0x0001000A:\r
ModuleType = "SMM_DRIVER"\r
self.DriverType = gDriverTypeMap.get(ModuleType, "0x2 (FREE_FORM)")\r
#\r
FileWrite(File, gSectionStart)\r
FileWrite(File, "Platform Configuration Database Report")\r
+ FileWrite(File, " *B - PCD override in the build option")\r
FileWrite(File, " *P - Platform scoped PCD override in DSC file")\r
FileWrite(File, " *F - Platform scoped PCD override in FDF file")\r
FileWrite(File, " *M - Module scoped PCD override")\r
InfDefault, PcdValue = ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type]\r
if InfDefault == "":\r
InfDefault = None\r
+\r
+ BuildOptionMatch = False\r
+ if GlobalData.BuildOptionPcd:\r
+ for pcd in GlobalData.BuildOptionPcd:\r
+ if (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) == (pcd[0], pcd[1]):\r
+ PcdValue = pcd[2]\r
+ BuildOptionMatch = True\r
+ break\r
+\r
if First:\r
if ModulePcdSet == None:\r
FileWrite(File, "")\r
#\r
# Report PCD item according to their override relationship\r
#\r
- if DecMatch and InfMatch:\r
- FileWrite(File, ' %-*s: %6s %10s = %-22s' % (self.MaxLen, Pcd.TokenCName, TypeName, '('+Pcd.DatumType+')', PcdValue.strip()))\r
+ if BuildOptionMatch:\r
+ FileWrite(File, ' *B %-*s: %6s %10s = %-22s' % (self.MaxLen, Pcd.TokenCName, TypeName, '(' + Pcd.DatumType + ')', PcdValue.strip()))\r
+ elif DecMatch and InfMatch:\r
+ FileWrite(File, ' %-*s: %6s %10s = %-22s' % (self.MaxLen, Pcd.TokenCName, TypeName, '(' + Pcd.DatumType + ')', PcdValue.strip()))\r
else:\r
if DscMatch:\r
if (Pcd.TokenCName, Key) in self.FdfPcdSet:\r
- FileWrite(File, ' *F %-*s: %6s %10s = %-22s' % (self.MaxLen, Pcd.TokenCName, TypeName, '('+Pcd.DatumType+')', PcdValue.strip()))\r
+ FileWrite(File, ' *F %-*s: %6s %10s = %-22s' % (self.MaxLen, Pcd.TokenCName, TypeName, '(' + Pcd.DatumType + ')', PcdValue.strip()))\r
else:\r
- FileWrite(File, ' *P %-*s: %6s %10s = %-22s' % (self.MaxLen, Pcd.TokenCName, TypeName, '('+Pcd.DatumType+')', PcdValue.strip()))\r
+ FileWrite(File, ' *P %-*s: %6s %10s = %-22s' % (self.MaxLen, Pcd.TokenCName, TypeName, '(' + Pcd.DatumType + ')', PcdValue.strip()))\r
else:\r
- FileWrite(File, ' *M %-*s: %6s %10s = %-22s' % (self.MaxLen, Pcd.TokenCName, TypeName, '('+Pcd.DatumType+')', PcdValue.strip()))\r
- \r
+ FileWrite(File, ' *M %-*s: %6s %10s = %-22s' % (self.MaxLen, Pcd.TokenCName, TypeName, '(' + Pcd.DatumType + ')', PcdValue.strip()))\r
+\r
if TypeName in ('DYNHII', 'DEXHII', 'DYNVPD', 'DEXVPD'):\r
for SkuInfo in Pcd.SkuInfoList.values():\r
if TypeName in ('DYNHII', 'DEXHII'):\r
- FileWrite(File, '%*s: %s: %s' % (self.MaxLen + 4, SkuInfo.VariableGuid, SkuInfo.VariableName, SkuInfo.VariableOffset)) \r
+ FileWrite(File, '%*s: %s: %s' % (self.MaxLen + 4, SkuInfo.VariableGuid, SkuInfo.VariableName, SkuInfo.VariableOffset))\r
else:\r
FileWrite(File, '%*s' % (self.MaxLen + 4, SkuInfo.VpdOffset))\r
\r
FileWrite(File, ' %*s = %s' % (self.MaxLen + 19, 'DEC DEFAULT', DecDefaultValue.strip()))\r
\r
if ModulePcdSet == None:\r
- ModuleOverride = self.ModulePcdOverride.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName), {})\r
- for ModulePath in ModuleOverride:\r
- ModuleDefault = ModuleOverride[ModulePath]\r
- if Pcd.DatumType in ('UINT8', 'UINT16', 'UINT32', 'UINT64'):\r
- ModulePcdDefaultValueNumber = int(ModuleDefault.strip(), 0)\r
- Match = (ModulePcdDefaultValueNumber == PcdValueNumber)\r
- else:\r
- Match = (ModuleDefault.strip() == PcdValue.strip())\r
- if Match:\r
- continue\r
- FileWrite(File, ' *M %-*s = %s' % (self.MaxLen + 19, ModulePath, ModuleDefault.strip()))\r
+ if not BuildOptionMatch:\r
+ ModuleOverride = self.ModulePcdOverride.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName), {})\r
+ for ModulePath in ModuleOverride:\r
+ ModuleDefault = ModuleOverride[ModulePath]\r
+ if Pcd.DatumType in ('UINT8', 'UINT16', 'UINT32', 'UINT64'):\r
+ ModulePcdDefaultValueNumber = int(ModuleDefault.strip(), 0)\r
+ Match = (ModulePcdDefaultValueNumber == PcdValueNumber)\r
+ else:\r
+ Match = (ModuleDefault.strip() == PcdValue.strip())\r
+ if Match:\r
+ continue\r
+ FileWrite(File, ' *M %-*s = %s' % (self.MaxLen + 19, ModulePath, ModuleDefault.strip()))\r
\r
if ModulePcdSet == None:\r
FileWrite(File, gSectionEnd)\r
# @param Wa Workspace context information\r
#\r
def _DiscoverNestedFvList(self, FvName, Wa):\r
- for Ffs in Wa.FdfProfile.FvDict[FvName.upper()].FfsList:\r
- for Section in Ffs.SectionList:\r
- try:\r
- for FvSection in Section.SectionList:\r
- if FvSection.FvName in self.FvList:\r
- continue\r
- self._GuidsDb[Ffs.NameGuid.upper()] = FvSection.FvName\r
- self.FvList.append(FvSection.FvName)\r
- self.FvInfo[FvSection.FvName] = ("Nested FV", 0, 0)\r
- self._DiscoverNestedFvList(FvSection.FvName, Wa)\r
- except AttributeError:\r
- pass\r
+ FvDictKey=FvName.upper()\r
+ if FvDictKey in Wa.FdfProfile.FvDict:\r
+ for Ffs in Wa.FdfProfile.FvDict[FvName.upper()].FfsList:\r
+ for Section in Ffs.SectionList:\r
+ try:\r
+ for FvSection in Section.SectionList:\r
+ if FvSection.FvName in self.FvList:\r
+ continue\r
+ self._GuidsDb[Ffs.NameGuid.upper()] = FvSection.FvName\r
+ self.FvList.append(FvSection.FvName)\r
+ self.FvInfo[FvSection.FvName] = ("Nested FV", 0, 0)\r
+ self._DiscoverNestedFvList(FvSection.FvName, Wa)\r
+ except AttributeError:\r
+ pass\r
\r
##\r
# Constructor function for class FdRegionReport\r
DecDefaultValue = Package.Pcds[TokenCName, TokenSpaceGuidCName, DecType].DefaultValue\r
PlatformPcds[(TokenCName, TokenSpaceGuidCName)] = DecDefaultValue\r
#\r
- # Collect PCDs defined in DSC common section\r
+ # Collect PCDs defined in DSC file\r
#\r
- Platform = Wa.BuildDatabase[Wa.MetaFile, 'COMMON']\r
- for (TokenCName, TokenSpaceGuidCName) in Platform.Pcds:\r
- DscDefaultValue = Platform.Pcds[(TokenCName, TokenSpaceGuidCName)].DefaultValue\r
- PlatformPcds[(TokenCName, TokenSpaceGuidCName)] = DscDefaultValue\r
+ for arch in Wa.ArchList:\r
+ Platform = Wa.BuildDatabase[Wa.MetaFile, arch]\r
+ for (TokenCName, TokenSpaceGuidCName) in Platform.Pcds:\r
+ DscDefaultValue = Platform.Pcds[(TokenCName, TokenSpaceGuidCName)].DefaultValue\r
+ PlatformPcds[(TokenCName, TokenSpaceGuidCName)] = DscDefaultValue\r
\r
#\r
# Add PEI and DXE a priori files GUIDs defined in PI specification.\r
# Collect the GUID map in the FV firmware volume\r
#\r
for FvName in self.FvList:\r
- for Ffs in Wa.FdfProfile.FvDict[FvName.upper()].FfsList:\r
- try:\r
- #\r
- # collect GUID map for binary EFI file in FDF file.\r
- #\r
- Guid = Ffs.NameGuid.upper()\r
- Match = gPcdGuidPattern.match(Ffs.NameGuid)\r
- if Match:\r
- PcdTokenspace = Match.group(1)\r
- PcdToken = Match.group(2)\r
- if (PcdToken, PcdTokenspace) in PlatformPcds:\r
- GuidValue = PlatformPcds[(PcdToken, PcdTokenspace)]\r
- Guid = GuidStructureByteArrayToGuidString(GuidValue).upper()\r
- for Section in Ffs.SectionList:\r
- try:\r
- ModuleSectFile = mws.join(Wa.WorkspaceDir, Section.SectFileName)\r
- self._GuidsDb[Guid] = ModuleSectFile\r
- except AttributeError:\r
- pass\r
- except AttributeError:\r
- pass\r
+ FvDictKey=FvName.upper()\r
+ if FvDictKey in Wa.FdfProfile.FvDict:\r
+ for Ffs in Wa.FdfProfile.FvDict[FvName.upper()].FfsList:\r
+ try:\r
+ #\r
+ # collect GUID map for binary EFI file in FDF file.\r
+ #\r
+ Guid = Ffs.NameGuid.upper()\r
+ Match = gPcdGuidPattern.match(Ffs.NameGuid)\r
+ if Match:\r
+ PcdTokenspace = Match.group(1)\r
+ PcdToken = Match.group(2)\r
+ if (PcdToken, PcdTokenspace) in PlatformPcds:\r
+ GuidValue = PlatformPcds[(PcdToken, PcdTokenspace)]\r
+ Guid = GuidStructureByteArrayToGuidString(GuidValue).upper()\r
+ for Section in Ffs.SectionList:\r
+ try:\r
+ ModuleSectFile = mws.join(Wa.WorkspaceDir, Section.SectFileName)\r
+ self._GuidsDb[Guid] = ModuleSectFile\r
+ except AttributeError:\r
+ pass\r
+ except AttributeError:\r
+ pass\r
\r
\r
##\r
self.BaseAddress = Fd.BaseAddress\r
self.Size = Fd.Size\r
self.FdRegionList = [FdRegionReport(FdRegion, Wa) for FdRegion in Fd.RegionList]\r
+ self.FvPath = os.path.join(Wa.BuildDir, "FV")\r
+ self.VpdFilePath = os.path.join(self.FvPath, "%s.map" % Wa.Platform.VpdToolGuid)\r
+ self.VPDBaseAddress = 0\r
+ self.VPDSize = 0\r
+ self.VPDInfoList = []\r
+ for index, FdRegion in enumerate(Fd.RegionList):\r
+ if str(FdRegion.RegionType) is 'FILE' and Wa.Platform.VpdToolGuid in str(FdRegion.RegionDataList):\r
+ self.VPDBaseAddress = self.FdRegionList[index].BaseAddress\r
+ self.VPDSize = self.FdRegionList[index].Size\r
+ break\r
+\r
+ if os.path.isfile(self.VpdFilePath):\r
+ fd = open(self.VpdFilePath, "r")\r
+ Lines = fd.readlines()\r
+ for Line in Lines:\r
+ Line = Line.strip()\r
+ if len(Line) == 0 or Line.startswith("#"):\r
+ continue\r
+ try:\r
+ PcdName, SkuId, Offset, Size, Value = Line.split("#")[0].split("|")\r
+ PcdName, SkuId, Offset, Size, Value = PcdName.strip(), SkuId.strip(), Offset.strip(), Size.strip(), Value.strip()\r
+ Offset = '0x%08X' % (int(Offset, 16) + self.VPDBaseAddress)\r
+ self.VPDInfoList.append("%s | %s | %s | %s | %s" % (PcdName, SkuId, Offset, Size, Value))\r
+ except:\r
+ EdkLogger.error("BuildReport", CODE_ERROR, "Fail to parse VPD information file %s" % self.VpdFilePath)\r
+ fd.close()\r
\r
##\r
# Generate report for the firmware device.\r
for FdRegionItem in self.FdRegionList:\r
FdRegionItem.GenerateReport(File)\r
\r
+ if len(self.VPDInfoList) > 0:\r
+ FileWrite(File, gSubSectionStart)\r
+ FileWrite(File, "FD VPD Region")\r
+ FileWrite(File, "Base Address: 0x%X" % self.VPDBaseAddress)\r
+ FileWrite(File, "Size: 0x%X (%.0fK)" % (self.VPDSize, self.VPDSize / 1024.0))\r
+ FileWrite(File, gSubSectionSep)\r
+ for item in self.VPDInfoList:\r
+ FileWrite(File, item)\r
+ FileWrite(File, gSubSectionEnd)\r
FileWrite(File, gSectionEnd)\r
\r
\r