svn commit: r272670 - in head/sys/amd64: include vmm vmm/intel

Neel Natu neel at FreeBSD.org
Mon Oct 6 20:48:03 UTC 2014


Author: neel
Date: Mon Oct  6 20:48:01 2014
New Revision: 272670
URL: https://svnweb.freebsd.org/changeset/base/272670

Log:
  Inject #UD into the guest when it executes either 'MONITOR' or 'MWAIT'.
  
  The hypervisor hides the MONITOR/MWAIT capability by unconditionally setting
  CPUID.01H:ECX[3] to 0 so the guest should not expect these instructions to
  be present anyways.
  
  Discussed with:	grehan

Modified:
  head/sys/amd64/include/vmm.h
  head/sys/amd64/vmm/intel/vmx.c
  head/sys/amd64/vmm/vmm.c

Modified: head/sys/amd64/include/vmm.h
==============================================================================
--- head/sys/amd64/include/vmm.h	Mon Oct  6 20:38:55 2014	(r272669)
+++ head/sys/amd64/include/vmm.h	Mon Oct  6 20:48:01 2014	(r272670)
@@ -485,6 +485,8 @@ enum vm_exitcode {
 	VM_EXITCODE_SUSPENDED,
 	VM_EXITCODE_INOUT_STR,
 	VM_EXITCODE_TASK_SWITCH,
+	VM_EXITCODE_MONITOR,
+	VM_EXITCODE_MWAIT,
 	VM_EXITCODE_MAX
 };
 

Modified: head/sys/amd64/vmm/intel/vmx.c
==============================================================================
--- head/sys/amd64/vmm/intel/vmx.c	Mon Oct  6 20:38:55 2014	(r272669)
+++ head/sys/amd64/vmm/intel/vmx.c	Mon Oct  6 20:48:01 2014	(r272670)
@@ -81,6 +81,8 @@ __FBSDID("$FreeBSD$");
 
 #define	PROCBASED_CTLS_ONE_SETTING 					\
 	(PROCBASED_SECONDARY_CONTROLS	|				\
+	 PROCBASED_MWAIT_EXITING	|				\
+	 PROCBASED_MONITOR_EXITING	|				\
 	 PROCBASED_IO_EXITING		|				\
 	 PROCBASED_MSR_BITMAPS		|				\
 	 PROCBASED_CTLS_WINDOW_SETTING	|				\
@@ -2373,6 +2375,12 @@ vmx_exit_process(struct vmx *vmx, int vc
 	case EXIT_REASON_XSETBV:
 		handled = vmx_emulate_xsetbv(vmx, vcpu, vmexit);
 		break;
+	case EXIT_REASON_MONITOR:
+		vmexit->exitcode = VM_EXITCODE_MONITOR;
+		break;
+	case EXIT_REASON_MWAIT:
+		vmexit->exitcode = VM_EXITCODE_MWAIT;
+		break;
 	default:
 		vmm_stat_incr(vmx->vm, vcpu, VMEXIT_UNKNOWN, 1);
 		break;

Modified: head/sys/amd64/vmm/vmm.c
==============================================================================
--- head/sys/amd64/vmm/vmm.c	Mon Oct  6 20:38:55 2014	(r272669)
+++ head/sys/amd64/vmm/vmm.c	Mon Oct  6 20:48:01 2014	(r272670)
@@ -1481,6 +1481,10 @@ restart:
 		case VM_EXITCODE_INOUT_STR:
 			error = vm_handle_inout(vm, vcpuid, vme, &retu);
 			break;
+		case VM_EXITCODE_MONITOR:
+		case VM_EXITCODE_MWAIT:
+			vm_inject_ud(vm, vcpuid);
+			break;
 		default:
 			retu = true;	/* handled in userland */
 			break;


More information about the svn-src-all mailing list