Page MenuHomeFreeBSD

D42295.id129104.diff
No OneTemporary

D42295.id129104.diff

diff --git a/sys/amd64/vmm/amd/svm.c b/sys/amd64/vmm/amd/svm.c
--- a/sys/amd64/vmm/amd/svm.c
+++ b/sys/amd64/vmm/amd/svm.c
@@ -1421,6 +1421,13 @@
break;
case IDT_BP:
+ vmexit->exitcode = VM_EXITCODE_BPT;
+ vmexit->u.bpt.inst_length = vmexit->inst_length;
+ vmexit->inst_length = 0;
+
+ reflect = 0;
+ handled = 0;
+ break;
case IDT_OF:
case IDT_BR:
/*
@@ -1442,11 +1449,12 @@
info1 = 0;
break;
}
- KASSERT(vmexit->inst_length == 0, ("invalid inst_length (%d) "
- "when reflecting exception %d into guest",
- vmexit->inst_length, idtvec));
if (reflect) {
+ KASSERT(vmexit->inst_length == 0,
+ ("invalid inst_length (%d) "
+ "when reflecting exception %d into guest",
+ vmexit->inst_length, idtvec));
/* Reflect the exception back into the guest */
SVM_CTR2(vcpu, "Reflecting exception "
"%d/%#x into the guest", idtvec, (int)info1);
@@ -1454,8 +1462,8 @@
errcode_valid, info1, 0);
KASSERT(error == 0, ("%s: vm_inject_exception error %d",
__func__, error));
+ handled = 1;
}
- handled = 1;
break;
case VMCB_EXIT_MSR: /* MSR access. */
eax = state->rax;
@@ -2332,6 +2340,9 @@
if (val == 0)
error = EINVAL;
break;
+ case VM_CAP_BPT_EXIT:
+ svm_set_intercept(vcpu, VMCB_EXC_INTCPT, BIT(IDT_BP), val);
+ break;
case VM_CAP_IPI_EXIT:
vlapic = vm_lapic(vcpu->vcpu);
vlapic->ipi_exit = val;
@@ -2365,6 +2376,9 @@
case VM_CAP_UNRESTRICTED_GUEST:
*retval = 1; /* unrestricted guest is always enabled */
break;
+ case VM_CAP_BPT_EXIT:
+ *retval = svm_get_intercept(vcpu, VMCB_EXC_INTCPT, BIT(IDT_BP));
+ break;
case VM_CAP_IPI_EXIT:
vlapic = vm_lapic(vcpu->vcpu);
*retval = vlapic->ipi_exit;

File Metadata

Mime Type
text/plain
Expires
Wed, Apr 8, 7:09 AM (12 h, 27 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31084605
Default Alt Text
D42295.id129104.diff (1 KB)

Event Timeline