VMM: refactor MSR emulation
[akaros.git] / kern / arch / x86 / vmm / vmm.h
1 #pragma once
2
3 #include <ros/vmm.h>
4
5 static inline int cpu_has_vmx(void)
6 {
7         unsigned long ecx = cpuid_ecx(1);
8         return ecx & (1<<5); /* CPUID.1:ECX.VMX[bit 5] -> VT */
9 }
10
11 /* maybe someday, not today. */
12 static inline int cpu_has_svm(const char **msg)
13 {
14         return 0;
15 }
16
17 #define VMM_VMEXIT_NR_TYPES             65
18
19 struct vmm {
20         qlock_t qlock;
21         // always false.
22         int amd;
23         // true if this is a VMMCP.
24         bool vmmcp;
25
26         int flags;
27
28         // Number of cores in this VMMCP.
29         int nr_guest_pcores;
30
31         // The VMCS is intel-specific. But, maybe, someday, AMD will
32         // be back.  Just make this an anon union and we'll work it
33         // all out later. Again, remember, we're compiling in support
34         // for both architectures to ensure that we can correctly
35         // figure out at boot time what we're on and what we should
36         // do. This avoids the problem seen years ago with RH6 where
37         // you could install a kernel from the ISO, but the kernel it
38         // installed would GPF on a K7.
39         union {
40                 void *svm;
41                 struct vmx_vcpu **guest_pcores;
42         };
43         unsigned long vmexits[VMM_VMEXIT_NR_TYPES];
44 };
45
46 void vmm_init(void);
47 void vmm_pcpu_init(void);
48
49 int vmm_struct_init(struct proc *p, unsigned int nr_guest_pcores,
50                     struct vmm_gpcore_init *gpcis, int flags);
51 void __vmm_struct_cleanup(struct proc *p);
52
53 int vm_post_interrupt(struct vmctl *v);
54 int vm_run(struct vmctl *);
55 int intel_vmx_start(int id);
56 int intel_vmx_setup(int nvmcs);
57
58 struct vmx_vcpu *vmx_create_vcpu(struct proc *p, struct vmm_gpcore_init *gpci);
59 void vmx_destroy_vcpu(struct vmx_vcpu *vcpu);
60 uint64_t construct_eptp(physaddr_t root_hpa);
61 void ept_flush(uint64_t eptp);