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;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to