diff options
author | Neel Natu <neel@FreeBSD.org> | 2014-12-30 02:44:33 +0000 |
---|---|---|
committer | Neel Natu <neel@FreeBSD.org> | 2014-12-30 02:44:33 +0000 |
commit | 95474bc26a9d4e6f583cf150e2c7e81b020dc319 (patch) | |
tree | 8e8d44d0ae615a6344b9e1c12a2c0f7fcc90a37a /sys/amd64/vmm/amd | |
parent | 12d7eaa009ea07989ffb05053a50aef59207f0ee (diff) | |
download | src-95474bc26a9d4e6f583cf150e2c7e81b020dc319.tar.gz src-95474bc26a9d4e6f583cf150e2c7e81b020dc319.zip |
Inject #UD into the guest when it executes either 'MONITOR' or 'MWAIT' on
an AMD/SVM host.
MFC after: 1 week
Notes
Notes:
svn path=/head/; revision=276392
Diffstat (limited to 'sys/amd64/vmm/amd')
-rw-r--r-- | sys/amd64/vmm/amd/svm.c | 13 | ||||
-rw-r--r-- | sys/amd64/vmm/amd/vmcb.h | 2 |
2 files changed, 15 insertions, 0 deletions
diff --git a/sys/amd64/vmm/amd/svm.c b/sys/amd64/vmm/amd/svm.c index 7d7504619e97..ab47041b4d88 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 d3e07acd0f31..496f88053c90 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 |