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