# Copyright 2019 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/toolchain/toolchain_environment.gni")
import("//build/zircon/c_utils.gni")
import("//build/zircon/zx_library.gni")

group("tests") {
  testonly = true
  deps = []
}

# The boot shims need to be compiled in the special environment for running
# in physical memory with the MMU disabled.
if (toolchain_environment == "physmem") {
  source_set("common") {
    visibility = [ ":*" ]
    sources = [
      "boot-shim.S",
      "debug.c",
      "devicetree.c",
      "util.c",
    ]
    deps = [ "//zircon/kernel/lib/libc/string" ]
    public_deps = [
      "//sdk/lib/zbi-format",
      "//src/firmware/lib/zbi:in_tree",
    ]
  }

  config("boot_shim_config") {
    visibility = [ ":*" ]
    defines = [ "KERNEL_ALIGN=0x10000" ]
    inputs = [ "boot-shim.ld" ]
    ldflags = [
      "-Wl,--build-id=none",
      "-Wl,-T," + rebase_path("boot-shim.ld", root_build_dir),
      "-Wl,-defsym," + defines[0],
    ]
  }
}

template("boot_shim") {
  board = target_name

  if (toolchain_environment == "physmem") {
    shim_name = "${board}-boot-shim"

    executable(shim_name) {
      output_extension = "elf"
      output_dir = target_out_dir
      configs += [ ":boot_shim_config" ]
      deps = [
        ":common",
        "//sdk/lib/zbi-format",
        "//zircon/system/ulib/ddk-platform-defs:headers",
      ]
      sources = [
        "${board}-uart.c",
        "boot-shim.c",
      ]

      # TODO(mcgrathr): Move these to ./$board-config.h and use a -D.
      include_dirs = [ "//zircon/kernel/target/arm64/board/$board" ]
    }

    shim_rspfile = "$target_gen_dir/$shim_name.elf.rsp"
    link_output_rspfile("$shim_name.elf.rsp") {
      deps = [ ":$shim_name" ]
      outputs = [ shim_rspfile ]
    }

    image_binary(board) {
      forward_variables_from(invoker,
                             [
                               "testonly",
                               "visibility",
                             ])
      deps = [ ":$shim_name" ]

      # The shim code should be purely position-independent code.
      pure = true

      output_dir = root_build_dir
      output_name = shim_name
      output_extension = "bin"
      metadata = {
        # For the //:images build_api_module().
        images = [
          {
            label = get_label_info(":$target_name", "label_with_toolchain")
            archive = add_qemu_to_build_archives
            if (defined(invoker.image_metadata)) {
              forward_variables_from(invoker.image_metadata, "*")
            }
            if (!defined(name)) {
              name = output_name
            }
            if (!defined(type)) {
              # TODO(mcgrathr): This isn't usefully descriptive but it's not
              # clear what other generic string to use for these.  They might
              # be what some boot loader calls the "kernel", or they might be
              # pasted on the front of the image by some script (perhaps
              # before more stages of board-specific image packing).  Refine
              # this part of the "images" build API when consumer needs for
              # making use of the shims becomes more clear.
              type = "bin"
            }
            path = rebase_path("$output_dir/$output_name.$output_extension",
                               root_build_dir)
            cpu = current_cpu
          },
        ]
      }
    }
  } else {
    group(board) {
      public_deps = [ ":$board(//zircon/kernel/arch/arm64:physmem_arm64)" ]
    }
    not_needed(invoker, "*")
  }
}

shims = [
  "imx8mmevk",
  "motmot",
]

foreach(shim, shims) {
  boot_shim(shim) {
  }
}

boot_shim("qemu") {
  image_metadata = {
    name = "qemu-kernel"
    type = "kernel"
  }
}
