All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] kvm: nVMX: Check memory operand to INVVPID
@ 2017-06-27 17:59 Jim Mattson
  2017-06-28  8:48 ` David Hildenbrand
  2017-06-28 12:12 ` Paolo Bonzini
  0 siblings, 2 replies; 16+ messages in thread
From: Jim Mattson @ 2017-06-27 17:59 UTC (permalink / raw)
  To: kvm; +Cc: Jim Mattson

The memory operand fetched for INVVPID is 128 bits. Bits 63:16 are
reserved and must be zero.  Otherwise, the instruction fails with
VMfail(Invalid operand to INVEPT/INVVPID).  If the INVVPID_TYPE is 0
(individual address invalidation), then bits 127:64 must be in
canonical form, or the instruction fails with VMfail(Invalid operand
to INVEPT/INVVPID).

Signed-off-by: Jim Mattson <jmattson@google.com>
---
 arch/x86/kvm/vmx.c | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 42db3eb2d13b..9c34a98cc051 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -7651,7 +7651,11 @@ static int handle_invvpid(struct kvm_vcpu *vcpu)
 	unsigned long type, types;
 	gva_t gva;
 	struct x86_exception e;
-	int vpid;
+	struct {
+		u64 vpid : 16;
+		u64 rsvd : 48;
+		u64 gla;
+	} operand;
 
 	if (!(vmx->nested.nested_vmx_secondary_ctls_high &
 	      SECONDARY_EXEC_ENABLE_VPID) ||
@@ -7681,17 +7685,28 @@ static int handle_invvpid(struct kvm_vcpu *vcpu)
 	if (get_vmx_mem_address(vcpu, vmcs_readl(EXIT_QUALIFICATION),
 			vmx_instruction_info, false, &gva))
 		return 1;
-	if (kvm_read_guest_virt(&vcpu->arch.emulate_ctxt, gva, &vpid,
-				sizeof(u32), &e)) {
+	if (kvm_read_guest_virt(&vcpu->arch.emulate_ctxt, gva, &operand,
+				sizeof(operand), &e)) {
 		kvm_inject_page_fault(vcpu, &e);
 		return 1;
 	}
+	if (operand.rsvd) {
+		nested_vmx_failValid(vcpu,
+			VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID);
+		return kvm_skip_emulated_instruction(vcpu);
+	}
 
 	switch (type) {
 	case VMX_VPID_EXTENT_INDIVIDUAL_ADDR:
+		if (is_noncanonical_address(operand.gla)) {
+			nested_vmx_failValid(vcpu,
+				VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID);
+			return kvm_skip_emulated_instruction(vcpu);
+		}
+		/* fall through */
 	case VMX_VPID_EXTENT_SINGLE_CONTEXT:
 	case VMX_VPID_EXTENT_SINGLE_NON_GLOBAL:
-		if (!vpid) {
+		if (!operand.vpid) {
 			nested_vmx_failValid(vcpu,
 				VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID);
 			return kvm_skip_emulated_instruction(vcpu);
-- 
2.13.1.611.g7e3b11ae1-goog

^ permalink raw reply related	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2017-06-30 21:55 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-27 17:59 [PATCH] kvm: nVMX: Check memory operand to INVVPID Jim Mattson
2017-06-28  8:48 ` David Hildenbrand
2017-06-28 12:12 ` Paolo Bonzini
2017-06-28 16:37   ` [PATCH v2] " Jim Mattson
2017-06-28 16:43     ` Paolo Bonzini
     [not found]       ` <CALMp9eS7QGxZL-G_AFon03bodRB4dz22kG2fj5-fPDradtgESQ@mail.gmail.com>
2017-06-29  8:22         ` Paolo Bonzini
2017-06-29 17:52           ` [kvm-unit-tests PATCH 1/2] Move vmx_{on,off} into vmx.h Jim Mattson
2017-06-29 17:52             ` [kvm-unit-tests PATCH 2/2] Add basic invvpid test Jim Mattson
2017-06-29 18:46             ` [kvm-unit-tests PATCH v2 1/4] Save/restore handler in test_for_exception Jim Mattson
2017-06-29 18:46               ` [kvm-unit-tests PATCH v2 2/4] Specify %cs for exception_handler iret Jim Mattson
2017-06-29 18:46               ` [kvm-unit-tests PATCH v2 3/4] Move vmx_{on,off} into vmx.h Jim Mattson
2017-06-29 18:46               ` [kvm-unit-tests PATCH v2 4/4] Add basic invvpid test Jim Mattson
2017-06-30 10:21               ` [kvm-unit-tests PATCH v2 1/4] Save/restore handler in test_for_exception Paolo Bonzini
2017-06-29 18:14           ` [PATCH v2] kvm: nVMX: Check memory operand to INVVPID David Matlack
2017-06-30 21:55             ` Peter Feiner
2017-06-28 17:00     ` David Hildenbrand

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.