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;