Re: [PATCH 13/24] Implement VMREAD and VMWRITE

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Nadav Har'El
Date: Wednesday, August 4, 2010 - 4:46 am

On Wed, Jun 16, 2010, Gleb Natapov wrote about "Re: [PATCH 13/24] Implement VMREAD and VMWRITE":

Good catch, and I now do exactly what you suggested.

Both you and Eddie Dong noticed that the functions that set the success and
failure flags weren't quite doing the right thing, and certainly the
vm_instruction_error needs to be set on vmcs12, not vmcs02 - and this needs
to be done on every failValid - not only some of the places as the code now
had. I'm fixing all these cases.

I attach a new patch with just the 3 success/failure functions, and the list
of error codes (from the spec, vol 2B table 5-1).


Good idea - I'll do that.

----
Subject: [PATCH 09/26] nVMX: Success/failure of VMX instructions.

VMX instructions specify success or failure by setting certain RFLAGS bits.
This patch contains common functions to do this, and they will be used in
the following patches which emulate the various VMX instructions.

Signed-off-by: Nadav Har'El <nyh@il.ibm.com>
---
 arch/x86/include/asm/vmx.h |   31 +++++++++++++++++++++++++++++++
 arch/x86/kvm/vmx.c         |   30 ++++++++++++++++++++++++++++++
 2 files changed, 61 insertions(+)

--- .before/arch/x86/kvm/vmx.c	2010-08-04 14:40:56.000000000 +0300
+++ .after/arch/x86/kvm/vmx.c	2010-08-04 14:40:56.000000000 +0300
@@ -3817,6 +3817,36 @@ static int read_guest_vmcs_gpa(struct kv
 	return 0;
 }
 
+/*
+ * The following 3 functions, nested_vmx_succeed()/failValid()/failInvalid(),
+ * set the success or error code of an emulated VMX instruction, as specified
+ * by Vol 2B, VMX Instruction Reference, "Conventions".
+ */
+static void nested_vmx_succeed(struct kvm_vcpu *vcpu)
+{
+	vmx_set_rflags(vcpu, vmx_get_rflags(vcpu)
+			& ~(X86_EFLAGS_CF | X86_EFLAGS_PF | X86_EFLAGS_AF |
+		    	    X86_EFLAGS_ZF | X86_EFLAGS_SF | X86_EFLAGS_OF));
+}
+
+static void nested_vmx_failInvalid(struct kvm_vcpu *vcpu)
+{
+	vmx_set_rflags(vcpu, (vmx_get_rflags(vcpu)
+			& ~(X86_EFLAGS_PF | X86_EFLAGS_AF | X86_EFLAGS_ZF |
+			    X86_EFLAGS_SF | X86_EFLAGS_OF))
+			| X86_EFLAGS_CF);
+}
+
+static void nested_vmx_failValid(struct kvm_vcpu *vcpu,
+					u32 vm_instruction_error)
+{
+	vmx_set_rflags(vcpu, (vmx_get_rflags(vcpu)
+			& ~(X86_EFLAGS_CF | X86_EFLAGS_PF | X86_EFLAGS_AF |
+			    X86_EFLAGS_SF | X86_EFLAGS_OF))
+			| X86_EFLAGS_ZF);
+	get_vmcs12_fields(vcpu)->vm_instruction_error = vm_instruction_error;
+}
+
 static int handle_invlpg(struct kvm_vcpu *vcpu)
 {
 	unsigned long exit_qualification = vmcs_readl(EXIT_QUALIFICATION);
--- .before/arch/x86/include/asm/vmx.h	2010-08-04 14:40:56.000000000 +0300
+++ .after/arch/x86/include/asm/vmx.h	2010-08-04 14:40:56.000000000 +0300
@@ -409,4 +409,35 @@ struct vmx_msr_entry {
 	u64 value;
 } __aligned(16);
 
+/*
+ * VM-instruction error numbers
+ */
+enum vm_instruction_error_number {
+	VMXERR_VMCALL_IN_VMX_ROOT_OPERATION = 1,
+	VMXERR_VMCLEAR_INVALID_ADDRESS = 2,
+	VMXERR_VMCLEAR_VMXON_POINTER = 3,
+	VMXERR_VMLAUNCH_NONCLEAR_VMCS = 4,
+	VMXERR_VMRESUME_NONLAUNCHED_VMCS = 5,
+	VMXERR_VMRESUME_CORRUPTED_VMCS = 6,
+	VMXERR_ENTRY_INVALID_CONTROL_FIELD = 7,
+	VMXERR_ENTRY_INVALID_HOST_STATE_FIELD = 8,
+	VMXERR_VMPTRLD_INVALID_ADDRESS = 9,
+	VMXERR_VMPTRLD_VMXON_POINTER = 10,
+	VMXERR_VMPTRLD_INCORRECT_VMCS_REVISION_ID = 11,
+	VMXERR_UNSUPPORTED_VMCS_COMPONENT = 12,
+	VMXERR_VMWRITE_READ_ONLY_VMCS_COMPONENT = 13,
+	VMXERR_VMXON_IN_VMX_ROOT_OPERATION = 15,
+	VMXERR_ENTRY_INVALID_EXECUTIVE_VMCS_POINTER = 16,
+	VMXERR_ENTRY_NONLAUNCHED_EXECUTIVE_VMCS = 17,
+	VMXERR_ENTRY_EXECUTIVE_VMCS_POINTER_NOT_VMXON_POINTER = 18,
+	VMXERR_VMCALL_NONCLEAR_VMCS = 19,
+	VMXERR_VMCALL_INVALID_VM_EXIT_CONTROL_FIELDS = 20,
+	VMXERR_VMCALL_INCORRECT_MSEG_REVISION_ID = 22,
+	VMXERR_VMXOFF_UNDER_DUAL_MONITOR_TREATMENT_OF_SMIS_AND_SMM = 23,
+	VMXERR_VMCALL_INVALID_SMM_MONITOR_FEATURES = 24,
+	VMXERR_ENTRY_INVALID_VM_EXECUTION_CONTROL_FIELDS_IN_EXECUTIVE_VMCS = 25,
+	VMXERR_ENTRY_EVENTS_BLOCKED_BY_MOV_SS = 26,
+	VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID = 28,
+};
+
 #endif

-- 
Nadav Har'El                        |       Wednesday, Aug  4 2010, 24 Av 5770
nyh@math.technion.ac.il             |-----------------------------------------
Phone +972-523-790466, ICQ 13349191 |"A mathematician is a device for turning
http://nadav.harel.org.il           |coffee into theorems" -- P. Erdos
--
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)