Messages in this thread Patch in this message | | | From | Paolo Bonzini <> | Subject | [FYI PATCH 18/20] KVM: nVMX: emulate the INVVPID instruction | Date | Mon, 28 Sep 2015 12:39:03 +0200 |
| |
From: Wanpeng Li <wanpeng.li@hotmail.com>
Add the INVVPID instruction emulation.
Reviewed-by: Wincy Van <fanwenyi0529@gmail.com> Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- arch/x86/include/asm/vmx.h | 1 + arch/x86/kvm/vmx.c | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h index 448b7ca61aee..53c9567a29d1 100644 --- a/arch/x86/include/asm/vmx.h +++ b/arch/x86/include/asm/vmx.h @@ -397,6 +397,7 @@ enum vmcs_field { #define IDENTITY_PAGETABLE_PRIVATE_MEMSLOT (KVM_USER_MEM_SLOTS + 2) #define VMX_NR_VPIDS (1 << 16) +#define VMX_VPID_EXTENT_INDIVIDUAL_ADDR 0 #define VMX_VPID_EXTENT_SINGLE_CONTEXT 1 #define VMX_VPID_EXTENT_ALL_CONTEXT 2 diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index e1cb4aa026a2..bb7ae30caa13 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -7186,7 +7186,28 @@ static int handle_invept(struct kvm_vcpu *vcpu) static int handle_invvpid(struct kvm_vcpu *vcpu) { - kvm_queue_exception(vcpu, UD_VECTOR); + u32 vmx_instruction_info; + unsigned long type; + + if (!nested_vmx_check_permission(vcpu)) + return 1; + + vmx_instruction_info = vmcs_read32(VMX_INSTRUCTION_INFO); + type = kvm_register_readl(vcpu, (vmx_instruction_info >> 28) & 0xf); + + switch (type) { + case VMX_VPID_EXTENT_INDIVIDUAL_ADDR: + case VMX_VPID_EXTENT_SINGLE_CONTEXT: + case VMX_VPID_EXTENT_ALL_CONTEXT: + vmx_flush_tlb(vcpu); + nested_vmx_succeed(vcpu); + break; + default: + nested_vmx_failInvalid(vcpu); + break; + } + + skip_emulated_instruction(vcpu); return 1; } -- 1.8.3.1
| |