blob: 3bb51e3f74ce07d96f0005897e9ec67cbc7486f3 [file] [log] [blame]
# Copyright 2021 The Fuchsia Authors
#
# Use of this source code is governed by a MIT-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/MIT
import("//build/images/args.gni")
import("//build/test.gni")
import("//build/testing/zbi_test.gni")
import("//build/unification/global_variables.gni")
import("//zircon/kernel/phys/phys_executable.gni")
import("//zircon/kernel/phys/qemu.gni")
import("//zircon/kernel/phys/zbi_executable.gni")
group("boot-shim") {
deps = [
":linux-x86-boot-shim",
":multiboot-shim",
":pic-1mb-boot-shim",
":x86-1mb-boot-shim",
]
}
# This is a shim between a legacy 1M ZBI boot loader and a modern
# position-independent ZBI. It's just the plain ZBI boot shim but
# linked at the fixed 1M load address instead of linked at zero. Like
# that shim, it's simply a ZBI kernel item prepended to a bootable ZBI
# to make the shimmed bootable ZBI--in this case, the 1M protocol ZBI.
zbi_executable("x86-1mb-boot-shim") {
# The add, remove trick ensures these are removed, whether or not they're
# present in the default configs list.
configs += [ "//zircon/kernel/arch/x86/phys:load-1mb" ]
configs -= [ "//zircon/kernel/arch/x86/phys:load-1mb" ]
configs += [ "//zircon/kernel/phys:load-pic" ]
configs -= [ "//zircon/kernel/phys:load-pic" ]
# Now add the one we want.
configs += [ "//zircon/kernel/arch/x86/phys:load-1mb" ]
deps = [ "//zircon/kernel/phys/boot-shim:noop-boot-shim" ]
}
# This is the inverse shim: between a modern ZBI boot loader that
# supports only the position-independent protocol, and a legacy ZBI
# that must be loaded at the 1M fixed address. It's also just a ZBI
# kernel item prepended to a bootable ZBI to make the shimmed bootable
# ZBI--in this case, the position-independent protocol ZBI.
zbi_executable("pic-1mb-boot-shim") {
# The add, remove trick ensures these are removed, whether or not they're
# present in the default configs list.
configs += [ "//zircon/kernel/arch/x86/phys:load-1mb" ]
configs -= [ "//zircon/kernel/arch/x86/phys:load-1mb" ]
configs += [ "//zircon/kernel/phys:load-pic" ]
configs -= [ "//zircon/kernel/phys:load-pic" ]
# Now add the one we want.
configs += [ "//zircon/kernel/phys:load-pic" ]
sources = [ "pic-1mb-shim.cc" ]
deps = [
":trampoline-boot",
"//zircon/kernel/phys:main",
"//zircon/kernel/phys:symbolize",
"//zircon/kernel/phys:zbi-memory",
"//zircon/kernel/phys/lib/memalloc",
"//zircon/system/ulib/zbitl",
]
}
if (toolchain.environment == "kernel.phys" ||
toolchain.environment == "kernel.phys32") {
source_set("trampoline-boot") {
visibility = [
":*",
"//zircon/kernel/phys/*",
]
sources = [ "trampoline-boot.cc" ]
public = [ "trampoline-boot.h" ]
public_deps = [ "//zircon/kernel/phys:boot-zbi" ]
deps = [
"//zircon/kernel/lib/arch",
"//zircon/kernel/phys:symbolize",
"//zircon/kernel/phys/lib/memalloc",
]
}
}
zbi_executable("phys-1mb-hello-world") {
testonly = true
# The add, remove trick ensures these are removed, whether or not they're
# present in the default configs list.
configs += [ "//zircon/kernel/arch/x86/phys:load-1mb" ]
configs -= [ "//zircon/kernel/arch/x86/phys:load-1mb" ]
configs += [ "//zircon/kernel/phys:load-pic" ]
configs -= [ "//zircon/kernel/phys:load-pic" ]
# Now add the one we want.
configs += [ "//zircon/kernel/arch/x86/phys:load-1mb" ]
deps = [
"//zircon/kernel/phys/test:hello-world-test.source",
"//zircon/kernel/phys/test:zbi-test-main",
]
}
zbi_test("x86-boot-shim-tests") {
# The order matters here!
deps = [
# First, the 1M shim: boot loaders in use today support the 1M protocol.
":x86-1mb-boot-shim",
# Second, the 1M->PIC shim hands off to the PIC->1M shim.
":pic-1mb-boot-shim",
# Finally, the PIC->1M shim hands off to the 1M test program.
":phys-1mb-hello-world",
]
}
if (toolchain.environment == "kernel.phys32") {
source_set("legacy-boot-shim") {
sources = [
"legacy-boot-shim.cc",
"legacy-boot-shim.h",
]
deps = [
":stdout",
":trampoline-boot",
"..:address-space",
"..:legacy-boot",
"//zircon/kernel/lib/arch",
"//zircon/kernel/lib/boot-options",
"//zircon/kernel/phys:arch-header",
"//zircon/kernel/phys:main",
"//zircon/kernel/phys:symbolize",
"//zircon/kernel/phys/lib/boot-shim",
"//zircon/system/ulib/hwreg",
]
friend = [ ":legacy-boot-shim-tests" ]
}
source_set("stdout") {
sources = [ "stdout.cc" ]
public = [ "stdout.h" ]
deps = [
"//zircon/kernel/lib/boot-options",
"//zircon/system/ulib/lazy_init",
"//zircon/system/ulib/uart",
]
}
phys_executable("linux-x86-boot-shim") {
sources = [ "linux-x86-boot-shim.cc" ]
deps = [
":legacy-boot-shim",
"..:linuxboot",
"//zircon/kernel/phys:symbolize",
]
}
phys_executable("multiboot-shim") {
sources = [ "multiboot-shim.cc" ]
deps = [
":legacy-boot-shim",
"..:multiboot",
"//zircon/kernel/phys:symbolize",
]
# This marks it as the official default boot shim for using QEMU.
images_metadata = {
name = "qemu-kernel"
archive = add_qemu_to_build_archives
}
# Everything should find this via the //:images build API.
# But some things might still look for "out/.../multiboot.bin" directly.
output_dir = root_build_dir
output_name = "multiboot"
}
} else {
group("linux-x86-boot-shim") {
public_deps =
[ ":linux-x86-boot-shim(//zircon/kernel/arch/x86/phys:kernel.phys32)" ]
}
group("multiboot-shim") {
public_deps =
[ ":multiboot-shim(//zircon/kernel/arch/x86/phys:kernel.phys32)" ]
}
}
test("legacy-boot-shim-tests") {
sources = [ "legacy-boot-shim-tests.cc" ]
deps = [
"//zircon/kernel/phys/lib/boot-shim",
"//zircon/kernel/phys/lib/boot-shim:boot-shim-test",
"//zircon/system/ulib/zxtest",
]
}
qemu_shims = [
{
name = "linux-x86-boot-shim"
format = "linuxboot"
},
{
name = "multiboot-shim"
format = "multiboot"
},
]
qemu_shim_tests = [
"bootsvc-integration-tests",
"core-tests",
"phys-unittests",
]
template("qemu_shim_test") {
foreach(shim, qemu_shims) {
zbi_test("${shim.name}-$target_name") {
foreach(qemu, qemu_boot_formats) {
if (qemu.name == shim.format) {
qemu_kernel = ":${shim.name}(${qemu.environment})"
forward_variables_from(qemu, [ "timeout" ])
}
}
assert(defined(qemu_kernel), "$shim not in $qemu_boot_formats")
device_types = [ "QEMU" ]
forward_variables_from(invoker, "*")
}
}
}
group("tests") {
testonly = true
deps = [
":legacy-boot-shim-tests($host_toolchain)",
":x86-boot-shim-tests",
]
foreach(shim, qemu_shims) {
deps += [ ":${shim.name}" ]
foreach(test, qemu_shim_tests) {
deps += [ ":${shim.name}-$test" ]
}
}
}
qemu_shim_test("phys-unittests") {
deps = [ "//zircon/kernel/phys/test:zbi-phys-unittests.zbi(//zircon/kernel/phys:kernel.phys_$current_cpu)" ]
}
qemu_shim_test("core-tests") {
deps = [ "//zircon/system/utest/core:core-tests.zbi($default_toolchain)" ]
# This runs the real kernel with full hardware reboot/shutdown support and it
# isn't necessarily really quick, so don't impose the short timeout used for
# raw phys tests.
timeout = false
}
qemu_shim_test("bootsvc-integration-tests") {
deps = [ "//src/bringup/bin/bootsvc/integration_test:bootsvc-integration-tests.zbi($default_toolchain)" ]
}