vmm: Split VM creation into init and adding GPCs
[akaros.git] / kern / arch / x86 / vmm / vmm.h
index 1ce2f92..38c4940 100644 (file)
@@ -1,6 +1,7 @@
 #pragma once
 
 #include <ros/vmm.h>
+#include <arch/vmm/intel/vmx.h>
 
 static inline int cpu_has_vmx(void)
 {
@@ -16,18 +17,6 @@ static inline int cpu_has_svm(const char **msg)
 
 #define VMM_VMEXIT_NR_TYPES            65
 
-struct guest_pcore {
-       int cpu;
-       struct proc *proc;
-       unsigned long *posted_irq_desc;
-       struct msr_autoload {
-               unsigned nr;
-               struct vmx_msr_entry guest[NR_AUTOLOAD_MSRS];
-               struct vmx_msr_entry host[NR_AUTOLOAD_MSRS];
-       } msr_autoload;
-       struct vmcs *vmcs;
-};
-
 struct vmm {
        spinlock_t lock;        /* protects guest_pcore assignment */
        qlock_t qlock;
@@ -51,22 +40,22 @@ struct vmm {
        // installed would GPF on a K7.
        union {
                void *svm;
-               struct guest_pcore **guest_pcores;
+               struct vmx_vmm vmx;
        };
+       struct guest_pcore **guest_pcores;
+       size_t gpc_array_elem;
        unsigned long vmexits[VMM_VMEXIT_NR_TYPES];
 };
 
 void vmm_init(void);
 void vmm_pcpu_init(void);
 
-int vmm_struct_init(struct proc *p, unsigned int nr_guest_pcores,
-                    struct vmm_gpcore_init *gpcis, int flags);
+void __vmm_struct_init(struct proc *p);
+void __vmm_add_gpcs(struct proc *p, unsigned int nr_more_gpcs,
+                    struct vmm_gpcore_init *u_gpcis);
 void __vmm_struct_cleanup(struct proc *p);
 int vmm_poke_guest(struct proc *p, int guest_pcoreid);
 
-int intel_vmx_start(int id);
-int intel_vmx_setup(int nvmcs);
-
 struct guest_pcore *create_guest_pcore(struct proc *p,
                                        struct vmm_gpcore_init *gpci);
 void destroy_guest_pcore(struct guest_pcore *vcpu);
@@ -79,4 +68,4 @@ void unload_guest_pcore(struct proc *p, int guest_pcoreid);
 
 #define VMM_MSR_EMU_READ               1
 #define VMM_MSR_EMU_WRITE              2
-bool vmm_emulate_msr(uint64_t *rcx, uint64_t *rdx, uint64_t *rax, int op);
+bool vmm_emulate_msr(struct vm_trapframe *vm_tf, int op);