/*
 * Copyright 2014, NICTA
 *
 * This software may be distributed and modified according to the terms of
 * the GNU General Public License version 2. Note that NO WARRANTY is provided.
 * See "LICENSE_GPLv2.txt" for details.
 *
 * @TAG(NICTA_GPL)
 */

#ifndef _LIB_VMM_INTERRUPT_H_
#define _LIB_VMM_INTERRUPT_H_

typedef struct vmm_vcpu vmm_vcpu_t;

/* Handler for a guest exit that is triggered when the guest is
 * ready to receive interrupts */
int vmm_pending_interrupt_handler(vmm_vcpu_t *vcpu);

/* Request that the guest exist as soon as it is ready to receive
 * interrupts */
void wait_for_guest_ready(vmm_vcpu_t *vcpu);

/* Start an AP vcpu after a sipi with the requested vector */
void vmm_start_ap_vcpu(vmm_vcpu_t *vcpu, unsigned int sipi_vector);

/* Got interrupt(s) from PIC, propagate to relevant vcpu lapic */
void vmm_check_external_interrupt(vmm_t *vmm);

/* inject an interrupt from the lapic on the vcpu, whether or not it is in an exit */
void vmm_vcpu_accept_interrupt(vmm_vcpu_t *vcpu);

/* This function is called when a new interrupt has occured. */
void vmm_have_pending_interrupt(vmm_vcpu_t *vcpu);

#endif
