From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.136, mailfrom: chasel.chiu@intel.com) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by groups.io with SMTP; Mon, 29 Jul 2019 04:07:56 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 Jul 2019 04:07:52 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,322,1559545200"; d="scan'208";a="165445354" Received: from cchiu4-mobl1.gar.corp.intel.com ([10.5.240.67]) by orsmga008.jf.intel.com with ESMTP; 29 Jul 2019 04:07:51 -0700 From: "Chiu, Chasel" To: devel@edk2.groups.io Cc: Michael Kubacki , Nate DeSimone , Liming Gao Subject: [PATCH 1/4] MinPlatformPkg: Auto configure Fsp*BaseAddress PCD Date: Mon, 29 Jul 2019 19:07:12 +0800 Message-Id: <20190729110715.2312-2-chasel.chiu@intel.com> X-Mailer: git-send-email 2.13.3.windows.1 In-Reply-To: <20190729110715.2312-1-chasel.chiu@intel.com> References: <20190729110715.2312-1-chasel.chiu@intel.com> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1863 Add python script which will rebase FSP binary without patching platform DSC for Fsp*BaseAddress PCDs. Those base address PCD will be updated in FDF basing on flash map. Cc: Michael Kubacki Cc: Nate DeSimone Cc: Liming Gao Signed-off-by: Chasel Chiu --- Platform/Intel/MinPlatformPkg/Tools/Fsp/RebaseFspBinBaseAddress.py | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/Platform/Intel/MinPlatformPkg/Tools/Fsp/RebaseFspBinBaseAddress.py b/Platform/Intel/MinPlatformPkg/Tools/Fsp/RebaseFspBinBaseAddress.py new file mode 100644 index 0000000000..a8165b08e6 --- /dev/null +++ b/Platform/Intel/MinPlatformPkg/Tools/Fsp/RebaseFspBinBaseAddress.py @@ -0,0 +1,96 @@ +## @ RebaseFspBinBaseAddress.py +# +# Copyright (c) 2019, Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +import os +import sys +import re +import subprocess + +if len(sys.argv) not in [5,6]: + print ("RebaseFspBinBaseAddress.py - Error in number of arguments received") + print ("Usage - RebaseFspBinBaseAddress.py \ + ") + exit(1) + +flashMapName = sys.argv[1] +fspBinPath = sys.argv[2] +fspBinFile = sys.argv[3] +fvOffset = int(sys.argv[4], 16) +fspBinFileRebased = "Fsp_Rebased.fd" +splitFspBinPath = os.path.join("edk2","IntelFsp2Pkg","Tools","SplitFspBin.py") + +if len(sys.argv) == 6: + splitFspBinPath = sys.argv[5] + +# +# Make sure argument passed or valid +# +if not os.path.exists(flashMapName): + print ("WARNING! " + str(flashMapName) + " is not found.") + exit(1) +fspBinFilePath = fspBinPath + os.sep + fspBinFile +if not os.path.exists(fspBinFilePath): + print ("WARNING! " + str(fspBinFilePath) + " is not found.") + exit(1) +if not os.path.exists(splitFspBinPath): + print ("WARNING! " + str(splitFspBinPath) + " is not found.") + exit(1) + +# +# Get the FSP-S / FSP-M-T FV Base Address from Flash Map +# +file = open (flashMapName, "r") +data = file.read () + +# Get the Flash Base Address +flashBase = int(data.split("FLASH_BASE")[1].split("=")[1].split()[0], 16) + +# Based on Build Target, select the section in the FlashMap file +flashmap = data + +# Get FSP-S & FSP-M & FSP-T offset & calculate the base +for line in flashmap.split("\n"): + if "PcdFlashFvFspSOffset" in line: + fspSBaseOffset = int(line.split("=")[1].split()[0], 16) + if "PcdFlashFvFspMOffset" in line: + fspMBaseOffset = int(line.split("=")[1].split()[0], 16) + if "PcdFlashFvFspTOffset" in line: + fspTBaseOffset = int(line.split("=")[1].split()[0], 16) +file.close() + +# +# Get FSP-M Size, in order to calculate the FSP-T Base. Used SplitFspBin.py script +# to dump the header, and get the ImageSize in FSP-M section +# +pythontool = 'python' +if 'PYTHON_HOME' in os.environ: + pythontool = os.environ['PYTHON_HOME'] + os.sep + 'python' +Process = subprocess.Popen([pythontool, splitFspBinPath, "info","-f",fspBinFilePath], stdout=subprocess.PIPE) +Output = Process.communicate()[0] +FsptInfo = Output.rsplit(b"FSP_M", 1); +for line in FsptInfo[1].split(b"\n"): + if b"ImageSize" in line: + fspMSize = int(line.split(b"=")[1], 16) + break + +# Calculate FSP-S/M/T base address, to which re-base has to be done +fspSBaseAddress = flashBase + fspSBaseOffset + fvOffset +fspMBaseAddress = flashBase + fspMBaseOffset +fspTBaseAddress = flashBase + fspTBaseOffset + +# +# Re-base FSP bin file to new address and save it as fspBinFileRebased using SplitFspBin.py +# +rebaseArguments = fspBinFilePath + " -c s m t -b " + str(hex(fspSBaseAddress).rstrip("L")) + " " + str(hex(fspMBaseAddress).rstrip("L")) + " " + str(hex(fspTBaseAddress).rstrip("L")) + " -o" + fspBinPath + " -n " + fspBinFileRebased +os.system(pythontool + " " + splitFspBinPath + " rebase -f" + rebaseArguments) + +# +# Split FSP bin to FSP-S/M/T segments +# +splitArguments = fspBinPath + os.sep + fspBinFileRebased + " -o " + fspBinPath + " -n Fsp_Rebased.fd" +os.system(pythontool + " " + splitFspBinPath + " split -f" + splitArguments) + +exit(0) -- 2.13.3.windows.1