// Copyright 2021 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.

#ifndef SRC_VIRTUALIZATION_TESTS_HYPERVISOR_HYPERVISOR_TESTS_H_
#define SRC_VIRTUALIZATION_TESTS_HYPERVISOR_HYPERVISOR_TESTS_H_

#include <lib/zx/channel.h>
#include <lib/zx/guest.h>
#include <lib/zx/port.h>
#include <lib/zx/resource.h>
#include <lib/zx/vcpu.h>
#include <lib/zx/vmar.h>
#include <zircon/types.h>

#include "constants.h"

constexpr uint32_t kGuestMapFlags =
    ZX_VM_PERM_READ | ZX_VM_PERM_WRITE | ZX_VM_PERM_EXECUTE | ZX_VM_SPECIFIC;
constexpr uint32_t kHostMapFlags = ZX_VM_PERM_READ | ZX_VM_PERM_WRITE;
// Inject an interrupt with vector 32, the first user defined interrupt vector.
constexpr uint32_t kInterruptVector = 32u;
constexpr uint64_t kTrapKey = 0x1234;

// Declare symbols for the start and end of an assembly function.
#define DECLARE_TEST_FUNCTION(name)     \
  extern "C" const char name##_start[]; \
  extern "C" const char name##_end[];

struct TestCase {
  bool interrupts_enabled = false;
  uintptr_t host_addr = 0;

  zx::vmo vmo;
  zx::guest guest;
  zx::vmar vmar;
  zx::vcpu vcpu;

  ~TestCase() {
    if (host_addr != 0) {
      zx::vmar::root_self()->unmap(host_addr, VMO_SIZE);
    }
  }
};

// Setup a guest environment consisting of the code between `start` and `end`.
//
// Flags a gUnit error on failure.
void SetupGuest(TestCase* test, const char* start, const char* end);

// Enter the guest, and ensure it exits by touching the address EXIT_TEST_ADDR.
//
// Flags a gUnit error on failure.
void EnterAndCleanExit(TestCase* test);

#endif  // SRC_VIRTUALIZATION_TESTS_HYPERVISOR_HYPERVISOR_TESTS_H_
