VMM: removes the VPID AFAIK, the VPID is only useful if you aren't using EPT. Since we're using the EPT, the VPID code is just a waste. But I did leave in the helpers, since they may be useful and it's also a good practice to flush the VPID caches in case a previous user of VMX messed with them.
diff --git a/kern/arch/x86/vmm/intel/vmx.c b/kern/arch/x86/vmm/intel/vmx.c index 86c6c35..8efa0b2 100644 --- a/kern/arch/x86/vmm/intel/vmx.c +++ b/kern/arch/x86/vmm/intel/vmx.c
@@ -172,9 +172,6 @@ }; #define NR_VMX_MSR ARRAY_SIZE(vmx_msr_index) -static DECLARE_BITMAP(vmx_vpid_bitmap, /*VMX_NR_VPIDS*/ 65536); -static spinlock_t vmx_vpid_lock; - static unsigned long *msr_bitmap; static struct vmcs_config { @@ -546,7 +543,6 @@ if (_cpu_based_exec_control & CPU_BASED_ACTIVATE_SECONDARY_CONTROLS) { min2 = - SECONDARY_EXEC_ENABLE_VPID | SECONDARY_EXEC_ENABLE_EPT | SECONDARY_EXEC_UNRESTRICTED_GUEST; opt2 = SECONDARY_EXEC_WBINVD_EXITING | @@ -817,7 +813,6 @@ } else vmcs_clear(vcpu->vmcs); - vpid_sync_context(vcpu->vpid); ept_sync_context(vcpu_get_eptp(vcpu)); vcpu->launched = 0; @@ -843,8 +838,6 @@ if (currentcpu->local_vcpu != vcpu) panic("vmx_put_cpu: asked to clear something not ours"); - - vpid_sync_context(vcpu->vpid); ept_sync_context(vcpu_get_eptp(vcpu)); vmcs_clear(vcpu->vmcs); vcpu->cpu = -1; @@ -929,7 +922,7 @@ vmx_put_cpu(vcpu); printk("--- Begin VCPU Dump ---\n"); - printk("CPU %d VPID %d\n", vcpu->cpu, vcpu->vpid); + printk("CPU %d VPID %d\n", vcpu->cpu, 0); printk("RIP 0x%016lx RFLAGS 0x%08lx\n", vcpu->regs.tf_rip, flags); printk("RAX 0x%016lx RCX 0x%016lx\n", @@ -1124,7 +1117,7 @@ */ static void vmx_setup_vmcs(struct vmx_vcpu *vcpu) { - vmcs_write16(VIRTUAL_PROCESSOR_ID, vcpu->vpid); + vmcs_write16(VIRTUAL_PROCESSOR_ID, 0); vmcs_write64(VMCS_LINK_POINTER, -1ull); /* 22.3.1.5 */ /* Control */ @@ -1192,39 +1185,6 @@ } /** - * vmx_allocate_vpid - reserves a vpid and sets it in the VCPU - * @vmx: the VCPU - */ -static int vmx_allocate_vpid(struct vmx_vcpu *vmx) -{ - int vpid; - - vmx->vpid = 0; - - spin_lock(&vmx_vpid_lock); - vpid = find_first_zero_bit(vmx_vpid_bitmap, VMX_NR_VPIDS); - if (vpid < VMX_NR_VPIDS) { - vmx->vpid = vpid; - __set_bit(vpid, vmx_vpid_bitmap); - } - spin_unlock(&vmx_vpid_lock); - - return vpid >= VMX_NR_VPIDS; -} - -/** - * vmx_free_vpid - frees a vpid - * @vmx: the VCPU - */ -static void vmx_free_vpid(struct vmx_vcpu *vmx) -{ - spin_lock(&vmx_vpid_lock); - if (vmx->vpid != 0) - __clear_bit(vmx->vpid, vmx_vpid_bitmap); - spin_unlock(&vmx_vpid_lock); -} - -/** * vmx_create_vcpu - allocates and initializes a new virtual cpu * * Returns: A new VCPU structure @@ -1244,10 +1204,6 @@ if (!vcpu->vmcs) goto fail_vmcs; - if (vmx_allocate_vpid(vcpu)) - goto fail_vpid; - - printd("%d: vmx_create_vcpu: vpid %d\n", core_id(), vcpu->vpid); vcpu->cpu = -1; vmx_get_cpu(vcpu); @@ -1257,10 +1213,6 @@ return vcpu; -fail_ept: - vmx_free_vpid(vcpu); -fail_vpid: - vmx_free_vmcs(vcpu->vmcs); fail_vmcs: kfree(vcpu); return NULL; @@ -1272,7 +1224,6 @@ */ void vmx_destroy_vcpu(struct vmx_vcpu *vcpu) { - vmx_free_vpid(vcpu); vmx_free_vmcs(vcpu->vmcs); kfree(vcpu); } @@ -1498,9 +1449,8 @@ intr_info = vmcs_read32(VM_EXIT_INTR_INFO); vmx_put_cpu(vcpu); - printk("vmx (VPID %d): got an exception\n", vcpu->vpid); - printk("vmx (VPID %d): pid %d\n", vcpu->vpid, - current->pid); + printk("vmx (vcpu %p): got an exception\n", vcpu); + printk("vmx (vcpu %p): pid %d\n", vcpu, vcpu->proc->pid); if ((intr_info & INTR_INFO_INTR_TYPE_MASK) == INTR_TYPE_NMI_INTR) { return 0; } @@ -1682,7 +1632,7 @@ lcr4(rcr4() | X86_CR4_VMXE); __vmxon(phys_addr); - vpid_sync_vcpu_global(); + vpid_sync_vcpu_global(); /* good idea, even if we aren't using vpids */ ept_sync_global(); return 0; @@ -1837,8 +1787,6 @@ __vmx_disable_intercept_for_msr(msr_bitmap, MSR_FS_BASE); __vmx_disable_intercept_for_msr(msr_bitmap, MSR_GS_BASE); - set_bit(0, vmx_vpid_bitmap); /* 0 is reserved for host */ - if ((ret = ept_init())) { printk("EPT init failed, %d\n", ret); return ret;
diff --git a/kern/arch/x86/vmm/intel/vmx.h b/kern/arch/x86/vmm/intel/vmx.h index 22e00e5..abd4c12 100644 --- a/kern/arch/x86/vmm/intel/vmx.h +++ b/kern/arch/x86/vmm/intel/vmx.h
@@ -615,7 +615,6 @@ struct vmx_vcpu { int cpu; - int vpid; int launched; struct hw_trapframe regs; uint8_t fail;