/* Copyright (c) 2016 Google Inc.
 * Barret Rhoden <brho@cs.berkeley.edu>
 * See LICENSE for details.
 *
 * Helper functions for virtual machines */

#include <vmm/vmm.h>
#include <errno.h>
#include <parlib/bitmask.h>
#include <parlib/uthread.h>
#include <sys/syscall.h>

/* Sends an interrupt with @vector to guest pcore @gpcoreid.  Returns 0 on
 * success, -1 with errstr set o/w. */
int vmm_interrupt_guest(struct virtual_machine *vm, unsigned int gpcoreid,
                        unsigned int vector)
{
	struct guest_thread *gth;
	struct vmm_gpcore_init *gpci;

	if (gpcoreid >= vm->nr_gpcs) {
		werrstr("Guest pcoreid %d out of range (%d gpcs)", gpcoreid,
		        vm->nr_gpcs);
		return -1;
	}
	gth = gpcid_to_gth(vm, gpcoreid);
	gpci = gth_to_gpci(gth);
	/* The OUTSTANDING_NOTIF bit (256) is one greater than the last valid
	 * descriptor */
	if (vector >= VMX_POSTED_OUTSTANDING_NOTIF) {
		werrstr("Interrupt vector %d too high (max %d)", vector,
		        VMX_POSTED_OUTSTANDING_NOTIF - 1);
		return -1;
	}
	/* Syncing with halting guest threads.  The Mutex protects changes to
	 * the posted irq descriptor. */
	uth_mutex_lock(gth->halt_mtx);
	SET_BITMASK_BIT_ATOMIC(gpci->posted_irq_desc, vector);
	/* Atomic op provides the mb() btw writing the vector and mucking with
	 * OUTSTANDING_NOTIF.
	 *
	 * If we set notif, it's on us to inject the IRQ.  Either way, notif
	 * will be set and we must kick the CV, unconditionally. */
	if (!GET_BITMASK_BIT(gpci->posted_irq_desc,
			     VMX_POSTED_OUTSTANDING_NOTIF)) {
		SET_BITMASK_BIT_ATOMIC(gpci->posted_irq_desc,
		                       VMX_POSTED_OUTSTANDING_NOTIF);
		ros_syscall(SYS_vmm_poke_guest, gpcoreid, 0, 0, 0, 0, 0);
	}
	uth_cond_var_signal(gth->halt_cv);
	uth_mutex_unlock(gth->halt_mtx);
	return 0;
}
