]>
Commit | Line | Data |
---|---|---|
f4e72cf9 TD |
1 | ## @file\r |
2 | # This file contains the script to build UniversalPayload\r | |
3 | #\r | |
4 | # Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>\r | |
5 | # SPDX-License-Identifier: BSD-2-Clause-Patent\r | |
6 | ##\r | |
7 | \r | |
8 | import argparse\r | |
9 | import subprocess\r | |
10 | import os\r | |
11 | import shutil\r | |
12 | import sys\r | |
4a1899dd GD |
13 | from ctypes import *\r |
14 | \r | |
15 | sys.dont_write_bytecode = True\r | |
16 | \r | |
17 | class UPLD_INFO_HEADER(LittleEndianStructure):\r | |
18 | _pack_ = 1\r | |
19 | _fields_ = [\r | |
20 | ('Identifier', ARRAY(c_char, 4)),\r | |
21 | ('HeaderLength', c_uint32),\r | |
22 | ('SpecRevision', c_uint16),\r | |
23 | ('Reserved', c_uint16),\r | |
24 | ('Revision', c_uint32),\r | |
25 | ('Attribute', c_uint32),\r | |
26 | ('Capability', c_uint32),\r | |
27 | ('ProducerId', ARRAY(c_char, 16)),\r | |
28 | ('ImageId', ARRAY(c_char, 16)),\r | |
29 | ]\r | |
30 | \r | |
31 | def __init__(self):\r | |
b4be5f05 | 32 | self.Identifier = b'PLDH'\r |
4a1899dd | 33 | self.HeaderLength = sizeof(UPLD_INFO_HEADER)\r |
dac2fc81 | 34 | self.SpecRevision = 0x0007\r |
4a1899dd GD |
35 | self.Revision = 0x0000010105\r |
36 | self.ImageId = b'UEFI'\r | |
37 | self.ProducerId = b'INTEL'\r | |
f4e72cf9 TD |
38 | \r |
39 | def RunCommand(cmd):\r | |
40 | print(cmd)\r | |
41 | p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,cwd=os.environ['WORKSPACE'])\r | |
42 | while True:\r | |
43 | line = p.stdout.readline()\r | |
44 | if not line:\r | |
45 | break\r | |
46 | print(line.strip().decode(errors='ignore'))\r | |
47 | \r | |
48 | p.communicate()\r | |
49 | if p.returncode != 0:\r | |
50 | print("- Failed - error happened when run command: %s"%cmd)\r | |
51 | raise Exception("ERROR: when run command: %s"%cmd)\r | |
52 | \r | |
53 | def BuildUniversalPayload(Args, MacroList):\r | |
54 | BuildTarget = Args.Target\r | |
55 | ToolChain = Args.ToolChain\r | |
4cfb28f1 | 56 | Quiet = "--quiet" if Args.Quiet else ""\r |
f4e72cf9 | 57 | ElfToolChain = 'CLANGDWARF'\r |
2306555b TD |
58 | BuildDir = os.path.join(os.environ['WORKSPACE'], os.path.normpath("Build/UefiPayloadPkgX64"))\r |
59 | if Args.Arch == 'X64':\r | |
60 | BuildArch = "X64"\r | |
61 | ObjCopyFlag = "elf64-x86-64"\r | |
62 | EntryOutputDir = os.path.join(BuildDir, f"{BuildTarget}_{ElfToolChain}", os.path.normpath("X64/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry/DEBUG/UniversalPayloadEntry.dll"))\r | |
63 | else:\r | |
64 | BuildArch = "IA32 -a X64"\r | |
65 | ObjCopyFlag = "elf32-i386"\r | |
66 | EntryOutputDir = os.path.join(BuildDir, f"{BuildTarget}_{ElfToolChain}", os.path.normpath("IA32/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry/DEBUG/UniversalPayloadEntry.dll"))\r | |
f4e72cf9 TD |
67 | \r |
68 | EntryModuleInf = os.path.normpath("UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf")\r | |
69 | DscPath = os.path.normpath("UefiPayloadPkg/UefiPayloadPkg.dsc")\r | |
f4e72cf9 | 70 | FvOutputDir = os.path.join(BuildDir, f"{BuildTarget}_{ToolChain}", os.path.normpath("FV/DXEFV.Fv"))\r |
f4e72cf9 TD |
71 | PayloadReportPath = os.path.join(BuildDir, "UefiUniversalPayload.txt")\r |
72 | ModuleReportPath = os.path.join(BuildDir, "UefiUniversalPayloadEntry.txt")\r | |
4a1899dd | 73 | UpldInfoFile = os.path.join(BuildDir, "UniversalPayloadInfo.bin")\r |
f4e72cf9 TD |
74 | \r |
75 | if "CLANG_BIN" in os.environ:\r | |
76 | LlvmObjcopyPath = os.path.join(os.environ["CLANG_BIN"], "llvm-objcopy")\r | |
77 | else:\r | |
78 | LlvmObjcopyPath = "llvm-objcopy"\r | |
79 | try:\r | |
80 | RunCommand('"%s" --version'%LlvmObjcopyPath)\r | |
81 | except:\r | |
82 | print("- Failed - Please check if LLVM is installed or if CLANG_BIN is set correctly")\r | |
83 | sys.exit(1)\r | |
84 | \r | |
85 | Defines = ""\r | |
86 | for key in MacroList:\r | |
87 | Defines +=" -D {0}={1}".format(key, MacroList[key])\r | |
88 | \r | |
89 | #\r | |
90 | # Building DXE core and DXE drivers as DXEFV.\r | |
91 | #\r | |
dab96cf0 | 92 | BuildPayload = f"build -p {DscPath} -b {BuildTarget} -a X64 -t {ToolChain} -y {PayloadReportPath} {Quiet}"\r |
f4e72cf9 TD |
93 | BuildPayload += Defines\r |
94 | RunCommand(BuildPayload)\r | |
95 | #\r | |
96 | # Building Universal Payload entry.\r | |
97 | #\r | |
dab96cf0 | 98 | BuildModule = f"build -p {DscPath} -b {BuildTarget} -a {BuildArch} -m {EntryModuleInf} -t {ElfToolChain} -y {ModuleReportPath} {Quiet}"\r |
f4e72cf9 TD |
99 | BuildModule += Defines\r |
100 | RunCommand(BuildModule)\r | |
101 | \r | |
4a1899dd GD |
102 | #\r |
103 | # Buid Universal Payload Information Section ".upld_info"\r | |
104 | #\r | |
105 | upld_info_hdr = UPLD_INFO_HEADER()\r | |
106 | upld_info_hdr.ImageId = Args.ImageId.encode()[:16]\r | |
107 | fp = open(UpldInfoFile, 'wb')\r | |
108 | fp.write(bytearray(upld_info_hdr))\r | |
109 | fp.close()\r | |
110 | \r | |
f4e72cf9 TD |
111 | #\r |
112 | # Copy the DXEFV as a section in elf format Universal Payload entry.\r | |
113 | #\r | |
1a6c8376 TD |
114 | remove_section = f'"{LlvmObjcopyPath}" -I {ObjCopyFlag} -O {ObjCopyFlag} --remove-section .upld_info --remove-section .upld.uefi_fv {EntryOutputDir}'\r |
115 | add_section = f'"{LlvmObjcopyPath}" -I {ObjCopyFlag} -O {ObjCopyFlag} --add-section .upld_info={UpldInfoFile} --add-section .upld.uefi_fv={FvOutputDir} {EntryOutputDir}'\r | |
116 | set_section = f'"{LlvmObjcopyPath}" -I {ObjCopyFlag} -O {ObjCopyFlag} --set-section-alignment .upld.upld_info=16 --set-section-alignment .upld.uefi_fv=16 {EntryOutputDir}'\r | |
f4e72cf9 TD |
117 | RunCommand(remove_section)\r |
118 | RunCommand(add_section)\r | |
119 | RunCommand(set_section)\r | |
120 | \r | |
121 | shutil.copy (EntryOutputDir, os.path.join(BuildDir, 'UniversalPayload.elf'))\r | |
122 | \r | |
123 | def main():\r | |
124 | parser = argparse.ArgumentParser(description='For building Universal Payload')\r | |
125 | parser.add_argument('-t', '--ToolChain')\r | |
126 | parser.add_argument('-b', '--Target', default='DEBUG')\r | |
67608430 | 127 | parser.add_argument('-a', '--Arch', choices=['IA32', 'X64'], help='Specify the ARCH for payload entry module. Default build X64 image.', default ='X64')\r |
f4e72cf9 | 128 | parser.add_argument("-D", "--Macro", action="append", default=["UNIVERSAL_PAYLOAD=TRUE"])\r |
4a1899dd | 129 | parser.add_argument('-i', '--ImageId', type=str, help='Specify payload ID (16 bytes maximal).', default ='UEFI')\r |
4cfb28f1 | 130 | parser.add_argument('-q', '--Quiet', action='store_true', help='Disable all build messages except FATAL ERRORS.')\r |
f4e72cf9 TD |
131 | MacroList = {}\r |
132 | args = parser.parse_args()\r | |
133 | if args.Macro is not None:\r | |
134 | for Argument in args.Macro:\r | |
135 | if Argument.count('=') != 1:\r | |
136 | print("Unknown variable passed in: %s"%Argument)\r | |
137 | raise Exception("ERROR: Unknown variable passed in: %s"%Argument)\r | |
138 | tokens = Argument.strip().split('=')\r | |
139 | MacroList[tokens[0].upper()] = tokens[1]\r | |
140 | BuildUniversalPayload(args, MacroList)\r | |
141 | print ("Successfully build Universal Payload")\r | |
142 | \r | |
143 | if __name__ == '__main__':\r | |
144 | main()\r |