vmm: Allow dynamic vthread creation
[akaros.git] / user / vmm / include / vmm / vthread.h
1 /* Copyright (c) 2017 Google Inc.
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details. */
4
5 #pragma once
6
7 #include <vmm/sched.h>
8
9 __BEGIN_DECLS
10
11 /* This will hang off the gth->user_data for vthread_create, but not for
12  * vthread_alloc.  You're on your own there.  Using this is a sign that we may
13  * need our own 2LS for vthreads. */
14 struct vthread_info {
15         uintptr_t                                       stacktop;
16 };
17
18 struct vthread {
19         struct guest_thread                     gth;
20         /* Don't add to this structure without changing how these are allocated. */
21 };
22
23 static struct vm_trapframe *vth_to_vmtf(struct vthread *vth)
24 {
25         return gth_to_vmtf((struct guest_thread*)vth);
26 }
27
28 static struct virtual_machine *vth_to_vm(struct vthread *vth)
29 {
30         return gth_to_vm((struct guest_thread*)vth);
31 }
32
33 void gpci_init(struct vmm_gpcore_init *gpci);
34 struct vthread *vthread_alloc(struct virtual_machine *vm,
35                               struct vmm_gpcore_init *gpci);
36 void vthread_init_ctx(struct vthread *vth, uintptr_t entry_pt, uintptr_t arg,
37                       uintptr_t stacktop);
38 void vthread_run(struct vthread *vthread);
39 struct vthread *vthread_create(struct virtual_machine *vm, void *entry,
40                                void *arg);
41
42 __END_DECLS