# Copyright 2018 The Hafnium Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("//build/image/image.gni")
import("//build/toolchain/platform.gni")

declare_args() {
  # Target which implements the standard output interface.
  stdout = ":stdout"
}

# The hypervisor image.
hypervisor("hafnium") {
  deps = [
    ":layout",
    ":src_not_testable_yet",
  ]
}

# Hypervisor specific code that isn't. One day it will be testable and both the
# src targets will merge!
source_set("src_not_testable_yet") {
  sources = [
    "cpio.c",
    "init.c",
    "load.c",
    "main.c",
  ]
  deps = [
    ":src_testable",
    "//project/${project}/${plat_name}",
    "//src/arch/${plat_arch}/hypervisor:tee",
    plat_boot_flow,
    plat_console,
    plat_iommu,
  ]
}

# One day, this will contain all the hypervisor's source but only once it can
# all be built against the fake arch for unit tests. Utilities that are shared
# e.g. with VM used in the VM tests have their own targets to facilitate
# sharing.
source_set("src_testable") {
  sources = [
    "api.c",
    "cpu.c",
    "manifest.c",
    "spci_memory.c",
    "vcpu.c",
  ]

  deps = [
    ":abort",
    ":dlog",
    ":fdt",
    ":fdt_handler",
    ":memiter",
    ":mm",
    ":panic",
    ":std",
    ":vm",
    "//src/arch/${plat_arch}/hypervisor",
    "//src/arch/${plat_arch}/hypervisor:tee",
    "//vmlib",
    plat_boot_flow,
    plat_console,
    plat_iommu,
  ]
}

source_set("layout") {
  sources = [
    "layout.c",
  ]
}

source_set("mm") {
  sources = [
    "mm.c",
    "mpool.c",
  ]
}

source_set("vm") {
  sources = [
    "vm.c",
  ]
}

# Standard library functions.
source_set("std") {
  sources = [
    "std.c",
  ]

  deps = [
    "//src/arch/${plat_arch}:std",
  ]
}

# Default implementation of stdout which sends the character to the
# 'plat_console' driver.
source_set("stdout") {
  sources = [
    "stdout.c",
  ]
  deps = [
    plat_console,
  ]
}

# Debug code that is not specific to a certain image so can be shared.
source_set("dlog") {
  sources = [
    "dlog.c",
  ]

  deps = [
    ":std",
    stdout,
  ]
}

source_set("string") {
  sources = [
    "string.c",
  ]
  deps = [
    ":memiter",
    ":std",
  ]
}

source_set("fdt_handler") {
  sources = [
    "fdt_handler.c",
  ]
  deps = [
    ":dlog",
    ":fdt",
    ":fdt_patch",
  ]
}

# Flattened Device Tree (FDT) utilities.
source_set("fdt") {
  sources = [
    "fdt.c",
  ]

  deps = [
    ":memiter",
    ":string",
    "//third_party/dtc:libfdt",
  ]
}

source_set("fdt_patch") {
  sources = [
    "fdt_patch.c",
  ]
  deps = [
    ":dlog",
    ":fdt",
    "//third_party/dtc:libfdt",
  ]
}

source_set("memiter") {
  sources = [
    "memiter.c",
  ]
}

source_set("panic") {
  sources = [
    "panic.c",
  ]
}

source_set("abort") {
  sources = [
    "abort.c",
  ]
}

executable("unit_tests") {
  testonly = true
  sources = [
    "api_test.cc",
    "fdt_handler_test.cc",
    "fdt_test.cc",
    "manifest_test.cc",
    "mm_test.cc",
    "mpool_test.cc",
    "string_test.cc",
    "vm_test.cc",
  ]
  sources += [ "layout_fake.c" ]
  cflags_cc = [
    "-Wno-c99-extensions",
    "-Wno-nested-anon-types",
  ]
  deps = [
    ":src_testable",
    "//third_party/googletest:gtest_main",
  ]
}
