# 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/testing/boot_tests/zbi_test.gni")
import("//build/testing/environments.gni")
import("//build/zbi/kernel_cmdline.gni")
import("//zircon/kernel/phys/boot-shim/devicetree.gni")
import("//zircon/kernel/phys/efi/efi_executable.gni")
import("//zircon/kernel/phys/phys_executable.gni")
import("//zircon/kernel/phys/qemu.gni")
import("//zircon/kernel/phys/test/turducken_zbi_test.gni")
import("//zircon/kernel/phys/zbi_executable.gni")

group("boot-shim") {
  deps = [
    ":zbi-boot-shim",
    "//zircon/kernel/arch/$zircon_cpu/phys/boot-shim",
  ]
  if (current_cpu != "riscv64") {  # TODO(mcgrathr): EFI not there yet
    deps += [ ":efi-boot-shim" ]
  }
}

template("devicetree_zbi_test") {
  test_target = "devicetree-shim-$target_name"
  zbi_test(test_target) {
    qemu_kernel = "//zircon/kernel/arch/$current_cpu/phys/boot-shim:linux-$current_cpu-boot-shim(${phys_toolchain})"

    environments = [ qemu_env ]

    forward_variables_from(invoker, "*")
    if (!defined(timeout)) {
      timeout = qemu_short_timeout
    }
  }
}

if (have_devicetree) {
  devicetree_zbi_test("phys-unittests") {
    deps =
        [ "//zircon/kernel/phys/test:zbi-phys-unittests.zbi($phys_toolchain)" ]
  }

  devicetree_zbi_test("memory-test") {
    deps = [ "//zircon/kernel/phys/test:zbi-memory-test.zbi($phys_toolchain)" ]

    # This value should match `//zircon/kernel/phys/test:qemu-memory-test timeout`.
    timeout = 150
  }

  devicetree_zbi_test("core-tests") {
    deps = [ "//zircon/system/utest/core:core-tests.zbi($default_toolchain)" ]

    # We've observed the ASAN variant of core-tests take as long as 701 seconds
    # when booted via firmware on certain types of hardware.  Leave a little buffer
    # for growth.
    timeout = 840
  }
}

zbi_executable("zbi-boot-shim") {
  deps = [ ":noop-boot-shim" ]
}

if (toolchain_environment == "kernel.phys") {
  source_set("noop-boot-shim") {
    sources = [ "zbi-boot-shim.cc" ]
    include_dirs = [ "//zircon/kernel/phys" ]
    deps = [
      "//src/lib/zbitl",
      "//zircon/kernel/phys:address-space",
      "//zircon/kernel/phys:allocation",
      "//zircon/kernel/phys:boot-zbi",
      "//zircon/kernel/phys:main",
      "//zircon/kernel/phys:symbolize",
      "//zircon/kernel/phys:zbi-memory",
    ]
  }

  config("includes") {
    visibility = [ ":*" ]
    include_dirs = [ "include" ]
  }

  source_set("devicetree") {
    public_configs = [ ":includes" ]
    sources = [ "devicetree.cc" ]
    public = [ "include/phys/boot-shim/devicetree.h" ]

    public_deps = [
      "//sdk/lib/fit",
      "//sdk/lib/zbi-format",
      "//src/lib/zbitl",
      "//zircon/kernel/lib/boot-options",
      "//zircon/kernel/lib/ktl",
      "//zircon/kernel/lib/libc",
      "//zircon/kernel/phys:allocation",
      "//zircon/kernel/phys:boot-options",
      "//zircon/kernel/phys:stdio",
      "//zircon/kernel/phys:zbitl-allocation",
      "//zircon/kernel/phys:zbitl-allocation",
      "//zircon/kernel/phys/lib/boot-shim",
      "//zircon/system/ulib/fbl",
    ]

    deps = [
      "//zircon/kernel/arch/$current_cpu/phys:linuxboot",
      "//zircon/kernel/lib/arch",
      "//zircon/kernel/phys:address-space",
      "//zircon/kernel/phys:allocation-init",
      "//zircon/kernel/phys:main",
      "//zircon/kernel/phys:uart",
      "//zircon/system/ulib/uart",
    ]
  }
}

efi_executable("efi-boot-shim") {
  sources = [ "efi-boot-shim.cc" ]
  defines = [ "DEFAULT_ZBI_FILENAME=\"boot${efi_cpu}.zbi\"" ]
  deps = [
    "//zircon/kernel/lib/ktl",
    "//zircon/kernel/lib/libc",
    "//zircon/kernel/phys/efi:efi-boot-zbi",
    "//zircon/kernel/phys/efi:file",
    "//zircon/kernel/phys/efi:main",
    "//zircon/kernel/phys/lib/boot-shim",
  ]
}

