svn commit: r276392 - head/sys/amd64/vmm/amd

Neel Natu neel at FreeBSD.org
Tue Dec 30 02:44:34 UTC 2014


Author: neel
Date: Tue Dec 30 02:44:33 2014
New Revision: 276392
URL: https://svnweb.freebsd.org/changeset/base/276392

Log:
  Inject #UD into the guest when it executes either 'MONITOR' or 'MWAIT' on
  an AMD/SVM host.
  
  MFC after:	1 week

Modified:
  head/sys/amd64/vmm/amd/svm.c
  head/sys/amd64/vmm/amd/vmcb.h

Modified: head/sys/amd64/vmm/amd/svm.c
==============================================================================
--- head/sys/amd64/vmm/amd/svm.c	Tue Dec 30 02:39:47 2014	(r276391)
+++ head/sys/amd64/vmm/amd/svm.c	Tue Dec 30 02:44:33 2014	(r276392)
@@ -461,6 +461,9 @@ vmcb_init(struct svm_softc *sc, int vcpu
 	svm_enable_intercept(sc, vcpu, VMCB_CTRL1_INTCPT,
 	    VMCB_INTCPT_FERR_FREEZE);
 
+	svm_enable_intercept(sc, vcpu, VMCB_CTRL2_INTCPT, VMCB_INTCPT_MONITOR);
+	svm_enable_intercept(sc, vcpu, VMCB_CTRL2_INTCPT, VMCB_INTCPT_MWAIT);
+
 	/*
 	 * From section "Canonicalization and Consistency Checks" in APMv2
 	 * the VMRUN intercept bit must be set to pass the consistency check.
@@ -1140,6 +1143,10 @@ exit_reason_to_str(uint64_t reason)
 		return ("msr");
 	case VMCB_EXIT_IRET:
 		return ("iret");
+	case VMCB_EXIT_MONITOR:
+		return ("monitor");
+	case VMCB_EXIT_MWAIT:
+		return ("mwait");
 	default:
 		snprintf(reasonbuf, sizeof(reasonbuf), "%#lx", reason);
 		return (reasonbuf);
@@ -1406,6 +1413,12 @@ svm_vmexit(struct svm_softc *svm_sc, int
 			    info2, info1, state->rip);
 		}
 		break;
+	case VMCB_EXIT_MONITOR:
+		vmexit->exitcode = VM_EXITCODE_MONITOR;
+		break;
+	case VMCB_EXIT_MWAIT:
+		vmexit->exitcode = VM_EXITCODE_MWAIT;
+		break;
 	default:
 		vmm_stat_incr(svm_sc->vm, vcpu, VMEXIT_UNKNOWN, 1);
 		break;

Modified: head/sys/amd64/vmm/amd/vmcb.h
==============================================================================
--- head/sys/amd64/vmm/amd/vmcb.h	Tue Dec 30 02:39:47 2014	(r276391)
+++ head/sys/amd64/vmm/amd/vmcb.h	Tue Dec 30 02:44:33 2014	(r276392)
@@ -140,6 +140,8 @@ struct svm_softc;
 #define	VMCB_EXIT_MSR			0x7C
 #define	VMCB_EXIT_SHUTDOWN		0x7F
 #define	VMCB_EXIT_VMSAVE		0x83
+#define	VMCB_EXIT_MONITOR		0x8A
+#define	VMCB_EXIT_MWAIT			0x8B
 #define	VMCB_EXIT_NPF			0x400
 #define	VMCB_EXIT_INVALID		-1
 


More information about the svn-src-head mailing list