Handle multiple virtio mmio devices.
[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 /* The listing of VIRTIO MMIO devices. We currently only expect to have 2,
13  * console and network. Only the console is implemented right now.*/
14 enum {
15         VIRTIO_MMIO_CONSOLE_DEV,
16
17         /* This should always be the last entry. */
18         VIRTIO_MMIO_MAX_NUM_DEV = 2,
19 };
20
21 /* Structure to encapsulate all of the bookkeeping for a VM. */
22 struct virtual_machine {
23         struct guest_thread                     **gths;
24         unsigned int                            nr_gpcs;
25         struct vmm_gpcore_init          *gpcis;
26
27         /* TODO: put these in appropriate structures.  e.g., virtio things in
28          * something related to virtio.  low4k in something related to the guest's
29          * memory. */
30         uint8_t                                         *low4k;
31         struct virtio_mmio_dev          *virtio_mmio_devices[VIRTIO_MMIO_MAX_NUM_DEV];
32 };
33
34 char *regname(uint8_t reg);
35 int decode(struct guest_thread *vm_thread, uint64_t *gpa, uint8_t *destreg,
36            uint64_t **regp, int *store, int *size, int *advance);
37 int io(struct guest_thread *vm_thread);
38 void showstatus(FILE *f, struct guest_thread *vm_thread);
39 int msrio(struct guest_thread *vm_thread, struct vmm_gpcore_init *gpci,
40           uint32_t opcode);
41 int do_ioapic(struct guest_thread *vm_thread, uint64_t gpa,
42               int destreg, uint64_t *regp, int store);
43 bool handle_vmexit(struct guest_thread *gth);
44 int __apic_access(struct guest_thread *vm_thread, uint64_t gpa, int destreg,
45                   uint64_t *regp, int store);
46
47 /* Lookup helpers */
48
49 static struct virtual_machine *gth_to_vm(struct guest_thread *gth)
50 {
51         return ((struct vmm_thread*)gth)->vm;
52 }
53
54 static struct vm_trapframe *gth_to_vmtf(struct guest_thread *gth)
55 {
56         return &gth->uthread.u_ctx.tf.vm_tf;
57 }
58
59 static struct vmm_gpcore_init *gth_to_gpci(struct guest_thread *gth)
60 {
61         struct virtual_machine *vm = gth_to_vm(gth);
62
63         return &vm->gpcis[gth->gpc_id];
64 }
65
66 static struct virtual_machine *get_my_vm(void)
67 {
68         return ((struct vmm_thread*)current_uthread)->vm;
69 }