From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by mx.groups.io with SMTP id smtpd.web10.6120.1631261195123396871 for ; Fri, 10 Sep 2021 01:06:35 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.24, mailfrom: dun.tan@intel.com) X-IronPort-AV: E=McAfee;i="6200,9189,10102"; a="221056161" X-IronPort-AV: E=Sophos;i="5.85,282,1624345200"; d="scan'208";a="221056161" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Sep 2021 01:06:33 -0700 X-IronPort-AV: E=Sophos;i="5.85,282,1624345200"; d="scan'208";a="540339773" Received: from duntan-mobl.ccr.corp.intel.com ([10.238.1.156]) by fmsmga003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Sep 2021 01:06:31 -0700 From: "duntan" To: devel@edk2.groups.io Cc: Guo Dong , Ray Ni , Maurice Ma , Benjamin You , Zhiguang Liu Subject: [PATCH] UefiPayloadPkg: Add script to build UniversalPayload in UefiPayloadPkg Date: Fri, 10 Sep 2021 16:06:00 +0800 Message-Id: <20210910080600.174-1-dun.tan@intel.com> X-Mailer: git-send-email 2.31.1.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Add script to build UniversalPayload, which can be used after edksetup rebuild The final UPL.elf will be located at root folder of edk2 Cc: Guo Dong Cc: Ray Ni Cc: Maurice Ma Cc: Benjamin You Cc: Zhiguang Liu Signed-off-by: Dun Tan --- UefiPayloadPkg/UniversalPayloadBuild.py | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/UefiPayloadPkg/UniversalPayloadBuild.py b/UefiPayloadPkg/UniversalPayloadBuild.py new file mode 100644 index 0000000000..9bcc4e77a0 --- /dev/null +++ b/UefiPayloadPkg/UniversalPayloadBuild.py @@ -0,0 +1,95 @@ +## @file +# This file contains the script to build UniversalPayload +# +# Copyright (c) 2021, Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +import argparse +import subprocess +import os +import shutil +import sys + +def RunCommand(cmd): + print(cmd) + p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,cwd=os.environ['WORKSPACE']) + while True: + line = p.stdout.readline() + if not line: + break + print(line.strip().decode(errors='ignore')) + + p.communicate() + if p.returncode != 0: + print("- Failed - error happened when run command: %s"%cmd) + raise Exception("ERROR: when run command: %s"%cmd) + +def BuildUniversalPayload(args, MacroList): + build_target = args.Target + tool_chain_tag = args.ToolChain + elf_tool_chain = 'CLANGDWARF' + entry_module_inf = os.path.join("UefiPayloadPkg", "UefiPayloadEntry", "UniversalPayloadEntry.inf") + fv = os.path.join(os.environ['WORKSPACE'], "Build", "UefiPayloadPkgX64", "%s_%s"%(build_target, tool_chain_tag), "FV", "DXEFV.Fv") + entry = os.path.join(os.environ['WORKSPACE'], "Build", "UefiPayloadPkgX64", "%s_%s"%(build_target, elf_tool_chain), "X64", "UefiPayloadPkg", "UefiPayloadEntry", "UniversalPayloadEntry", "DEBUG", "UniversalPayloadEntry.dll") + dsc_patch = os.path.join("UefiPayloadPkg", "UefiPayloadPkg.dsc") + + if "CLANG_BIN" in os.environ: + llvm_objcopy_path = os.path.join(os.environ["CLANG_BIN"],"llvm-objcopy") + else: + llvm_objcopy_path = "llvm-objcopy" + try: + RunCommand('"%s" --version'%llvm_objcopy_path) + except: + print("- Failed - Please check if LLVM is installed or if CLANG_BIN is set correctly") + sys.exit(1) + + macro_list = " " + for key in MacroList: + macro_list +="-D {0}={1} ".format(key, MacroList[key]) + + # + # Building DXE core and DXE drivers as DXEFV. + # + build_payload = "build -p %s -b %s -a X64 -t %s -y UplBuildReport.txt"%(dsc_patch, build_target, tool_chain_tag) + build_payload += macro_list + RunCommand(build_payload) + # + # Building Universal Payload entry. + # + build_module = "build -p %s -b %s -a X64 -m %s -t %s -y UplBuildReportEntry.txt"%(dsc_patch, build_target, entry_module_inf, elf_tool_chain) + build_module += macro_list + RunCommand(build_module) + + # + # Copy the DXEFV as a section in elf format Universal Payload entry. + # + remove_section = '"%s" -I elf64-x86-64 -O elf64-x86-64 --remove-section .upld.uefi_fv %s'%(llvm_objcopy_path,entry) + add_section = '"%s" -I elf64-x86-64 -O elf64-x86-64 --add-section .upld.uefi_fv=%s %s'%(llvm_objcopy_path,fv,entry) + set_section = '"%s" -I elf64-x86-64 -O elf64-x86-64 --set-section-alignment .upld.uefi_fv=16 %s'%(llvm_objcopy_path,entry) + RunCommand(remove_section) + RunCommand(add_section) + RunCommand(set_section) + + shutil.copy (entry, os.path.join(os.environ['WORKSPACE'], 'UPL.elf')) + +def main(): + print ("Begin to build Universal Payload...") + parser = argparse.ArgumentParser(description='For build Universal Payload') + parser.add_argument('-t', '--ToolChain', help="Using the ToolChain to build the UniversalPayload") + parser.add_argument('-b', '--Target', help="Using the TARGET to build the UniversalPayload") + parser.add_argument("-D", "--Macro", action="append", help="Macro: \"Name [= Value]\".") + MacroList = {} + args = parser.parse_args() + if args.Macro is not None: + for argument in args.Macro: + if argument.count('=') != 1: + print("Unknown variable passed in: %s"%argument) + raise Exception("ERROR: Unknown variable passed in: %s"%argument) + tokens = argument.strip().split('=') + MacroList[tokens[0].upper()] = tokens[1] + BuildUniversalPayload(args, MacroList) + print ("Successfully build Universal Payload") + +if __name__ == '__main__': + main() -- 2.31.1.windows.1