summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpd <pd@cvs.openbsd.org>2019-05-10 20:17:42 +0000
committerpd <pd@cvs.openbsd.org>2019-05-10 20:17:42 +0000
commit4fe10ec4ec044375f721764e522e1d5e83833b14 (patch)
treef67f996ea398c77711cb9b7ab15d816c9eda7a7c
parent66ae7d467b454fe2df3e196af6900e24814de65f (diff)
vmm: handle some unhandled exits for SVM
There were some exits for instructions that were unhandled and caused the guest to terminate if it tried to execute them. We now inject a #ud for those. Also intercept and #ud RDTSCP and INVLPGA instructions. ok mlarkin@
-rw-r--r--sys/arch/amd64/amd64/vmm.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/sys/arch/amd64/amd64/vmm.c b/sys/arch/amd64/amd64/vmm.c
index 12aeff8b24d..c651f1e88bc 100644
--- a/sys/arch/amd64/amd64/vmm.c
+++ b/sys/arch/amd64/amd64/vmm.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vmm.c,v 1.241 2019/04/22 20:31:37 mlarkin Exp $ */
+/* $OpenBSD: vmm.c,v 1.242 2019/05/10 20:17:41 pd Exp $ */
/*
* Copyright (c) 2014 Mike Larkin <mlarkin@openbsd.org>
*
@@ -1970,6 +1970,8 @@ vcpu_reset_regs_svm(struct vcpu *vcpu, struct vcpu_reg_state *vrs)
* MWAIT instruction (SVM_INTERCEPT_MWAIT_UNCOND)
* MWAIT instruction (SVM_INTERCEPT_MWAIT_COND)
* MONITOR instruction (SVM_INTERCEPT_MONITOR)
+ * RDTSCP instruction (SVM_INTERCEPT_RDTSCP)
+ * INVLPGA instruction (SVM_INTERCEPT_INVLPGA)
* XSETBV instruction (SVM_INTERCEPT_XSETBV) (if available)
*/
vmcb->v_intercept1 = SVM_INTERCEPT_INTR | SVM_INTERCEPT_NMI |
@@ -1980,7 +1982,8 @@ vcpu_reset_regs_svm(struct vcpu *vcpu, struct vcpu_reg_state *vrs)
SVM_INTERCEPT_VMLOAD | SVM_INTERCEPT_VMSAVE | SVM_INTERCEPT_STGI |
SVM_INTERCEPT_CLGI | SVM_INTERCEPT_SKINIT | SVM_INTERCEPT_ICEBP |
SVM_INTERCEPT_MWAIT_UNCOND | SVM_INTERCEPT_MONITOR |
- SVM_INTERCEPT_MWAIT_COND;
+ SVM_INTERCEPT_MWAIT_COND | SVM_INTERCEPT_RDTSCP |
+ SVM_INTERCEPT_INVLPGA;
if (xsave_mask)
vmcb->v_intercept2 |= SVM_INTERCEPT_XSETBV;
@@ -4568,6 +4571,16 @@ svm_handle_exit(struct vcpu *vcpu)
case SVM_VMEXIT_MWAIT:
case SVM_VMEXIT_MWAIT_CONDITIONAL:
case SVM_VMEXIT_MONITOR:
+ case SVM_VMEXIT_VMRUN:
+ case SVM_VMEXIT_VMMCALL:
+ case SVM_VMEXIT_VMLOAD:
+ case SVM_VMEXIT_VMSAVE:
+ case SVM_VMEXIT_STGI:
+ case SVM_VMEXIT_CLGI:
+ case SVM_VMEXIT_SKINIT:
+ case SVM_VMEXIT_RDTSCP:
+ case SVM_VMEXIT_ICEBP:
+ case SVM_VMEXIT_INVLPGA:
ret = vmm_inject_ud(vcpu);
update_rip = 0;
break;