[PATCH 10/24] Implement VMPTRLD

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Nadav Har'El
Date: Sunday, June 13, 2010 - 5:27 am

This patch implements the VMPTRLD instruction.

Signed-off-by: Nadav Har'El <nyh@il.ibm.com>
---
--- .before/arch/x86/kvm/vmx.c	2010-06-13 15:01:29.000000000 +0300
+++ .after/arch/x86/kvm/vmx.c	2010-06-13 15:01:29.000000000 +0300
@@ -3829,6 +3829,26 @@ static int read_guest_vmcs_gpa(struct kv
 	return 0;
 }
 
+static void set_rflags_to_vmx_fail_invalid(struct kvm_vcpu *vcpu)
+{
+	unsigned long rflags;
+	rflags = vmx_get_rflags(vcpu);
+	rflags |= X86_EFLAGS_CF;
+	rflags &= ~X86_EFLAGS_PF & ~X86_EFLAGS_AF & ~X86_EFLAGS_ZF &
+		~X86_EFLAGS_SF & ~X86_EFLAGS_OF;
+	vmx_set_rflags(vcpu, rflags);
+}
+
+static void set_rflags_to_vmx_fail_valid(struct kvm_vcpu *vcpu)
+{
+	unsigned long rflags;
+	rflags = vmx_get_rflags(vcpu);
+	rflags |= X86_EFLAGS_ZF;
+	rflags &= ~X86_EFLAGS_PF & ~X86_EFLAGS_AF & ~X86_EFLAGS_CF &
+		~X86_EFLAGS_SF & ~X86_EFLAGS_OF;
+	vmx_set_rflags(vcpu, rflags);
+}
+
 static void clear_rflags_cf_zf(struct kvm_vcpu *vcpu)
 {
 	unsigned long rflags;
@@ -3869,6 +3889,57 @@ static int handle_vmclear(struct kvm_vcp
 	return 1;
 }
 
+static bool verify_vmcs12_revision(struct kvm_vcpu *vcpu, gpa_t guest_vmcs_addr)
+{
+	bool ret;
+	struct vmcs12 *vmcs12;
+	struct page *vmcs_page = nested_get_page(vcpu, guest_vmcs_addr);
+	if (vmcs_page == NULL)
+		return 0;
+	vmcs12 = (struct vmcs12 *)kmap_atomic(vmcs_page, KM_USER0);
+	if (vmcs12->revision_id == VMCS12_REVISION)
+		ret = 1;
+	else {
+		set_rflags_to_vmx_fail_valid(vcpu);
+		ret = 0;
+	}
+	kunmap_atomic(vmcs12, KM_USER0);
+	kvm_release_page_dirty(vmcs_page);
+	return ret;
+}
+
+/* Emulate the VMPTRLD instruction */
+static int handle_vmptrld(struct kvm_vcpu *vcpu)
+{
+	struct vcpu_vmx *vmx = to_vmx(vcpu);
+	gpa_t guest_vmcs_addr;
+
+	if (!nested_vmx_check_permission(vcpu))
+		return 1;
+
+	if (read_guest_vmcs_gpa(vcpu, &guest_vmcs_addr)) {
+		set_rflags_to_vmx_fail_invalid(vcpu);
+		return 1;
+	}
+
+	if (!verify_vmcs12_revision(vcpu, guest_vmcs_addr))
+		return 1;
+
+	if (vmx->nested.current_vmptr != guest_vmcs_addr) {
+		vmx->nested.current_vmptr = guest_vmcs_addr;
+
+		if (nested_create_current_vmcs(vcpu)) {
+			printk(KERN_ERR "%s error could not allocate memory",
+				__func__);
+			return -ENOMEM;
+		}
+	}
+
+	clear_rflags_cf_zf(vcpu);
+	skip_emulated_instruction(vcpu);
+	return 1;
+}
+
 static int handle_invlpg(struct kvm_vcpu *vcpu)
 {
 	unsigned long exit_qualification = vmcs_readl(EXIT_QUALIFICATION);
@@ -4153,7 +4224,7 @@ static int (*kvm_vmx_exit_handlers[])(st
 	[EXIT_REASON_VMCALL]                  = handle_vmcall,
 	[EXIT_REASON_VMCLEAR]	              = handle_vmclear,
 	[EXIT_REASON_VMLAUNCH]                = handle_vmx_insn,
-	[EXIT_REASON_VMPTRLD]                 = handle_vmx_insn,
+	[EXIT_REASON_VMPTRLD]                 = handle_vmptrld,
 	[EXIT_REASON_VMPTRST]                 = handle_vmx_insn,
 	[EXIT_REASON_VMREAD]                  = handle_vmx_insn,
 	[EXIT_REASON_VMRESUME]                = handle_vmx_insn,
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 0/24] Nested VMX, v5, Nadav Har'El, (Sun Jun 13, 5:22 am)
[PATCH 1/24] Move nested option from svm.c to x86.c, Nadav Har'El, (Sun Jun 13, 5:23 am)
[PATCH 3/24] Implement VMXON and VMXOFF, Nadav Har'El, (Sun Jun 13, 5:24 am)
[PATCH 4/24] Allow setting the VMXE bit in CR4, Nadav Har'El, (Sun Jun 13, 5:24 am)
[PATCH 5/24] Introduce vmcs12: a VMCS structure for L1, Nadav Har'El, (Sun Jun 13, 5:25 am)
[PATCH 6/24] Implement reading and writing of VMX MSRs, Nadav Har'El, (Sun Jun 13, 5:25 am)
[PATCH 8/24] Hold a vmcs02 for each vmcs12, Nadav Har'El, (Sun Jun 13, 5:26 am)
[PATCH 9/24] Implement VMCLEAR, Nadav Har'El, (Sun Jun 13, 5:27 am)
[PATCH 10/24] Implement VMPTRLD, Nadav Har'El, (Sun Jun 13, 5:27 am)
[PATCH 11/24] Implement VMPTRST, Nadav Har'El, (Sun Jun 13, 5:28 am)
[PATCH 12/24] Add VMCS fields to the vmcs12, Nadav Har'El, (Sun Jun 13, 5:28 am)
[PATCH 13/24] Implement VMREAD and VMWRITE, Nadav Har'El, (Sun Jun 13, 5:29 am)
[PATCH 14/24] Prepare vmcs02 from vmcs01 and vmcs12, Nadav Har'El, (Sun Jun 13, 5:29 am)
[PATCH 15/24] Move register-syncing to a function, Nadav Har'El, (Sun Jun 13, 5:30 am)
[PATCH 16/24] Implement VMLAUNCH and VMRESUME, Nadav Har'El, (Sun Jun 13, 5:30 am)
[PATCH 18/24] Exiting from L2 to L1, Nadav Har'El, (Sun Jun 13, 5:31 am)
[PATCH 20/24] Correct handling of interrupt injection, Nadav Har'El, (Sun Jun 13, 5:32 am)
[PATCH 21/24] Correct handling of exception injection, Nadav Har'El, (Sun Jun 13, 5:33 am)
[PATCH 22/24] Correct handling of idt vectoring info, Nadav Har'El, (Sun Jun 13, 5:33 am)
[PATCH 24/24] Miscellenous small corrections, Nadav Har'El, (Sun Jun 13, 5:34 am)
Re: [PATCH 3/24] Implement VMXON and VMXOFF, Avi Kivity, (Mon Jun 14, 1:21 am)
Re: [PATCH 8/24] Hold a vmcs02 for each vmcs12, Avi Kivity, (Mon Jun 14, 1:57 am)
Re: [PATCH 9/24] Implement VMCLEAR, Avi Kivity, (Mon Jun 14, 2:03 am)
Re: [PATCH 10/24] Implement VMPTRLD, Avi Kivity, (Mon Jun 14, 2:07 am)
Re: [PATCH 11/24] Implement VMPTRST, Avi Kivity, (Mon Jun 14, 2:15 am)
Re: [PATCH 12/24] Add VMCS fields to the vmcs12, Avi Kivity, (Mon Jun 14, 2:24 am)
Re: [PATCH 13/24] Implement VMREAD and VMWRITE, Avi Kivity, (Mon Jun 14, 2:36 am)
Re: [PATCH 16/24] Implement VMLAUNCH and VMRESUME, Avi Kivity, (Mon Jun 14, 4:41 am)
Re: [PATCH 18/24] Exiting from L2 to L1, Avi Kivity, (Mon Jun 14, 5:04 am)
Re: [PATCH 0/24] Nested VMX, v5, Avi Kivity, (Mon Jun 14, 5:34 am)
Re: [PATCH 0/24] Nested VMX, v5, Nadav Har'El, (Mon Jun 14, 6:03 am)
Re: [PATCH 0/24] Nested VMX, v5, Avi Kivity, (Tue Jun 15, 3:00 am)
Re: [PATCH 4/24] Allow setting the VMXE bit in CR4, Gleb Natapov, (Tue Jun 15, 4:09 am)
Re: [PATCH 9/24] Implement VMCLEAR, Gleb Natapov, (Tue Jun 15, 6:47 am)
Re: [PATCH 9/24] Implement VMCLEAR, Avi Kivity, (Tue Jun 15, 6:50 am)
Re: [PATCH 9/24] Implement VMCLEAR, Gleb Natapov, (Tue Jun 15, 6:54 am)
Re: [PATCH 1/24] Move nested option from svm.c to x86.c, Nadav Har'El, (Tue Jun 15, 7:27 am)
Re: [PATCH 4/24] Allow setting the VMXE bit in CR4, Nadav Har'El, (Tue Jun 15, 7:44 am)
Re: [PATCH 3/24] Implement VMXON and VMXOFF, Marcelo Tosatti, (Tue Jun 15, 1:18 pm)
Re: [PATCH 3/24] Implement VMXON and VMXOFF, Nadav Har'El, (Wed Jun 16, 12:50 am)
Re: [PATCH 3/24] Implement VMXON and VMXOFF, Nadav Har'El, (Wed Jun 16, 4:14 am)
Re: [PATCH 3/24] Implement VMXON and VMXOFF, Avi Kivity, (Wed Jun 16, 4:26 am)
Re: [PATCH 10/24] Implement VMPTRLD, Gleb Natapov, (Wed Jun 16, 6:36 am)
Re: [PATCH 11/24] Implement VMPTRST, Gleb Natapov, (Wed Jun 16, 6:53 am)
Re: [PATCH 12/24] Add VMCS fields to the vmcs12, Gleb Natapov, (Wed Jun 16, 7:18 am)
Re: [PATCH 13/24] Implement VMREAD and VMWRITE, Gleb Natapov, (Wed Jun 16, 7:48 am)
Re: [PATCH 13/24] Implement VMREAD and VMWRITE, Gleb Natapov, (Wed Jun 16, 8:03 am)
Re: [PATCH 11/24] Implement VMPTRST, Nadav Har'El, (Wed Jun 16, 8:33 am)
Re: [PATCH 14/24] Prepare vmcs02 from vmcs01 and vmcs12, Gleb Natapov, (Thu Jun 17, 1:50 am)
Re: [PATCH 16/24] Implement VMLAUNCH and VMRESUME, Gleb Natapov, (Thu Jun 17, 3:59 am)
Re: [PATCH 5/24] Introduce vmcs12: a VMCS structure for L1, Alexander Graf, (Wed Jun 23, 2:15 am)
RE: [PATCH 9/24] Implement VMCLEAR, Dong, Eddie, (Mon Jul 5, 7:56 pm)
RE: [PATCH 10/24] Implement VMPTRLD, Dong, Eddie, (Mon Jul 5, 8:09 pm)
RE: [PATCH 8/24] Hold a vmcs02 for each vmcs12, Dong, Eddie, (Tue Jul 6, 2:50 am)
RE: [PATCH 0/24] Nested VMX, v5, Dong, Eddie, (Fri Jul 9, 1:59 am)
Re: [PATCH 0/24] Nested VMX, v5, Nadav Har'El, (Sun Jul 11, 1:27 am)
Re: [PATCH 0/24] Nested VMX, v5, Alexander Graf, (Sun Jul 11, 4:05 am)
Re: [PATCH 0/24] Nested VMX, v5, Nadav Har'El, (Sun Jul 11, 5:49 am)
Re: [PATCH 0/24] Nested VMX, v5, Avi Kivity, (Sun Jul 11, 6:12 am)
Re: [PATCH 0/24] Nested VMX, v5, Avi Kivity, (Sun Jul 11, 6:20 am)
Re: [PATCH 0/24] Nested VMX, v5, Nadav Har'El, (Sun Jul 11, 8:39 am)
Re: [PATCH 0/24] Nested VMX, v5, Avi Kivity, (Sun Jul 11, 8:45 am)
Re: [PATCH 0/24] Nested VMX, v5, Sheng Yang, (Wed Jul 14, 8:27 pm)
Re: [PATCH 8/24] Hold a vmcs02 for each vmcs12, Nadav Har'El, (Mon Aug 2, 6:38 am)
Re: [PATCH 9/24] Implement VMCLEAR, Nadav Har'El, (Tue Aug 3, 5:12 am)
Re: [PATCH 13/24] Implement VMREAD and VMWRITE, Nadav Har'El, (Wed Aug 4, 4:46 am)
Re: [PATCH 13/24] Implement VMREAD and VMWRITE, Nadav Har'El, (Wed Aug 4, 6:42 am)
Re: [PATCH 13/24] Implement VMREAD and VMWRITE, Nadav Har'El, (Wed Aug 4, 9:09 am)
Re: [PATCH 13/24] Implement VMREAD and VMWRITE, Avi Kivity, (Wed Aug 4, 9:41 am)
Re: [PATCH 10/24] Implement VMPTRLD, Nadav Har'El, (Thu Aug 5, 4:13 am)
Re: [PATCH 10/24] Implement VMPTRLD, Nadav Har'El, (Thu Aug 5, 4:35 am)
Re: [PATCH 9/24] Implement VMCLEAR, Nadav Har'El, (Thu Aug 5, 4:50 am)
Re: [PATCH 9/24] Implement VMCLEAR, Gleb Natapov, (Thu Aug 5, 4:53 am)
Re: [PATCH 9/24] Implement VMCLEAR, Nadav Har'El, (Thu Aug 5, 5:01 am)
Re: [PATCH 9/24] Implement VMCLEAR, Avi Kivity, (Thu Aug 5, 5:03 am)
Re: [PATCH 9/24] Implement VMCLEAR, Avi Kivity, (Thu Aug 5, 5:05 am)
Re: [PATCH 9/24] Implement VMCLEAR, Nadav Har'El, (Thu Aug 5, 5:10 am)
Re: [PATCH 9/24] Implement VMCLEAR, Avi Kivity, (Thu Aug 5, 5:13 am)
Re: [PATCH 9/24] Implement VMCLEAR, Nadav Har'El, (Thu Aug 5, 5:29 am)
Re: [PATCH 18/24] Exiting from L2 to L1, Nadav Har'El, (Sun Sep 12, 7:05 am)
Re: [PATCH 18/24] Exiting from L2 to L1, Avi Kivity, (Sun Sep 12, 7:29 am)
Re: [PATCH 18/24] Exiting from L2 to L1, Nadav Har'El, (Sun Sep 12, 10:05 am)
Re: [PATCH 18/24] Exiting from L2 to L1, Avi Kivity, (Sun Sep 12, 10:21 am)
Re: [PATCH 18/24] Exiting from L2 to L1, Nadav Har'El, (Sun Sep 12, 12:51 pm)
Re: [PATCH 18/24] Exiting from L2 to L1, Sheng Yang, (Sun Sep 12, 10:53 pm)
Re: [PATCH 18/24] Exiting from L2 to L1, Avi Kivity, (Mon Sep 13, 1:48 am)
Re: [PATCH 18/24] Exiting from L2 to L1, Avi Kivity, (Mon Sep 13, 1:52 am)
Re: [PATCH 18/24] Exiting from L2 to L1, Nadav Har'El, (Mon Sep 13, 2:01 am)
Re: [PATCH 18/24] Exiting from L2 to L1, Avi Kivity, (Mon Sep 13, 2:34 am)
Re: [PATCH 18/24] Exiting from L2 to L1, Nadav Har'El, (Tue Sep 14, 6:07 am)
Re: [PATCH 16/24] Implement VMLAUNCH and VMRESUME, Nadav Har'El, (Thu Sep 16, 9:06 am)
Re: [PATCH 22/24] Correct handling of idt vectoring info, Nadav Har'El, (Sun Sep 19, 11:37 pm)
Re: [PATCH 16/24] Implement VMLAUNCH and VMRESUME, Nadav Har'El, (Sun Sep 26, 4:14 am)
Re: [PATCH 16/24] Implement VMLAUNCH and VMRESUME, Avi Kivity, (Sun Sep 26, 5:56 am)
Re: [PATCH 16/24] Implement VMLAUNCH and VMRESUME, Nadav Har'El, (Sun Sep 26, 6:06 am)
Re: [PATCH 16/24] Implement VMLAUNCH and VMRESUME, Avi Kivity, (Sun Sep 26, 6:51 am)
Re: [PATCH 0/24] Nested VMX, v5, Nadav Har'El, (Sun Oct 17, 5:03 am)
Re: [PATCH 0/24] Nested VMX, v5, Avi Kivity, (Sun Oct 17, 5:10 am)
Re: [PATCH 0/24] Nested VMX, v5, Nadav Har'El, (Sun Oct 17, 5:39 am)
Re: [PATCH 0/24] Nested VMX, v5, Avi Kivity, (Sun Oct 17, 6:35 am)