vthread: allow programs to have threads exit on halt.
[akaros.git] / user / vmm / include / vmm / vmm.h
1 /* Copyright (c) 2015 Google Inc.
2  * Ron Minnich <rminnich@google.com>
3  * See LICENSE for details.
4  *
5  * VMM.h */
6
7 #pragma once
8
9 #include <ros/vmm.h>
10 #include <vmm/sched.h>
11
12 #define VM_PAGE_FAULT                   14
13
14 /* The listing of VIRTIO MMIO devices. We currently only expect to have 2,
15  * console and network. Only the console is fully implemented right now.*/
16 enum {
17         VIRTIO_MMIO_CONSOLE_DEV,
18         VIRTIO_MMIO_NETWORK_DEV,
19         VIRTIO_MMIO_BLOCK_DEV,
20
21         /* This should always be the last entry. */
22         VIRTIO_MMIO_MAX_NUM_DEV,
23 };
24
25 /* Structure to encapsulate all of the bookkeeping for a VM. */
26 struct virtual_machine {
27         struct guest_thread                     **gths;
28         unsigned int                            nr_gpcs;
29         struct vmm_gpcore_init          *gpcis;
30         bool                                            vminit;
31
32         /* TODO: put these in appropriate structures.  e.g., virtio things in
33          * something related to virtio.  low4k in something related to the guest's
34          * memory. */
35         uint8_t                                         *low4k;
36         struct virtio_mmio_dev          *virtio_mmio_devices[VIRTIO_MMIO_MAX_NUM_DEV];
37
38         /* Default root pointer to use if one is not set in a
39          * guest thread. We expect this to be the common case,
40          * where all guests share a page table. It's not required
41          * however. */
42         void                                            *root;
43
44         /* Default value for whether guest threads halt on an exit. */
45         bool                                            halt_exit;
46 };
47
48 char *regname(uint8_t reg);
49 int decode(struct guest_thread *vm_thread, uint64_t *gpa, uint8_t *destreg,
50            uint64_t **regp, int *store, int *size, int *advance);
51 int io(struct guest_thread *vm_thread);
52 void showstatus(FILE *f, struct guest_thread *vm_thread);
53 int gvatogpa(struct guest_thread *vm_thread, uint64_t va, uint64_t *pa);
54 int rippa(struct guest_thread *vm_thread, uint64_t *pa);
55 int msrio(struct guest_thread *vm_thread, struct vmm_gpcore_init *gpci,
56           uint32_t opcode);
57 int do_ioapic(struct guest_thread *vm_thread, uint64_t gpa,
58               int destreg, uint64_t *regp, int store);
59 bool handle_vmexit(struct guest_thread *gth);
60 int __apic_access(struct guest_thread *vm_thread, uint64_t gpa, int destreg,
61                   uint64_t *regp, int store);
62 int vmm_interrupt_guest(struct virtual_machine *vm, unsigned int gpcoreid,
63                         unsigned int vector);
64
65 /* Lookup helpers */
66
67 static struct virtual_machine *gth_to_vm(struct guest_thread *gth)
68 {
69         return ((struct vmm_thread*)gth)->vm;
70 }
71
72 static struct vm_trapframe *gth_to_vmtf(struct guest_thread *gth)
73 {
74         return &gth->uthread.u_ctx.tf.vm_tf;
75 }
76
77 static struct vmm_gpcore_init *gth_to_gpci(struct guest_thread *gth)
78 {
79         struct virtual_machine *vm = gth_to_vm(gth);
80
81         return &vm->gpcis[gth->gpc_id];
82 }
83
84 static struct virtual_machine *get_my_vm(void)
85 {
86         return ((struct vmm_thread*)current_uthread)->vm;
87 }