blob: c3a6e176c85b27bdf285e6ee4610a2aa996091db [file] [log] [blame]
# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//build/board.gni")
import("//build/config/fuchsia/zbi.gni")
import("//build/images/args.gni")
import("//build/images/boot.gni")
import("//build/images/bootfs_manifest_additions.gni")
import("//build/images/custom_signing.gni")
import("//build/images/custom_signing.gni")
import("//build/images/manifest.gni")
import("//build/images/ta.gni")
import("//build/images/vbmeta.gni")
import("//build/images/zedboot/zedboot_args.gni")
import("//build/images/zxcrypt.gni")
# Construct a minimal manifest containing only the few user binaries
# that constitute zedboot, and the libraries they depend on.
# TODO(36888): This could be made smaller by constraining the drivers
# included, but we don't currently have a good way to determine the
# subset that is useful to Zedboot.
zedboot_binary_patterns = [
# These are the core things needed for booting (local and netboot).
"bin/bootsvc",
"bin/console",
"bin/device-name-provider",
"bin/dlog",
"bin/fshost",
"bin/miscsvc",
"bin/netsvc",
"bin/ptysvc",
"bin/pwrbtn-monitor",
"bin/svchost",
"bin/virtual-console",
"driver/*",
# These are needed for installer runs.
"bin/blobfs",
"bin/install-disk-image",
"bin/minfs",
"bin/mount",
# These are useful for debugging.
"bin/dd",
"bin/driverctl",
"bin/fsck*",
"bin/gpt",
"bin/killall",
"bin/ktrace",
"bin/lsblk",
"bin/lsdev",
"bin/lsusb",
"bin/mkfs*",
"bin/nand-util",
"bin/ping",
"bin/ps",
"bin/sh",
"bin/syscall-check",
"bin/umount",
"bin/unbind",
# These are used by Infra.
"bin/waitfor",
]
generate_manifest("zedboot.manifest") {
visibility = [ ":*" ]
args = []
foreach(pattern, zedboot_binary_patterns) {
args += [ "--binary=" + pattern ]
}
# The --binary switch only matches binaries, not other files.
# Get the non-binary files from the manifest directly.
args += [ "--include=lib/firmware/*" ]
deps = zircon_boot_manifests_deps
foreach(manifest, zircon_boot_manifests) {
args += [
"--cwd=.",
"--manifest=" + rebase_path(manifest, root_build_dir),
]
}
# Inject virtcon into zedboot.
# TODO(41410): Remove when unified build exists.
deps += [ "//src/bringup/virtcon:virtual-console" ]
args += [ "--entry=bin/virtual-console=" +
rebase_path("$root_build_dir/virtual-console", root_build_dir) ]
}
manifest_outputs = get_target_outputs(":zedboot.manifest")
manifest_file = manifest_outputs[0]
action("devmgr_config.txt") {
visibility = [
":zbi",
":zedboot.vbmeta",
":zedboot.vbmeta__zbi_props",
":zedboot.vbmeta__vb_desc",
]
script = "../manifest.py"
outputs = [ "$target_out_dir/$target_name" ]
args = [ "--output=" + rebase_path(outputs[0], root_build_dir) ]
entries = [
"netsvc.netboot=true",
"netsvc.all-features=true",
] + zedboot_devmgr_config
foreach(entry, entries) {
args += [ "--entry=$entry" ]
}
}
generated_file("zxcrypt_config.txt") {
outputs = [ "$target_out_dir/$target_name" ]
contents = zxcrypt_key_source
}
bootfs_manifest_additions += [ "//src/sys/installer:installer.manifest" ]
additional_manifests = []
foreach(label, bootfs_manifest_additions) {
target_dir = get_label_info(label, "target_out_dir")
target_name = get_label_info(label, "name")
additional_manifests += [ target_dir + "/" + target_name ]
}
# Note: This output is also used by a script in //scripts/verify_cmdline_params.
zbi("zbi") {
output_name = "zedboot"
deps = [
":devmgr_config.txt",
":zedboot.manifest",
":zxcrypt_config.txt",
] + bootfs_manifest_additions
inputs = [
zircon_kernel_zbi,
manifest_file,
] + additional_manifests
manifest =
[ "config/zxcrypt=" +
rebase_path("$target_out_dir/zxcrypt_config.txt", root_build_dir) ]
foreach(ta_uuid, zedboot_ta_uuids) {
manifest += [
{
outputs = [ "lib/firmware/$ta_uuid$ta_dest_suffix" ]
sources = [ rebase_path("$ta_path/$ta_uuid$ta_src_suffix") ]
},
]
}
if (!include_devmgr_config_in_vbmeta) {
manifest += [
{
outputs = [ "config/devmgr" ]
sources = get_target_outputs(":devmgr_config.txt")
},
]
}
cmdline = [
"console.shell=true",
"netsvc.disable=false",
"kernel.enable-debugging-syscalls=true",
"kernel.enable-serial-syscalls=true",
] + zedboot_cmdline_args + board_zedboot_cmdline_args
cmdline_inputs = zedboot_cmdline_files
metadata = {
images = [
{
if (custom_signing_script == "" && !use_vboot) {
archive = true
bootserver_pave = [ "--zirconr" ]
bootserver_pave_zedboot = [ "--zircona" ]
}
name = "zircon-r"
path = "zedboot.zbi"
type = "zbi"
},
]
image_paths = [
"IMAGE_ZEDBOOT_ZBI=zedboot.zbi",
"IMAGE_ZIRCONR_ZBI=zedboot.zbi",
]
}
}
if (custom_signing_script != "") {
custom_signed_zbi("signed") {
output_name = "zedboot.zbi"
deps = [ ":zbi" ]
zbi = get_target_outputs(":zbi")
metadata = {
images = [
{
archive = true
bootserver_pave = [ "--zirconr" ]
bootserver_pave_zedboot = [ "--zircona" ]
name = "zircon-r.signed"
path = "zedboot.zbi.signed"
type = "zbi.signed"
},
]
image_paths = [ "IMAGE_ZIRCONR_SIGNEDZBI=zedboot.zbi.signed" ]
}
}
} else if (use_vboot) {
vboot("signed") {
output_name = "zedboot"
deps = [ ":zbi" ]
metadata = {
images = [
{
archive = true
bootserver_pave = [ "--zirconr" ]
bootserver_pave_zedboot = [ "--zircona" ]
name = "zircon-r.signed"
path = "zedboot.vboot"
type = "zbi.signed"
},
]
image_paths = [ "IMAGE_ZIRCONR_SIGNEDZBI=zedboot.vboot" ]
}
}
}
if (use_vbmeta) {
vbmeta("zedboot.vbmeta") {
output_name = "zedboot"
testonly = true
if (custom_signing_script != "") {
deps = [ ":signed" ]
zbi = get_target_outputs(":signed")
} else {
deps = [ ":zbi" ]
zbi = get_target_outputs(":zbi")
}
if (include_devmgr_config_in_vbmeta) {
deps += [ ":devmgr_config.txt" ]
boot_args_file = get_target_outputs(":devmgr_config.txt")
# expecting a single file
assert([ boot_args_file[0] ] == boot_args_file,
"expect a single output file form 'devmgr_config.txt' target")
prop_from_file = [
{
# zbi item type w/o ZBI_TYPE_ prefix
type = "IMAGE_ARGS"
file = boot_args_file[0]
},
]
}
metadata = {
images = [
{
archive = true
bootserver_pave = [ "--vbmetar" ]
bootserver_pave_zedboot = [ "--vbmetaa" ]
name = "zircon-r"
path = "zedboot.vbmeta"
type = "vbmeta"
},
]
image_paths = [ "IMAGE_VBMETAR_RAW=zedboot.vbmeta" ]
}
}
}
if (target_cpu != "arm64" && !use_vboot) {
esp("esp") {
output_name = "zedboot"
cmdline = "efi_cmdline.txt"
deps = [ ":zbi" ]
zedboot_zbi_outputs = get_target_outputs(":zbi")
zedboot = zedboot_zbi_outputs[0]
metadata = {
images = [
{
name = "zedboot-efi"
path = "zedboot.esp.blk"
type = "blk"
},
]
image_paths = [ "IMAGE_ZEDBOOT_ESP=zedboot.esp.blk" ]
}
}
}
group("zedboot") {
deps = [ ":zbi" ]
if (target_cpu != "arm64" && !use_vboot) {
deps += [ ":esp" ]
}
if (custom_signing_script != "" || use_vboot) {
deps += [ ":signed" ]
}
}