]>
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 | |
2aee08c0 | 62 | EntryOutputDir = os.path.join(BuildDir, "{}_{}".format (BuildTarget, ElfToolChain), os.path.normpath("X64/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry/DEBUG/UniversalPayloadEntry.dll"))\r |
2306555b TD |
63 | else:\r |
64 | BuildArch = "IA32 -a X64"\r | |
65 | ObjCopyFlag = "elf32-i386"\r | |
2aee08c0 | 66 | EntryOutputDir = os.path.join(BuildDir, "{}_{}".format (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 | |
2aee08c0 | 70 | FvOutputDir = os.path.join(BuildDir, "{}_{}".format (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 | |
cfe16514 GG |
85 | Pcds = ""\r |
86 | if (Args.pcd != None):\r | |
87 | for PcdItem in Args.pcd:\r | |
88 | Pcds += " --pcd {}".format (PcdItem)\r | |
89 | \r | |
f4e72cf9 TD |
90 | Defines = ""\r |
91 | for key in MacroList:\r | |
92 | Defines +=" -D {0}={1}".format(key, MacroList[key])\r | |
93 | \r | |
94 | #\r | |
95 | # Building DXE core and DXE drivers as DXEFV.\r | |
96 | #\r | |
2aee08c0 | 97 | BuildPayload = "build -p {} -b {} -a X64 -t {} -y {} {}".format (DscPath, BuildTarget, ToolChain, PayloadReportPath, Quiet)\r |
cfe16514 | 98 | BuildPayload += Pcds\r |
f4e72cf9 TD |
99 | BuildPayload += Defines\r |
100 | RunCommand(BuildPayload)\r | |
101 | #\r | |
102 | # Building Universal Payload entry.\r | |
103 | #\r | |
2aee08c0 | 104 | BuildModule = "build -p {} -b {} -a {} -m {} -t {} -y {} {}".format (DscPath, BuildTarget, BuildArch, EntryModuleInf, ElfToolChain, ModuleReportPath, Quiet)\r |
cfe16514 | 105 | BuildModule += Pcds\r |
f4e72cf9 TD |
106 | BuildModule += Defines\r |
107 | RunCommand(BuildModule)\r | |
108 | \r | |
4a1899dd GD |
109 | #\r |
110 | # Buid Universal Payload Information Section ".upld_info"\r | |
111 | #\r | |
112 | upld_info_hdr = UPLD_INFO_HEADER()\r | |
113 | upld_info_hdr.ImageId = Args.ImageId.encode()[:16]\r | |
21e6ef75 | 114 | upld_info_hdr.Attribute |= 1 if BuildTarget == "DEBUG" else 0\r |
4a1899dd GD |
115 | fp = open(UpldInfoFile, 'wb')\r |
116 | fp.write(bytearray(upld_info_hdr))\r | |
117 | fp.close()\r | |
118 | \r | |
f4e72cf9 TD |
119 | #\r |
120 | # Copy the DXEFV as a section in elf format Universal Payload entry.\r | |
121 | #\r | |
2aee08c0 KL |
122 | remove_section = '"{}" -I {} -O {} --remove-section .upld_info --remove-section .upld.uefi_fv {}'.format (\r |
123 | LlvmObjcopyPath,\r | |
124 | ObjCopyFlag,\r | |
125 | ObjCopyFlag,\r | |
126 | EntryOutputDir\r | |
127 | )\r | |
128 | add_section = '"{}" -I {} -O {} --add-section .upld_info={} --add-section .upld.uefi_fv={} {}'.format (\r | |
129 | LlvmObjcopyPath,\r | |
130 | ObjCopyFlag,\r | |
131 | ObjCopyFlag,\r | |
132 | UpldInfoFile,\r | |
133 | FvOutputDir,\r | |
134 | EntryOutputDir\r | |
135 | )\r | |
136 | set_section = '"{}" -I {} -O {} --set-section-alignment .upld.upld_info=16 --set-section-alignment .upld.uefi_fv=16 {}'.format (\r | |
137 | LlvmObjcopyPath,\r | |
138 | ObjCopyFlag,\r | |
139 | ObjCopyFlag,\r | |
140 | EntryOutputDir\r | |
141 | )\r | |
f4e72cf9 TD |
142 | RunCommand(remove_section)\r |
143 | RunCommand(add_section)\r | |
144 | RunCommand(set_section)\r | |
145 | \r | |
146 | shutil.copy (EntryOutputDir, os.path.join(BuildDir, 'UniversalPayload.elf'))\r | |
147 | \r | |
148 | def main():\r | |
149 | parser = argparse.ArgumentParser(description='For building Universal Payload')\r | |
150 | parser.add_argument('-t', '--ToolChain')\r | |
151 | parser.add_argument('-b', '--Target', default='DEBUG')\r | |
67608430 | 152 | parser.add_argument('-a', '--Arch', choices=['IA32', 'X64'], help='Specify the ARCH for payload entry module. Default build X64 image.', default ='X64')\r |
f4e72cf9 | 153 | parser.add_argument("-D", "--Macro", action="append", default=["UNIVERSAL_PAYLOAD=TRUE"])\r |
4a1899dd | 154 | parser.add_argument('-i', '--ImageId', type=str, help='Specify payload ID (16 bytes maximal).', default ='UEFI')\r |
4cfb28f1 | 155 | parser.add_argument('-q', '--Quiet', action='store_true', help='Disable all build messages except FATAL ERRORS.')\r |
cfe16514 | 156 | parser.add_argument("-p", "--pcd", action="append")\r |
f4e72cf9 TD |
157 | MacroList = {}\r |
158 | args = parser.parse_args()\r | |
159 | if args.Macro is not None:\r | |
160 | for Argument in args.Macro:\r | |
161 | if Argument.count('=') != 1:\r | |
162 | print("Unknown variable passed in: %s"%Argument)\r | |
163 | raise Exception("ERROR: Unknown variable passed in: %s"%Argument)\r | |
164 | tokens = Argument.strip().split('=')\r | |
165 | MacroList[tokens[0].upper()] = tokens[1]\r | |
166 | BuildUniversalPayload(args, MacroList)\r | |
167 | print ("Successfully build Universal Payload")\r | |
168 | \r | |
169 | if __name__ == '__main__':\r | |
170 | main()\r |