group("tests") {
  testonly = true

  deps = [
    ":boot-shim",
    "//zircon/kernel/arch/$zircon_cpu/phys/boot-shim:tests",
  ]
}

group("boot_tests") {
  testonly = true
  deps = [
    ":zbi-boot-shim-core-tests",
    ":zbi-boot-shim-phys-unittests",
    ":zbi-debugdata-boot-shim-hello-world-test",
    ":zbi-debugdata-boot-shim-test",
    "//zircon/kernel/arch/$zircon_cpu/phys/boot-shim:boot_tests",
  ]

  if (have_devicetree) {
    deps += [
      ":devicetree-shim-core-tests",
      ":devicetree-shim-memory-test",
      ":devicetree-shim-phys-unittests",
    ]
  }
}

zbi_test("zbi-boot-shim-phys-unittests") {
  deps = [
    ":zbi-boot-shim",
    "//zircon/kernel/phys/test:zbi-phys-unittests.zbi($phys_toolchain)",
  ]

  # Set a short timeout since the tests don't reliably reboot the machine.
  timeout = qemu_short_timeout
}

zbi_test("zbi-boot-shim-core-tests") {
  deps = [
    ":zbi-boot-shim",
    "//zircon/system/utest/core:core-tests.zbi($default_toolchain)",
  ]
}

zbi_executable("debugdata-boot-shim-test") {
  testonly = true

  sources = [ "debugdata-boot-shim-test.cc" ]
  deps = [
    "//zircon/kernel/lib/arch",
    "//zircon/kernel/phys/lib/boot-shim",
    "//zircon/kernel/phys/test:turducken",
  ]
}

# This brings the test program and the command-line to tell it to be the turkey
# that publishes data for the duck to see.
kernel_cmdline("debugdata-boot-shim-test.publish") {
  visibility = [ ":*" ]
  testonly = true
  args = [ "debugdata.publish" ]
  deps = [ ":debugdata-boot-shim-test" ]
}

# This just repacks the ZBI executable as a ZBI again, which doesn't change its
# contents.  But it gets the file into a place where get_target_outputs() can
# find it without being in the right phys toolchain.
zbi("debugdata-boot-shim-test.zbi") {
  visibility = [ ":*" ]
  testonly = true
  deps = [ ":debugdata-boot-shim-test" ]
}

# This just packs the same test as the turkey and the duck, the second instance
# won't get the "publish" command line so it will check instead.
turducken_zbi_test("zbi-debugdata-boot-shim-test") {
  kernel = ":debugdata-boot-shim-test.publish"

  # This needs a dependency on the zbi() target so it can use its output as an
  # input.  data_deps vs deps keeps it from being folded as a zbi_input() into
  # the outer ZBI being created.  The second output from the zbi() target is
  # the JSON file; we only want the ZBI file, which is the first output.
  data_deps = [ ":debugdata-boot-shim-test.zbi" ]
  zbi_files = get_target_outputs(data_deps[0])
  sources = [ zbi_files[0] ]
}

# This just repacks the hello-world-test ZBI executable as a ZBI again, which
# doesn't change its contents.  But it gets the file into a place where
# get_target_outputs() in this BUILD.gn file can find it.
zbi("zbi-hello-world-test") {
  visibility = [ ":*" ]
  testonly = true
  deps = [ "//zircon/kernel/phys/test:zbi-hello-world-test.executable($phys_toolchain)" ]
}

# This is the duck inside the turkey below.  It checks for the debugdata item
# and then hands off to its chicken: the hello-world test.
turducken_zbi_test("debugdata-boot-shim-test.hello-world-test") {
  visibility = [ ":*" ]
  kernel = ":debugdata-boot-shim-test"
  data_deps = [ ":zbi-hello-world-test" ]
  zbi_files = get_target_outputs(data_deps[0])
  sources = [ zbi_files[0] ]
}

# This will add the debugdata, hand off the the duck above that checks it
# and then hands off to hello-world-test.
turducken_zbi_test("zbi-debugdata-boot-shim-hello-world-test") {
  kernel = ":debugdata-boot-shim-test.publish"
  data_deps = [ ":debugdata-boot-shim-test.hello-world-test.zbi" ]
  zbi_files = get_target_outputs(data_deps[0])
  sources = [ zbi_files[0] ]
}
