vmm: allow a vmm to override the vmcall function
[akaros.git] / user / vmm / include / vmm / sched.h
1 /* Copyright (c) 2016 Google Inc.
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * 2LS for virtual machines */
6
7 #pragma once
8
9 #include <parlib/uthread.h>
10 #include <sys/queue.h>
11
12 __BEGIN_DECLS
13
14 /* Three types of threads.  Guests are actual guest VMs.  Controllers are
15  * threads that are paired to guests and handles their exits.  Guests and
16  * controllers are 1:1 (via *buddy).  Task threads are for the VMM itself, such
17  * as a console thread. */
18
19 #define VMM_THREAD_GUEST                1
20 #define VMM_THREAD_CTLR                 2
21 #define VMM_THREAD_TASK                 3
22
23 #define VMM_THR_STACKSIZE               8192
24
25 struct guest_thread;
26 struct ctlr_thread;
27 struct task_thread;
28
29 struct guest_thread {
30         struct uthread                          uthread;
31         struct ctlr_thread                      *buddy;
32         unsigned int                            gpc_id;
33         bool                                            halt_exit;
34         uth_mutex_t                                     halt_mtx;
35         uth_cond_var_t                          halt_cv;
36         // TODO: work out a real ops strategy.
37         bool (*vmcall)(struct guest_thread *gth, struct vm_trapframe *);
38 };
39
40 struct ctlr_thread {
41         struct uthread                          uthread;
42         struct guest_thread                     *buddy;
43         size_t                                          stacksize;
44         void                                            *stacktop;
45 };
46
47 struct task_thread {
48         struct uthread                          uthread;
49         void                                            (*func)(void *);
50         void                                            *arg;
51         size_t                                          stacksize;
52         void                                            *stacktop;
53 };
54
55 struct virtual_machine;                 /* in vmm/vmm.h */
56 struct vmm_thread {
57         union {
58                 struct guest_thread             guest;
59                 struct ctlr_thread              ctlr;
60                 struct task_thread              task;
61         };
62         int                                                     type;
63         TAILQ_ENTRY(vmm_thread)         tq_next;
64         struct virtual_machine          *vm;
65 };
66
67 TAILQ_HEAD(vmm_thread_tq, vmm_thread);
68
69 extern int vmm_sched_period_usec;
70
71 /* Initialize a VMM for a virtual machine, which the caller fills out, except
72  * for gths.  This will set **gths in the struct virtual machine.  Do not free()
73  * the array.
74  *
75  * Set the parlib control variables (e.g. parlib_wants_to_be_mcp) before calling
76  * this initializer.
77  *
78  * Returns 0 on success, -1 o/w. */
79 int vmm_init(struct virtual_machine *vm, int flags);
80 /* Starts a guest thread/core. */
81 void start_guest_thread(struct guest_thread *gth);
82 /* Start and run a task thread. */
83 struct task_thread *vmm_run_task(struct virtual_machine *vm,
84                                  void (*func)(void *), void *arg);
85
86 int vthread_attr_init(struct virtual_machine *vm, int vmmflags);
87 int vthread_attr_kernel_init(struct virtual_machine *vm, int vmmflags);
88 int vthread_create(struct virtual_machine *vm, int guest, void *rip, void *arg);
89
90 __END_DECLS