# This module contains the functionality to generate build report after\r
# build all target completes successfully.\r
#\r
-# Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2010 - 2017, 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
import sys\r
import time\r
import struct\r
+import hashlib\r
+import subprocess\r
+import threading\r
from datetime import datetime\r
from StringIO import StringIO\r
from Common import EdkLogger\r
from Common.InfClassObject import gComponentType2ModuleType\r
from Common.BuildToolError import FILE_WRITE_FAILURE\r
from Common.BuildToolError import CODE_ERROR\r
-from Common.DataType import TAB_LINE_BREAK\r
-from Common.DataType import TAB_DEPEX\r
-from Common.DataType import TAB_SLASH\r
-from Common.DataType import TAB_SPACE_SPLIT\r
-from Common.DataType import TAB_BRG_PCD\r
-from Common.DataType import TAB_BRG_LIBRARY\r
-from Common.DataType import TAB_BACK_SLASH\r
+from Common.BuildToolError import COMMAND_FAILURE\r
from Common.LongFilePathSupport import OpenLongFilePath as open\r
from Common.MultipleWorkspace import MultipleWorkspace as mws\r
import Common.GlobalData as GlobalData\r
+from AutoGen.AutoGen import ModuleAutoGen\r
+from Common.Misc import PathClass\r
+from Common.String import NormPath\r
+from Common.DataType import *\r
+import collections\r
\r
## Pattern to extract contents in EDK DXS files\r
gDxsDependencyPattern = re.compile(r"DEPENDENCY_START(.+)DEPENDENCY_END", re.DOTALL)\r
'UEFI_APPLICATION' : '0x9 (APPLICATION)',\r
'SMM_CORE' : '0xD (SMM_CORE)',\r
'SMM_DRIVER' : '0xA (SMM)', # Extension of module type to support PI 1.1 SMM drivers\r
+ 'MM_STANDALONE' : '0xE (MM_STANDALONE)',\r
+ 'MM_CORE_STANDALONE' : '0xF (MM_CORE_STANDALONE)'\r
}\r
\r
## The look up table of the supported opcode in the dependency expression binaries\r
String = textwrap.fill(String, 120)\r
File.write(String + gEndOfLine)\r
\r
+def ByteArrayForamt(Value):\r
+ IsByteArray = False\r
+ SplitNum = 16\r
+ ArrayList = []\r
+ if Value.startswith('{') and Value.endswith('}'):\r
+ Value = Value[1:-1]\r
+ ValueList = Value.split(',')\r
+ if len(ValueList) >= SplitNum:\r
+ IsByteArray = True\r
+ if IsByteArray:\r
+ if ValueList:\r
+ Len = len(ValueList)/SplitNum\r
+ for i, element in enumerate(ValueList):\r
+ ValueList[i] = '0x%02X' % int(element.strip(), 16)\r
+ if Len:\r
+ Id = 0\r
+ while (Id <= Len):\r
+ End = min(SplitNum*(Id+1), len(ValueList))\r
+ Str = ','.join(ValueList[SplitNum*Id : End])\r
+ if End == len(ValueList):\r
+ Str += '}'\r
+ ArrayList.append(Str)\r
+ break\r
+ else:\r
+ Str += ','\r
+ ArrayList.append(Str)\r
+ Id += 1\r
+ else:\r
+ ArrayList = [Value + '}']\r
+ return IsByteArray, ArrayList\r
+\r
##\r
# Find all the header file that the module source directly includes.\r
#\r
LibConstructorList = Lib.ConstructorList\r
LibDesstructorList = Lib.DestructorList\r
LibDepexList = Lib.DepexExpression[M.Arch, M.ModuleType]\r
- self.LibraryList.append((LibInfPath, LibClassList, LibConstructorList, LibDesstructorList, LibDepexList))\r
+ for LibAutoGen in M.LibraryAutoGenList:\r
+ if LibInfPath == LibAutoGen.MetaFile.Path:\r
+ LibTime = LibAutoGen.BuildTime\r
+ break\r
+ self.LibraryList.append((LibInfPath, LibClassList, LibConstructorList, LibDesstructorList, LibDepexList, LibTime))\r
\r
##\r
# Generate report for module library information\r
# @param File The file object for report\r
#\r
def GenerateReport(self, File):\r
- FileWrite(File, gSubSectionStart)\r
- FileWrite(File, TAB_BRG_LIBRARY)\r
if len(self.LibraryList) > 0:\r
+ FileWrite(File, gSubSectionStart)\r
+ FileWrite(File, TAB_BRG_LIBRARY)\r
FileWrite(File, gSubSectionSep)\r
for LibraryItem in self.LibraryList:\r
LibInfPath = LibraryItem[0]\r
LibDepex = " ".join(LibraryItem[4])\r
if LibDepex:\r
EdkIILibInfo += " Depex = " + LibDepex\r
+ if LibraryItem[5]:\r
+ EdkIILibInfo += " Time = " + LibraryItem[5]\r
if EdkIILibInfo:\r
FileWrite(File, "{%s: %s}" % (LibClass, EdkIILibInfo))\r
else:\r
FileWrite(File, "{%s}" % LibClass)\r
\r
- FileWrite(File, gSubSectionEnd)\r
+ FileWrite(File, gSubSectionEnd)\r
\r
##\r
# Reports dependency expression information\r
if not ModuleType:\r
ModuleType = gComponentType2ModuleType.get(M.ComponentType, "")\r
\r
- if ModuleType in ["SEC", "PEI_CORE", "DXE_CORE", "SMM_CORE", "UEFI_APPLICATION"]:\r
+ if ModuleType in ["SEC", "PEI_CORE", "DXE_CORE", "SMM_CORE", "MM_CORE_STANDALONE", "UEFI_APPLICATION"]:\r
return\r
\r
for Source in M.SourceFileList:\r
#\r
def GenerateReport(self, File, GlobalDepexParser):\r
if not self.Depex:\r
- FileWrite(File, gSubSectionStart)\r
- FileWrite(File, TAB_DEPEX)\r
- FileWrite(File, gSubSectionEnd)\r
return\r
FileWrite(File, gSubSectionStart)\r
if os.path.isfile(self._DepexFileName):\r
self.FileGuid = M.Guid\r
self.Size = 0\r
self.BuildTimeStamp = None\r
+ self.Hash = 0\r
self.DriverType = ""\r
if not M.IsLibrary:\r
ModuleType = M.ModuleType\r
self.PciDeviceId = M.Module.Defines.get("PCI_DEVICE_ID", "")\r
self.PciVendorId = M.Module.Defines.get("PCI_VENDOR_ID", "")\r
self.PciClassCode = M.Module.Defines.get("PCI_CLASS_CODE", "")\r
+ self.BuildTime = M.BuildTime\r
\r
self._BuildDir = M.BuildDir\r
self.ModulePcdSet = {}\r
except IOError:\r
EdkLogger.warn(None, "Fail to read report file", FwReportFileName)\r
\r
+ if "HASH" in ReportType:\r
+ OutputDir = os.path.join(self._BuildDir, "OUTPUT")\r
+ DefaultEFIfile = os.path.join(OutputDir, self.ModuleName + ".efi")\r
+ if os.path.isfile(DefaultEFIfile):\r
+ Tempfile = os.path.join(OutputDir, self.ModuleName + "_hash.tmp")\r
+ # rebase the efi image since its base address may not zero\r
+ cmd = ["GenFw", "--rebase", str(0), "-o", Tempfile, DefaultEFIfile]\r
+ try:\r
+ PopenObject = subprocess.Popen(' '.join(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)\r
+ except Exception, X:\r
+ EdkLogger.error("GenFw", COMMAND_FAILURE, ExtraData="%s: %s" % (str(X), cmd[0]))\r
+ EndOfProcedure = threading.Event()\r
+ EndOfProcedure.clear()\r
+ if PopenObject.stderr:\r
+ StdErrThread = threading.Thread(target=ReadMessage, args=(PopenObject.stderr, EdkLogger.quiet, EndOfProcedure))\r
+ StdErrThread.setName("STDERR-Redirector")\r
+ StdErrThread.setDaemon(False)\r
+ StdErrThread.start()\r
+ # waiting for program exit\r
+ PopenObject.wait()\r
+ if PopenObject.stderr:\r
+ StdErrThread.join()\r
+ if PopenObject.returncode != 0:\r
+ EdkLogger.error("GenFw", COMMAND_FAILURE, "Failed to generate firmware hash image for %s" % (DefaultEFIfile))\r
+ if os.path.isfile(Tempfile):\r
+ self.Hash = hashlib.sha1()\r
+ buf = open(Tempfile, 'rb').read()\r
+ if self.Hash.update(buf):\r
+ self.Hash = self.Hash.update(buf)\r
+ self.Hash = self.Hash.hexdigest()\r
+ os.remove(Tempfile)\r
+\r
FileWrite(File, "Module Summary")\r
FileWrite(File, "Module Name: %s" % self.ModuleName)\r
FileWrite(File, "Module INF Path: %s" % self.ModuleInfPath)\r
FileWrite(File, "File GUID: %s" % self.FileGuid)\r
if self.Size:\r
FileWrite(File, "Size: 0x%X (%.2fK)" % (self.Size, self.Size / 1024.0))\r
+ if self.Hash:\r
+ FileWrite(File, "SHA1 HASH: %s *%s" % (self.Hash, self.ModuleName + ".efi"))\r
if self.BuildTimeStamp:\r
FileWrite(File, "Build Time Stamp: %s" % self.BuildTimeStamp)\r
+ if self.BuildTime:\r
+ FileWrite(File, "Module Build Time: %s" % self.BuildTime)\r
if self.DriverType:\r
FileWrite(File, "Driver Type: %s" % self.DriverType)\r
if self.UefiSpecVersion:\r
\r
FileWrite(File, gSectionEnd)\r
\r
+def ReadMessage(From, To, ExitFlag):\r
+ while True:\r
+ # read one line a time\r
+ Line = From.readline()\r
+ # empty string means "end"\r
+ if Line != None and Line != "":\r
+ To(Line.rstrip())\r
+ else:\r
+ break\r
+ if ExitFlag.isSet():\r
+ break\r
+\r
##\r
# Reports platform and module PCD information\r
#\r
self.UnusedPcds = {}\r
self.ConditionalPcds = {}\r
self.MaxLen = 0\r
+ self.Arch = None\r
if Wa.FdfProfile:\r
self.FdfPcdSet = Wa.FdfProfile.PcdDict\r
else:\r
\r
self.ModulePcdOverride = {}\r
for Pa in Wa.AutoGenObjectList:\r
+ self.Arch = Pa.Arch\r
#\r
# Collect all platform referenced PCDs and grouped them by PCD token space\r
# GUID C Names\r
UnusedPcdFullList = []\r
for item in Pa.Platform.Pcds:\r
Pcd = Pa.Platform.Pcds[item]\r
+ if not Pcd.Type:\r
+ # check the Pcd in FDF file, whether it is used in module first\r
+ for T in ["FixedAtBuild", "PatchableInModule", "FeatureFlag", "Dynamic", "DynamicEx"]:\r
+ PcdList = self.AllPcds.setdefault(Pcd.TokenSpaceGuidCName, {}).setdefault(T, [])\r
+ if Pcd in PcdList:\r
+ Pcd.Type = T\r
+ break\r
if not Pcd.Type:\r
PcdTypeFlag = False\r
for package in Pa.PackageList:\r
# Collect PCDs defined in DSC common section\r
#\r
self.DscPcdDefault = {}\r
- for Arch in Wa.ArchList:\r
- Platform = Wa.BuildDatabase[Wa.MetaFile, Arch, Wa.BuildTarget, Wa.ToolChain]\r
- for (TokenCName, TokenSpaceGuidCName) in Platform.Pcds:\r
- DscDefaultValue = Platform.Pcds[(TokenCName, TokenSpaceGuidCName)].DefaultValue\r
+ for Pa in Wa.AutoGenObjectList:\r
+ for (TokenCName, TokenSpaceGuidCName) in Pa.Platform.Pcds:\r
+ DscDefaultValue = Pa.Platform.Pcds[(TokenCName, TokenSpaceGuidCName)].DefaultValue\r
if DscDefaultValue:\r
self.DscPcdDefault[(TokenCName, TokenSpaceGuidCName)] = DscDefaultValue\r
\r
FileWrite(File, " *M - Module scoped PCD override")\r
FileWrite(File, gSectionSep)\r
else:\r
- if not ReportSubType:\r
+ if not ReportSubType and ModulePcdSet:\r
#\r
# For module PCD sub-section\r
#\r
#\r
TypeName, DecType = gPcdTypeMap.get(Type, ("", Type))\r
for Pcd in PcdDict[Key][Type]:\r
+ PcdTokenCName = Pcd.TokenCName\r
+ MixedPcdFlag = False\r
+ if GlobalData.MixedPcd:\r
+ for PcdKey in GlobalData.MixedPcd:\r
+ if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdKey]:\r
+ PcdTokenCName = PcdKey[0]\r
+ MixedPcdFlag = True\r
+ if MixedPcdFlag and not ModulePcdSet:\r
+ continue\r
#\r
# Get PCD default value and their override relationship\r
#\r
DecDefaultValue = self.DecPcdDefault.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, DecType))\r
DscDefaultValue = self.DscPcdDefault.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName))\r
+ DscDefaultValBak= DscDefaultValue\r
DscDefaultValue = self.FdfPcdSet.get((Pcd.TokenCName, Key), DscDefaultValue)\r
InfDefaultValue = None\r
\r
else:\r
DscMatch = (DscDefaultValue.strip() == PcdValue.strip())\r
\r
+ IsStructure = False\r
+ if GlobalData.gStructurePcd and (self.Arch in GlobalData.gStructurePcd.keys()) and ((Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.gStructurePcd[self.Arch]):\r
+ IsStructure = True\r
+ if TypeName in ('DYNVPD', 'DEXVPD'):\r
+ SkuInfoList = Pcd.SkuInfoList\r
+ Pcd = GlobalData.gStructurePcd[self.Arch][(Pcd.TokenCName, Pcd.TokenSpaceGuidCName)]\r
+ Pcd.DatumType = Pcd.StructName\r
+ if TypeName in ('DYNVPD', 'DEXVPD'):\r
+ Pcd.SkuInfoList = SkuInfoList\r
+ if Pcd.SkuOverrideValues:\r
+ DscMatch = True\r
+ DecMatch = False\r
#\r
# Report PCD item according to their override relationship\r
#\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
+ if DecMatch and InfMatch:\r
+ self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, ' ')\r
+ elif BuildOptionMatch:\r
+ self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*B')\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
+ self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*F')\r
else:\r
- FileWrite(File, ' *P %-*s: %6s %10s = %-22s' % (self.MaxLen, Pcd.TokenCName, TypeName, '(' + Pcd.DatumType + ')', PcdValue.strip()))\r
+ self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*P')\r
else:\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
- else:\r
- FileWrite(File, '%*s' % (self.MaxLen + 4, SkuInfo.VpdOffset))\r
- \r
- if not DscMatch and DscDefaultValue != None:\r
- FileWrite(File, ' %*s = %s' % (self.MaxLen + 19, 'DSC DEFAULT', DscDefaultValue.strip()))\r
-\r
- if not InfMatch and InfDefaultValue != None:\r
- FileWrite(File, ' %*s = %s' % (self.MaxLen + 19, 'INF DEFAULT', InfDefaultValue.strip()))\r
-\r
- if not DecMatch and DecDefaultValue != None:\r
- FileWrite(File, ' %*s = %s' % (self.MaxLen + 19, 'DEC DEFAULT', DecDefaultValue.strip()))\r
+ self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*M')\r
\r
if ModulePcdSet == None:\r
+ if IsStructure:\r
+ continue\r
+ if not TypeName in ('PATCH', 'FLAG', 'FIXED'):\r
+ continue\r
if not BuildOptionMatch:\r
ModuleOverride = self.ModulePcdOverride.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName), {})\r
for ModulePath in ModuleOverride:\r
Match = (ModuleDefault.strip() == PcdValue.strip())\r
if Match:\r
continue\r
- FileWrite(File, ' *M %-*s = %s' % (self.MaxLen + 19, ModulePath, ModuleDefault.strip()))\r
+ IsByteArray, ArrayList = ByteArrayForamt(ModuleDefault.strip())\r
+ if IsByteArray:\r
+ FileWrite(File, ' *M %-*s = %s' % (self.MaxLen + 19, ModulePath, '{'))\r
+ for Array in ArrayList:\r
+ FileWrite(File, '%s' % (Array))\r
+ else:\r
+ FileWrite(File, ' *M %-*s = %s' % (self.MaxLen + 19, ModulePath, ModuleDefault.strip()))\r
\r
if ModulePcdSet == None:\r
FileWrite(File, gSectionEnd)\r
else:\r
- if not ReportSubType:\r
+ if not ReportSubType and ModulePcdSet:\r
FileWrite(File, gSubSectionEnd)\r
\r
\r
+ def PrintPcdDefault(self, File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue):\r
+ if not DscMatch and DscDefaultValue != None:\r
+ Value = DscDefaultValue.strip()\r
+ IsByteArray, ArrayList = ByteArrayForamt(Value)\r
+ if IsByteArray:\r
+ FileWrite(File, ' %*s = %s' % (self.MaxLen + 19, 'DSC DEFAULT', "{"))\r
+ for Array in ArrayList:\r
+ FileWrite(File, '%s' % (Array))\r
+ else:\r
+ FileWrite(File, ' %*s = %s' % (self.MaxLen + 19, 'DSC DEFAULT', Value))\r
+ if not InfMatch and InfDefaultValue != None:\r
+ Value = InfDefaultValue.strip()\r
+ IsByteArray, ArrayList = ByteArrayForamt(Value)\r
+ if IsByteArray:\r
+ FileWrite(File, ' %*s = %s' % (self.MaxLen + 19, 'INF DEFAULT', "{"))\r
+ for Array in ArrayList:\r
+ FileWrite(File, '%s' % (Array))\r
+ else:\r
+ FileWrite(File, ' %*s = %s' % (self.MaxLen + 19, 'INF DEFAULT', Value))\r
+\r
+ if not DecMatch and DecDefaultValue != None:\r
+ Value = DecDefaultValue.strip()\r
+ IsByteArray, ArrayList = ByteArrayForamt(Value)\r
+ if IsByteArray:\r
+ FileWrite(File, ' %*s = %s' % (self.MaxLen + 19, 'DEC DEFAULT', "{"))\r
+ for Array in ArrayList:\r
+ FileWrite(File, '%s' % (Array))\r
+ else:\r
+ FileWrite(File, ' %*s = %s' % (self.MaxLen + 19, 'DEC DEFAULT', Value))\r
+ if IsStructure:\r
+ self.PrintStructureInfo(File, Pcd.DefaultValues)\r
+\r
+ def PrintPcdValue(self, File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, Flag = ' '):\r
+ if not Pcd.SkuInfoList:\r
+ Value = Pcd.DefaultValue\r
+ IsByteArray, ArrayList = ByteArrayForamt(Value)\r
+ if IsByteArray:\r
+ FileWrite(File, ' %-*s : %6s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '{'))\r
+ for Array in ArrayList:\r
+ FileWrite(File, '%s' % (Array))\r
+ else:\r
+ FileWrite(File, ' %-*s : %6s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', Value))\r
+ if IsStructure:\r
+ OverrideValues = Pcd.SkuOverrideValues\r
+ if OverrideValues:\r
+ Keys = OverrideValues.keys()\r
+ Data = OverrideValues[Keys[0]]\r
+ Struct = Data.values()[0]\r
+ self.PrintStructureInfo(File, Struct)\r
+ self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue)\r
+ else:\r
+ FirstPrint = True\r
+ SkuList = sorted(Pcd.SkuInfoList.keys())\r
+ for Sku in SkuList:\r
+ SkuInfo = Pcd.SkuInfoList[Sku]\r
+ if TypeName in ('DYNHII', 'DEXHII'):\r
+ if SkuInfo.DefaultStoreDict:\r
+ DefaultStoreList = sorted(SkuInfo.DefaultStoreDict.keys())\r
+ for DefaultStore in DefaultStoreList:\r
+ Value = SkuInfo.DefaultStoreDict[DefaultStore]\r
+ IsByteArray, ArrayList = ByteArrayForamt(Value)\r
+ if FirstPrint:\r
+ FirstPrint = False\r
+ if IsByteArray:\r
+ FileWrite(File, ' %-*s : %6s %10s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', '(' + DefaultStore + ')', '{'))\r
+ for Array in ArrayList:\r
+ FileWrite(File, '%s' % (Array))\r
+ else:\r
+ FileWrite(File, ' %-*s : %6s %10s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', '(' + DefaultStore + ')', Value))\r
+ else:\r
+ if IsByteArray:\r
+ FileWrite(File, ' %-*s : %6s %10s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', '(' + DefaultStore + ')', '{'))\r
+ for Array in ArrayList:\r
+ FileWrite(File, '%s' % (Array))\r
+ else:\r
+ FileWrite(File, ' %-*s : %6s %10s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', '(' + DefaultStore + ')', Value))\r
+ FileWrite(File, '%*s: %s: %s' % (self.MaxLen + 4, SkuInfo.VariableGuid, SkuInfo.VariableName, SkuInfo.VariableOffset))\r
+ if IsStructure:\r
+ OverrideValues = Pcd.SkuOverrideValues[Sku]\r
+ Struct = OverrideValues[DefaultStore]\r
+ self.PrintStructureInfo(File, Struct)\r
+ self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue)\r
+ elif TypeName in ('DYNVPD', 'DEXVPD'):\r
+ Value = SkuInfo.DefaultValue\r
+ IsByteArray, ArrayList = ByteArrayForamt(Value)\r
+ if FirstPrint:\r
+ FirstPrint = False\r
+ if IsByteArray:\r
+ FileWrite(File, ' %-*s : %6s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', "{"))\r
+ for Array in ArrayList:\r
+ FileWrite(File, '%s' % (Array))\r
+ else:\r
+ FileWrite(File, ' %-*s : %6s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', Value))\r
+ else:\r
+ if IsByteArray:\r
+ FileWrite(File, ' %-*s : %6s %10s %10s = %s' % (self.MaxLen, ' ' , TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', "{"))\r
+ for Array in ArrayList:\r
+ FileWrite(File, '%s' % (Array))\r
+ else:\r
+ FileWrite(File, ' %-*s : %6s %10s %10s = %s' % (self.MaxLen, ' ' , TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', Value))\r
+ FileWrite(File, '%*s' % (self.MaxLen + 4, SkuInfo.VpdOffset))\r
+ if IsStructure:\r
+ OverrideValues = Pcd.SkuOverrideValues[Sku]\r
+ if OverrideValues:\r
+ Keys = OverrideValues.keys()\r
+ Struct = OverrideValues[Keys[0]]\r
+ self.PrintStructureInfo(File, Struct)\r
+ self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue)\r
+ else:\r
+ Value = SkuInfo.DefaultValue\r
+ IsByteArray, ArrayList = ByteArrayForamt(Value)\r
+ if FirstPrint:\r
+ FirstPrint = False\r
+ if IsByteArray:\r
+ FileWrite(File, ' %-*s : %6s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', '{'))\r
+ for Array in ArrayList:\r
+ FileWrite(File, '%s' % (Array))\r
+ else:\r
+ FileWrite(File, ' %-*s : %6s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', Value))\r
+ else:\r
+ if IsByteArray:\r
+ FileWrite(File, ' %-*s : %6s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', '{'))\r
+ for Array in ArrayList:\r
+ FileWrite(File, '%s' % (Array))\r
+ else:\r
+ FileWrite(File, ' %-*s : %6s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', Value))\r
+ if IsStructure:\r
+ OverrideValues = Pcd.SkuOverrideValues[Sku]\r
+ if OverrideValues:\r
+ Keys = OverrideValues.keys()\r
+ Struct = OverrideValues[Keys[0]]\r
+ self.PrintStructureInfo(File, Struct)\r
+ self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue)\r
+\r
+ def PrintStructureInfo(self, File, Struct):\r
+ NewInfo = collections.OrderedDict()\r
+ for Key, Value in Struct.items():\r
+ if Key not in NewInfo:\r
+ NewInfo[Key] = Value[0]\r
+ else:\r
+ del NewInfo[Key]\r
+ NewInfo[Key] = Value[0]\r
+ if NewInfo:\r
+ for item in NewInfo:\r
+ FileWrite(File, ' %-*s = %s' % (self.MaxLen + 4, '.' + item, NewInfo[item]))\r
+\r
+ def StrtoHex(self, value):\r
+ try:\r
+ value = hex(int(value))\r
+ return value\r
+ except:\r
+ if value.startswith("L\"") and value.endswith("\""):\r
+ valuelist = []\r
+ for ch in value[2:-1]:\r
+ valuelist.append(hex(ord(ch)))\r
+ valuelist.append('0x00')\r
+ return valuelist\r
+ elif value.startswith("\"") and value.endswith("\""):\r
+ return hex(ord(value[1:-1]))\r
+ elif value.startswith("{") and value.endswith("}"):\r
+ valuelist = []\r
+ if ',' not in value:\r
+ return value[1:-1]\r
+ for ch in value[1:-1].split(','):\r
+ ch = ch.strip()\r
+ if ch.startswith('0x') or ch.startswith('0X'):\r
+ valuelist.append(ch)\r
+ continue\r
+ try:\r
+ valuelist.append(hex(int(ch.strip())))\r
+ except:\r
+ pass\r
+ return valuelist\r
+ else:\r
+ return value\r
\r
##\r
# Reports platform and module Prediction information\r
#\r
# Collect PCDs defined in DSC file\r
#\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
+ for Pa in Wa.AutoGenObjectList:\r
+ for (TokenCName, TokenSpaceGuidCName) in Pa.Platform.Pcds:\r
+ DscDefaultValue = Pa.Platform.Pcds[(TokenCName, TokenSpaceGuidCName)].DefaultValue\r
PlatformPcds[(TokenCName, TokenSpaceGuidCName)] = DscDefaultValue\r
\r
#\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
+ if Offset.lower().startswith('0x'):\r
+ Offset = '0x%08X' % (int(Offset, 16) + self.VPDBaseAddress)\r
+ else:\r
+ Offset = '0x%08X' % (int(Offset, 10) + 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
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
+ ValueList = item.split('|')\r
+ Value = ValueList[-1].strip()\r
+ IsByteArray, ArrayList = ByteArrayForamt(Value)\r
+ if IsByteArray:\r
+ ValueList[-1] = ' {'\r
+ FileWrite(File, '|'.join(ValueList))\r
+ for Array in ArrayList:\r
+ FileWrite(File, '%s' % (Array))\r
+ else:\r
+ FileWrite(File, item)\r
FileWrite(File, gSubSectionEnd)\r
FileWrite(File, gSectionEnd)\r
\r
else:\r
self._IsModuleBuild = False\r
for Pa in Wa.AutoGenObjectList:\r
+ ModuleAutoGenList = []\r
for ModuleKey in Pa.Platform.Modules:\r
- self.ModuleReportList.append(ModuleReport(Pa.Platform.Modules[ModuleKey].M, ReportType))\r
+ ModuleAutoGenList.append(Pa.Platform.Modules[ModuleKey].M)\r
+ if GlobalData.gFdfParser != None:\r
+ if Pa.Arch in GlobalData.gFdfParser.Profile.InfDict:\r
+ INFList = GlobalData.gFdfParser.Profile.InfDict[Pa.Arch]\r
+ for InfName in INFList:\r
+ InfClass = PathClass(NormPath(InfName), Wa.WorkspaceDir, Pa.Arch)\r
+ Ma = ModuleAutoGen(Wa, InfClass, Pa.BuildTarget, Pa.ToolChain, Pa.Arch, Wa.MetaFile)\r
+ if Ma == None:\r
+ continue\r
+ if Ma not in ModuleAutoGenList:\r
+ ModuleAutoGenList.append(Ma)\r
+ for MGen in ModuleAutoGenList:\r
+ self.ModuleReportList.append(ModuleReport(MGen, ReportType))\r
\r
\r
\r
# @param self The object pointer\r
# @param File The file object for report\r
# @param BuildDuration The total time to build the modules\r
+ # @param AutoGenTime The total time of AutoGen Phase\r
+ # @param MakeTime The total time of Make Phase\r
+ # @param GenFdsTime The total time of GenFds Phase\r
# @param ReportType The kind of report items in the final report file\r
#\r
- def GenerateReport(self, File, BuildDuration, ReportType):\r
+ def GenerateReport(self, File, BuildDuration, AutoGenTime, MakeTime, GenFdsTime, ReportType):\r
FileWrite(File, "Platform Summary")\r
FileWrite(File, "Platform Name: %s" % self.PlatformName)\r
FileWrite(File, "Platform DSC Path: %s" % self.PlatformDscPath)\r
FileWrite(File, "Architectures: %s" % self.Architectures)\r
FileWrite(File, "Tool Chain: %s" % self.ToolChain)\r
FileWrite(File, "Target: %s" % self.Target)\r
+ if GlobalData.gSkuids:\r
+ FileWrite(File, "SKUID: %s" % " ".join(GlobalData.gSkuids))\r
+ if GlobalData.gDefaultStores:\r
+ FileWrite(File, "DefaultStore: %s" % " ".join(GlobalData.gDefaultStores))\r
FileWrite(File, "Output Path: %s" % self.OutputPath)\r
FileWrite(File, "Build Environment: %s" % self.BuildEnvironment)\r
FileWrite(File, "Build Duration: %s" % BuildDuration)\r
+ if AutoGenTime:\r
+ FileWrite(File, "AutoGen Duration: %s" % AutoGenTime)\r
+ if MakeTime:\r
+ FileWrite(File, "Make Duration: %s" % MakeTime)\r
+ if GenFdsTime:\r
+ FileWrite(File, "GenFds Duration: %s" % GenFdsTime)\r
FileWrite(File, "Report Content: %s" % ", ".join(ReportType))\r
\r
+ if GlobalData.MixedPcd:\r
+ FileWrite(File, gSectionStart)\r
+ FileWrite(File, "The following PCDs use different access methods:")\r
+ FileWrite(File, gSectionSep)\r
+ for PcdItem in GlobalData.MixedPcd:\r
+ FileWrite(File, "%s.%s" % (str(PcdItem[1]), str(PcdItem[0])))\r
+ FileWrite(File, gSectionEnd)\r
+\r
if not self._IsModuleBuild:\r
if "PCD" in ReportType:\r
self.PcdReport.GenerateReport(File, None)\r
if ReportTypeItem not in self.ReportType:\r
self.ReportType.append(ReportTypeItem)\r
else:\r
- self.ReportType = ["PCD", "LIBRARY", "BUILD_FLAGS", "DEPEX", "FLASH", "FIXED_ADDRESS"]\r
+ self.ReportType = ["PCD", "LIBRARY", "BUILD_FLAGS", "DEPEX", "HASH", "FLASH", "FIXED_ADDRESS"]\r
##\r
# Adds platform report to the list\r
#\r
#\r
# @param self The object pointer\r
# @param BuildDuration The total time to build the modules\r
+ # @param AutoGenTime The total time of AutoGen phase\r
+ # @param MakeTime The total time of Make phase\r
+ # @param GenFdsTime The total time of GenFds phase\r
#\r
- def GenerateReport(self, BuildDuration):\r
+ def GenerateReport(self, BuildDuration, AutoGenTime, MakeTime, GenFdsTime):\r
if self.ReportFile:\r
try:\r
File = StringIO('')\r
for (Wa, MaList) in self.ReportList:\r
- PlatformReport(Wa, MaList, self.ReportType).GenerateReport(File, BuildDuration, self.ReportType)\r
+ PlatformReport(Wa, MaList, self.ReportType).GenerateReport(File, BuildDuration, AutoGenTime, MakeTime, GenFdsTime, self.ReportType)\r
Content = FileLinesSplit(File.getvalue(), gLineMaxLength)\r
SaveFileOnChange(self.ReportFile, Content, True)\r
EdkLogger.quiet("Build report can be found at %s" % os.path.abspath(self.ReportFile))\r