| /* 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 |