svn commit: r253553 - projects/bhyve_npt_pmap/sys/amd64/vmm/intel

Neel Natu neel at FreeBSD.org
Mon Jul 22 19:38:22 UTC 2013


Author: neel
Date: Mon Jul 22 19:38:21 2013
New Revision: 253553
URL: http://svnweb.freebsd.org/changeset/base/253553

Log:
  The macro 'VM_INSTRUCTION_ERROR' was implicitly assuming that %rsp pointed
  to 'struct vmxctx' associated with the vcpu.  This assumption was correct
  until now since this macro was called only after 'vmresume' and 'vmlaunch'.
  
  However when called from 'VMX_CHECK_EPTGEN' the %rsp is still pointing to
  the host stack and therefore results in a stack corruption when we update
  'vmxctx->launch_error'.
  
  Fix this by passing in the register that points to 'struct vmxctx' as a
  parameter to the macro.

Modified:
  projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmx_support.S

Modified: projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmx_support.S
==============================================================================
--- projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmx_support.S	Mon Jul 22 19:32:42 2013	(r253552)
+++ projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmx_support.S	Mon Jul 22 19:38:21 2013	(r253553)
@@ -92,15 +92,20 @@
 	movq	VMXCTX_GUEST_R15(%rdi),%r15;				\
 	movq	VMXCTX_GUEST_RDI(%rdi),%rdi; /* restore rdi the last */
 
-#define	VM_INSTRUCTION_ERROR(reg)					\
+/*
+ * Check for an error after executing a VMX instruction.
+ * 'errreg' will be zero on success and non-zero otherwise.
+ * 'ctxreg' points to the 'struct vmxctx' associated with the vcpu.
+ */
+#define	VM_INSTRUCTION_ERROR(errreg, ctxreg)				\
 	jnc 	1f;							\
-	movl 	$VM_FAIL_INVALID,reg;		/* CF is set */		\
+	movl 	$VM_FAIL_INVALID,errreg;		/* CF is set */	\
 	jmp 	3f;							\
 1:	jnz 	2f;							\
-	movl 	$VM_FAIL_VALID,reg;		/* ZF is set */		\
+	movl 	$VM_FAIL_VALID,errreg;		/* ZF is set */		\
 	jmp 	3f;							\
-2:	movl 	$VM_SUCCESS,reg;					\
-3:	movl	reg,VMXCTX_LAUNCH_ERROR(%rsp)
+2:	movl 	$VM_SUCCESS,errreg;					\
+3:	movl	errreg,VMXCTX_LAUNCH_ERROR(ctxreg)
 
 /*
  * set or clear the appropriate bit in 'pm_active'
@@ -143,7 +148,7 @@
 	invept	-16(%r11), %rax;					\
 									\
 	/* Check for invept error */					\
-	VM_INSTRUCTION_ERROR(%eax);					\
+	VM_INSTRUCTION_ERROR(%eax, %rdi);				\
 	testl	%eax, %eax;						\
 	jz	9f;							\
 									\
@@ -268,7 +273,7 @@ ENTRY(vmx_resume)
 	/*
 	 * Capture the reason why vmresume failed.
 	 */
-	VM_INSTRUCTION_ERROR(%eax)
+	VM_INSTRUCTION_ERROR(%eax, %rsp)
 
 	/* Return via vmx_setjmp with return value of VMX_RETURN_VMRESUME */
 	movq	%rsp,%rdi
@@ -304,7 +309,7 @@ ENTRY(vmx_launch)
 	/*
 	 * Capture the reason why vmlaunch failed.
 	 */
-	VM_INSTRUCTION_ERROR(%eax)
+	VM_INSTRUCTION_ERROR(%eax, %rsp)
 
 	/* Return via vmx_setjmp with return value of VMX_RETURN_VMLAUNCH */
 	movq	%rsp,%rdi


More information about the svn-src-projects mailing list