/*
 * Copyright 2019, Data61
 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
 * ABN 41 687 119 230.
 *
 * This software may be distributed and modified according to the terms of
 * the BSD 2-Clause license. Note that NO WARRANTY is provided.
 * See "LICENSE_BSD2.txt" for details.
 *
 * @TAG(DATA61_BSD)
 */

#pragma once

#include <simple/simple.h>
#include <vka/vka.h>
#include <vspace/vspace.h>

#include <sel4vm/guest_vm.h>

/***
 * @module boot.h
 * The libsel4vm boot interface provides us with base abstractions to create, initialise and configure VM and VCPU instances.
 */

/**
 * ID of the boot vcpu in a VM
 */
#define BOOT_VCPU 0

/***
 * @function vm_init(vm, vka, host_simple, host_vspace, io_ops, host_endpoint, name)
 * Initialise/Create VM
 * @param {vm_t *} vm                   Handle to the VM being initialised
 * @param {vka_t *} vka                 Initialised handle to virtual kernel allocator for seL4 kernel object allocation
 * @param {simple_t *} host_simple      Initialised handle to hosts simple environment
 * @param {vspace_t} host_vspace        Initialised handle to hosts vspace
 * @param {ps_io_ops_t *} ps_io_ops     Initialised handle to platforms io ops
 * @param {seL4_CPtr} host_enpoint      Host's endpoint. The library will wait and manage the endpoint when running a VM instance
 * @param {const char *} name           String used to describe VM. Useful for debugging
 * @return                              0 on success, otherwise -1 for error
 */
int vm_init(vm_t *vm, vka_t *vka, simple_t *host_simple, vspace_t host_vspace,
            ps_io_ops_t *io_ops, seL4_CPtr host_endpoint, const char *name);

/***
 * @function vm_create_vcpu(vm, priority)
 * Create a VCPU for a given VM
 * @param {vm_t *} vm       A handle to VM being configured with a new vcpu
 * @param {int} priority    The scheduling priority assigned to the VCPU thread
 * @return                  NULL for error, otherwise pointer to created vm_vcpu_t object
 */
vm_vcpu_t *vm_create_vcpu(vm_t *vm, int priority);

/***
 * @function vm_assign_vcpu_target(vcpu, target_cpu)
 * Assign a vcpu with logical target cpu to run on
 * @param {vm_vcpu_t *} vcpu    A handle to the VCPU
 * @param {int} target          Logical target CPU ID
 * @return                      -1 for error, otherwise 0 for success
 */
int vm_assign_vcpu_target(vm_vcpu_t *vcpu, int target_cpu);
