# 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("//test/hftest/args.gni")

config("config") {
  include_dirs = [ "inc" ]
}

# Tests with secondary VMs.
vm_kernel("primary_with_secondaries_test_vm") {
  testonly = true
  public_configs = [
    ":config",
    "//src/arch/aarch64:config",
  ]

  sources = [
    "boot.c",
    "debug_el1.c",
    "ffa.c",
    "floating_point.c",
    "interrupts.c",
    "mailbox.c",
    "memory_sharing.c",
    "no_services.c",
    "perfmon.c",
    "run_race.c",
    "smp.c",
    "sysregs.c",
    "unmapped.c",
  ]

  deps = [
    "//src/arch/aarch64/hftest:registers",
    "//test/hftest:hftest_primary_vm",
    "//test/vmapi/common",
    "//vmlib",
  ]
}

initrd("primary_with_secondaries_test") {
  testonly = true

  manifest = "manifest.dts"
  manifest_overlay = hftest_manifest_overlay

  primary_name = "primary_with_secondaries_test"
  primary_vm = ":primary_with_secondaries_test_vm"
  secondary_vms = [
    [
      "services1",
      "services:service_vm1",
    ],
    [
      "services2",
      "services:service_vm2",
    ],
    [
      "services3",
      "services:service_vm3",
    ],
  ]
}
