KVM: x86: Polish exception injection via KVM_SET_GUEST_DEBUG
PATCH 1/1 KVM: x86: Polish exception injection via KVM_SET_GUEST_DEBUG
Decouple KVM_GUESTDBG_INJECT_DB and KVM_GUESTDBG_INJECT_BP from KVM_GUESTDBG_ENABLE, their are actually orthogonal. At this chance, avoid triggering the WARN_ON in kvm_queue_exception if there is already an exception pending and reject such invalid requests.
Signed-off-by Jan Kiszka <[email protected]>
---
arch/x86/kvm/x86.c | 20 ++++++++++++++------ 1 files changed, 14 insertions(+), 6 deletions(-)
arch/x86/kvm/x86.c +14 -6
@@ -4636,10 +4636,20 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, struct kvm_guest_debug *dbg) {unsigned long rflags; -int i; +int i, r;vcpu_load (vcpu); +if (dbg->control & (KVM_GUESTDBG_INJECT_DB |KVM_GUESTDBG_INJECT_BP )) { + r = -EBUSY ; +if (vcpu->arch.exception.pending) + goto unlock_out; +if (dbg->control &KVM_GUESTDBG_INJECT_DB ) +kvm_queue_exception (vcpu,DB_VECTOR ); +else +kvm_queue_exception (vcpu,BP_VECTOR ); + } +/* * Read rflags as long as potentially injected trace flags are still * filtered out.
@@ -4675,14 +4685,12 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, kvm_x86_ops->set_guest_debug (vcpu, dbg); -if (vcpu->guest_debug &KVM_GUESTDBG_INJECT_DB ) -kvm_queue_exception (vcpu,DB_VECTOR ); -else if (vcpu->guest_debug &KVM_GUESTDBG_INJECT_BP ) -kvm_queue_exception (vcpu,BP_VECTOR ); + r =0 ; +unlock_out:vcpu_put (vcpu); -return 0 ; +return r; }/*
Marcelo Tosatti
AppliedQuoted 6 lines · Jan Kiszka
Decouple
KVM_GUESTDBG_INJECT_DBandKVM_GUESTDBG_INJECT_BPfromKVM_GUESTDBG_ENABLE, their are actually orthogonal. At this chance, avoid triggering theWARN_ONinkvm_queue_exceptionif there is already an exception pending and reject such invalid requests.Signed-off-by Jan Kiszka <[email protected]>
Applied, thanks.