# 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" ]
  }
}
