# Copyright 2017 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/test/test_package.gni")

source_set("lib") {
  visibility = [ ":*" ]

  sources = [
    "bits.h",
    "dev_mem.h",
    "guest.cc",
    "guest.h",
    "guest_config.cc",
    "guest_config.h",
    "instance_controller_impl.cc",
    "instance_controller_impl.h",
    "io.cc",
    "io.h",
    "linux.cc",
    "linux.h",
    "pci.cc",
    "pci.h",
    "platform_device.h",
    "sysinfo.h",
    "vcpu.cc",
    "vcpu.h",
    "virtio_balloon.cc",
    "virtio_balloon.h",
    "virtio_block.cc",
    "virtio_block.h",
    "virtio_console.cc",
    "virtio_console.h",
    "virtio_device.h",
    "virtio_gpu.cc",
    "virtio_gpu.h",
    "virtio_input.cc",
    "virtio_input.h",
    "virtio_net.cc",
    "virtio_net.h",
    "virtio_net_legacy.cc",
    "virtio_net_legacy.h",
    "virtio_pci.cc",
    "virtio_pci.h",
    "virtio_queue_waiter.cc",
    "virtio_queue_waiter.h",
    "virtio_rng.cc",
    "virtio_rng.h",
    "virtio_vsock.cc",
    "virtio_vsock.h",
    "virtio_wl.cc",
    "virtio_wl.h",
    "zircon.cc",
    "zircon.h",
  ]

  if (current_cpu == "arm64") {
    sources += [
      "arch/arm64/gic_distributor.cc",
      "arch/arm64/gic_distributor.h",
      "arch/arm64/pl011.cc",
      "arch/arm64/pl011.h",
      "arch/arm64/pl031.cc",
      "arch/arm64/pl031.h",
    ]
  } else if (current_cpu == "x64") {
    sources += [
      "arch/x64/acpi.cc",
      "arch/x64/acpi.h",
      "arch/x64/acpi_priv.h",
      "arch/x64/decode.cc",
      "arch/x64/decode.h",
      "arch/x64/e820.cc",
      "arch/x64/e820.h",
      "arch/x64/i8250.cc",
      "arch/x64/i8250.h",
      "arch/x64/io_apic.cc",
      "arch/x64/io_apic.h",
      "arch/x64/io_port.cc",
      "arch/x64/io_port.h",
      "arch/x64/page_table.cc",
      "arch/x64/page_table.h",
    ]

    include_dirs = [ "//zircon/third_party/lib/acpica/source/include" ]
  }

  defines = [ "_ALL_SOURCE=1" ]

  deps = [
    "//garnet/bin/guest/third_party/fdt",
    "//garnet/bin/guest/vmm/fidl:fuchsia.guest.device",
    "//garnet/bin/guest/vmm/fidl:fuchsia.guest.vmm",
    "//garnet/public/fidl/fuchsia.guest",
    "//garnet/public/lib/fsl",
    "//garnet/public/lib/ui/base_view/cpp",
    "//third_party/rapidjson",
    "//zircon/public/fidl/fuchsia-sysinfo",
    "//zircon/public/lib/fbl",
    "//zircon/public/lib/fdio",
    "//zircon/public/lib/libzbi",
  ]

  public_deps = [
    "//garnet/bin/guest/vmm/device",
    "//garnet/public/lib/component/cpp",
    "//zircon/public/fidl/zircon-ethernet:zircon-ethernet_c",
    "//zircon/public/lib/ddk",
    "//zircon/public/lib/virtio",
    "//zircon/public/lib/zx",
  ]
}

executable("bin") {
  output_name = "vmm"

  sources = [
    "main.cc",
  ]

  deps = [
    ":lib",
    "//zircon/public/lib/async-loop-cpp",
    "//zircon/public/lib/trace-provider",
  ]

  defines = [ "_ALL_SOURCE=1" ]
}

package("vmm") {
  binary = "vmm"

  deps = [
    ":bin",
  ]

  meta = [
    {
      path = rebase_path("//garnet/bin/guest/vmm/meta/vmm.cmx")
      dest = "vmm.cmx"
    },
  ]

  if (target_cpu == "arm64") {
    resources = [
      {
        path = rebase_path("//garnet/bin/guest/vmm/arch/arm64/dts/board.dtb")
        dest = "board.dtb"
      },
    ]
  } else if (target_cpu == "x64") {
    resources = [
      {
        path = rebase_path("//garnet/bin/guest/vmm/arch/x64/asl/dsdt.aml")
        dest = "dsdt.aml"
      },
      {
        path = rebase_path("//garnet/bin/guest/vmm/arch/x64/asl/mcfg.aml")
        dest = "mcfg.aml"
      },
    ]
  }
}

executable("vmm_unittests") {
  visibility = [ ":*" ]
  testonly = true

  sources = [
    "dev_mem_unittest.cc",
    "guest_config_unittest.cc",
    "pci_unittest.cc",
    "phys_mem_fake.h",
    "virtio_device_fake.h",
    "virtio_net_legacy_unittest.cc",
    "virtio_queue_fake.cc",
    "virtio_queue_fake.h",
    "virtio_queue_unittest.cc",
    "virtio_queue_waiter_unittest.cc",
    "virtio_vsock_unittest.cc",
  ]

  if (current_cpu == "x64") {
    sources += [
      "arch/x64/decode_unittest.cc",
      "arch/x64/page_table_unittest.cc",
    ]
  }

  deps = [
    ":lib",
    "//garnet/public/lib/gtest",
    "//third_party/googletest:gtest_main",
  ]
}

test_package("vmm_tests") {
  deps = [
    ":vmm_unittests",
    "//garnet/bin/guest/vmm/device:device_tests",
    "//garnet/bin/guest/vmm/device:device_unittests",
  ]

  tests = [
    {
      name = "device_tests"
      environments = [
        {
          dimensions = {
            device_type = "Intel NUC Kit NUC7i5DNHE"
          }
        },
      ]
    },
    {
      name = "device_unittests"
    },
    {
      name = "vmm_unittests"
    },
  ]
}
