# 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",
    "ffa_memory.c",
    "manifest.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",
  ]
}
