]>
git.proxmox.com Git - mirror_edk2.git/blob - UefiPayloadPkg/UniversalPayloadBuild.py
6003de36d13915a42e265834ddd0d8969f7ef53a
2 # This file contains the script to build UniversalPayload
4 # Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
5 # SPDX-License-Identifier: BSD-2-Clause-Patent
15 sys
.dont_write_bytecode
= True
17 class UPLD_INFO_HEADER(LittleEndianStructure
):
20 ('Identifier', ARRAY(c_char
, 4)),
21 ('HeaderLength', c_uint32
),
22 ('SpecRevision', c_uint16
),
23 ('Reserved', c_uint16
),
24 ('Revision', c_uint32
),
25 ('Attribute', c_uint32
),
26 ('Capability', c_uint32
),
27 ('ProducerId', ARRAY(c_char
, 16)),
28 ('ImageId', ARRAY(c_char
, 16)),
32 self
.Identifier
= b
'PLDH'
33 self
.HeaderLength
= sizeof(UPLD_INFO_HEADER
)
34 self
.SpecRevision
= 0x0007
35 self
.Revision
= 0x0000010105
36 self
.ImageId
= b
'UEFI'
37 self
.ProducerId
= b
'INTEL'
41 p
= subprocess
.Popen(cmd
, shell
=True, stdout
=subprocess
.PIPE
, stderr
=subprocess
.STDOUT
,cwd
=os
.environ
['WORKSPACE'])
43 line
= p
.stdout
.readline()
46 print(line
.strip().decode(errors
='ignore'))
50 print("- Failed - error happened when run command: %s"%cmd
)
51 raise Exception("ERROR: when run command: %s"%cmd
)
53 def BuildUniversalPayload(Args
, MacroList
):
54 BuildTarget
= Args
.Target
55 ToolChain
= Args
.ToolChain
56 Quiet
= "--quiet" if Args
.Quiet
else ""
57 ElfToolChain
= 'CLANGDWARF'
58 BuildDir
= os
.path
.join(os
.environ
['WORKSPACE'], os
.path
.normpath("Build/UefiPayloadPkgX64"))
59 if Args
.Arch
== 'X64':
61 ObjCopyFlag
= "elf64-x86-64"
62 EntryOutputDir
= os
.path
.join(BuildDir
, "{}_{}".format (BuildTarget
, ElfToolChain
), os
.path
.normpath("X64/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry/DEBUG/UniversalPayloadEntry.dll"))
64 BuildArch
= "IA32 -a X64"
65 ObjCopyFlag
= "elf32-i386"
66 EntryOutputDir
= os
.path
.join(BuildDir
, "{}_{}".format (BuildTarget
, ElfToolChain
), os
.path
.normpath("IA32/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry/DEBUG/UniversalPayloadEntry.dll"))
68 EntryModuleInf
= os
.path
.normpath("UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf")
69 DscPath
= os
.path
.normpath("UefiPayloadPkg/UefiPayloadPkg.dsc")
70 FvOutputDir
= os
.path
.join(BuildDir
, "{}_{}".format (BuildTarget
, ToolChain
), os
.path
.normpath("FV/DXEFV.Fv"))
71 PayloadReportPath
= os
.path
.join(BuildDir
, "UefiUniversalPayload.txt")
72 ModuleReportPath
= os
.path
.join(BuildDir
, "UefiUniversalPayloadEntry.txt")
73 UpldInfoFile
= os
.path
.join(BuildDir
, "UniversalPayloadInfo.bin")
75 if "CLANG_BIN" in os
.environ
:
76 LlvmObjcopyPath
= os
.path
.join(os
.environ
["CLANG_BIN"], "llvm-objcopy")
78 LlvmObjcopyPath
= "llvm-objcopy"
80 RunCommand('"%s" --version'%LlvmObjcopyPath
)
82 print("- Failed - Please check if LLVM is installed or if CLANG_BIN is set correctly")
86 if (Args
.pcd
!= None):
87 for PcdItem
in Args
.pcd
:
88 Pcds
+= " --pcd {}".format (PcdItem
)
92 Defines
+=" -D {0}={1}".format(key
, MacroList
[key
])
95 # Building DXE core and DXE drivers as DXEFV.
97 BuildPayload
= "build -p {} -b {} -a X64 -t {} -y {} {}".format (DscPath
, BuildTarget
, ToolChain
, PayloadReportPath
, Quiet
)
99 BuildPayload
+= Defines
100 RunCommand(BuildPayload
)
102 # Building Universal Payload entry.
104 BuildModule
= "build -p {} -b {} -a {} -m {} -t {} -y {} {}".format (DscPath
, BuildTarget
, BuildArch
, EntryModuleInf
, ElfToolChain
, ModuleReportPath
, Quiet
)
106 BuildModule
+= Defines
107 RunCommand(BuildModule
)
110 # Buid Universal Payload Information Section ".upld_info"
112 upld_info_hdr
= UPLD_INFO_HEADER()
113 upld_info_hdr
.ImageId
= Args
.ImageId
.encode()[:16]
114 upld_info_hdr
.Attribute |
= 1 if BuildTarget
== "DEBUG" else 0
115 fp
= open(UpldInfoFile
, 'wb')
116 fp
.write(bytearray(upld_info_hdr
))
120 # Copy the DXEFV as a section in elf format Universal Payload entry.
122 remove_section
= '"{}" -I {} -O {} --remove-section .upld_info --remove-section .upld.uefi_fv {}'.format (
128 add_section
= '"{}" -I {} -O {} --add-section .upld_info={} --add-section .upld.uefi_fv={} {}'.format (
136 set_section
= '"{}" -I {} -O {} --set-section-alignment .upld.upld_info=16 --set-section-alignment .upld.uefi_fv=16 {}'.format (
142 RunCommand(remove_section
)
143 RunCommand(add_section
)
144 RunCommand(set_section
)
146 shutil
.copy (EntryOutputDir
, os
.path
.join(BuildDir
, 'UniversalPayload.elf'))
149 parser
= argparse
.ArgumentParser(description
='For building Universal Payload')
150 parser
.add_argument('-t', '--ToolChain')
151 parser
.add_argument('-b', '--Target', default
='DEBUG')
152 parser
.add_argument('-a', '--Arch', choices
=['IA32', 'X64'], help='Specify the ARCH for payload entry module. Default build X64 image.', default
='X64')
153 parser
.add_argument("-D", "--Macro", action
="append", default
=["UNIVERSAL_PAYLOAD=TRUE"])
154 parser
.add_argument('-i', '--ImageId', type=str, help='Specify payload ID (16 bytes maximal).', default
='UEFI')
155 parser
.add_argument('-q', '--Quiet', action
='store_true', help='Disable all build messages except FATAL ERRORS.')
156 parser
.add_argument("-p", "--pcd", action
="append")
158 args
= parser
.parse_args()
159 if args
.Macro
is not None:
160 for Argument
in args
.Macro
:
161 if Argument
.count('=') != 1:
162 print("Unknown variable passed in: %s"%Argument
)
163 raise Exception("ERROR: Unknown variable passed in: %s"%Argument
)
164 tokens
= Argument
.strip().split('=')
165 MacroList
[tokens
[0].upper()] = tokens
[1]
166 BuildUniversalPayload(args
, MacroList
)
167 print ("Successfully build Universal Payload")
169 if __name__
== '__main__':