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

#pragma once

#include <parlib/uthread.h>
#include <ros/arch/vmm.h>
#include <sys/queue.h>

__BEGIN_DECLS

/* Three types of threads.  Guests are actual guest VMs.  Controllers are
 * threads that are paired to guests and handles their exits.  Guests and
 * controllers are 1:1 (via *buddy).  Task threads are for the VMM itself, such
 * as a console thread. */

#define VMM_THREAD_GUEST		1
#define VMM_THREAD_CTLR			2
#define VMM_THREAD_TASK			3

#define VMM_THR_STACKSIZE		(4 * PGSIZE)

struct guest_thread;
struct ctlr_thread;
struct task_thread;

struct guest_thread {
	struct uthread				uthread;
	struct ctlr_thread			*buddy;
	unsigned int				gpc_id;
	uth_mutex_t					*halt_mtx;
	uth_cond_var_t				*halt_cv;
	unsigned long				nr_vmexits;
	struct vmm_gpcore_init		gpci;
	void						*user_data;
};

struct ctlr_thread {
	struct uthread				uthread;
	struct guest_thread			*buddy;
	size_t						stacksize;
	void						*stacktop;
};

struct task_thread {
	struct uthread				uthread;
	void						*(*func)(void *);
	void						*arg;
	size_t						stacksize;
	void						*stacktop;
};

struct virtual_machine;			/* in vmm/vmm.h */
struct vmm_thread {
	union {
		struct guest_thread		guest;
		struct ctlr_thread		ctlr;
		struct task_thread		task;
	};
	int							type;
	TAILQ_ENTRY(vmm_thread)		tq_next;
	struct virtual_machine		*vm;
	/* Sched stats */
	int							prev_vcoreid;
	unsigned long				nr_runs;
	unsigned long				nr_resched;
};

TAILQ_HEAD(vmm_thread_tq, vmm_thread);

extern int vmm_sched_period_usec;

/* Initialize a VMM for a virtual machine, which the caller fills out, except
 * for gths.  This will set **gths in the struct virtual machine.  Do not free()
 * the array.
 *
 * Set the parlib control variables (e.g. parlib_wants_to_be_mcp) before calling
 * this initializer.
 *
 * Returns 0 on success, -1 o/w. */
int vmm_init(struct virtual_machine *vm, struct vmm_gpcore_init *gpcis,
             int flags);
/* Starts a guest thread/core. */
void start_guest_thread(struct guest_thread *gth);
/* Start and run a task thread. */
struct task_thread *vmm_run_task(struct virtual_machine *vm,
                                 void *(*func)(void *), void *arg);

__END_DECLS
