summaryrefslogtreecommitdiffstats
path: root/sys/amd64/vmm
diff options
context:
space:
mode:
authorneel <neel@FreeBSD.org>2014-12-30 02:44:33 +0000
committerneel <neel@FreeBSD.org>2014-12-30 02:44:33 +0000
commit2908c65b8a399b130475d035a20323fec6be16e8 (patch)
tree8e8d44d0ae615a6344b9e1c12a2c0f7fcc90a37a /sys/amd64/vmm
parente0fda903357d83d6014550a5f718916ae6fd899a (diff)
downloadFreeBSD-src-2908c65b8a399b130475d035a20323fec6be16e8.zip
FreeBSD-src-2908c65b8a399b130475d035a20323fec6be16e8.tar.gz
Inject #UD into the guest when it executes either 'MONITOR' or 'MWAIT' on
an AMD/SVM host. MFC after: 1 week
Diffstat (limited to 'sys/amd64/vmm')
-rw-r--r--sys/amd64/vmm/amd/svm.c13
-rw-r--r--sys/amd64/vmm/amd/vmcb.h2
2 files changed, 15 insertions, 0 deletions
diff --git a/sys/amd64/vmm/amd/svm.c b/sys/amd64/vmm/amd/svm.c
index 7d75046..ab47041 100644
--- a/sys/amd64/vmm/amd/svm.c
+++ b/sys/amd64/vmm/amd/svm.c
@@ -461,6 +461,9 @@ vmcb_init(struct svm_softc *sc, int vcpu, uint64_t iopm_base_pa,
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 vcpu, struct vm_exit *vmexit)
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;
diff --git a/sys/amd64/vmm/amd/vmcb.h b/sys/amd64/vmm/amd/vmcb.h
index d3e07ac..496f880 100644
--- a/sys/amd64/vmm/amd/vmcb.h
+++ b/sys/amd64/vmm/amd/vmcb.h
@@ -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
OpenPOWER on IntegriCloud