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