Multiplexing RFLAGS.TF

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



 static int db_interception(struct vcpu_svm *svm)
{
    struct kvm_run *kvm_run = svm->vcpu.run;

    if (!(svm->vcpu.guest_debug &
          (KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP)) &&
        !svm->nmi_singlestep) {
        kvm_queue_exception(&svm->vcpu, DB_VECTOR);
        return 1;
    }

    if (svm->nmi_singlestep) {
        svm->nmi_singlestep = false;
        if (!(svm->vcpu.guest_debug & KVM_GUESTDBG_SINGLESTEP))
            svm->vmcb->save.rflags &=
                ~(X86_EFLAGS_TF | X86_EFLAGS_RF);
        update_db_intercept(&svm->vcpu);
    }

This code assumes that either the guest is debugging itself, or (nmi_singlestep | guest debugging). However if the guest is debugging itself and takes an NMI, or if both host and guest are debugging the guest, things will go wrong.

So we need an rflags_guest_owned_bits, usually set to -1ULL, but sometimes (NMI, host debugging) clearing EFLAGS_TF. When we do that, we need to intercept instructions that influence RFLAGS.TF (POPF, IRET, INTn) and emulate them. Otherwise, the guest can disable tracing which was enabled on behalf of the host.

We also need to drop the 'return 1' on the top of the function to allow both guest and host tracing.

On Intel, the situation is harder. We can't trap POPF or IRET. What we can do, is use the Monitor Trap Flag on hosts that have it.

Comments? Perhaps I missed something. Maybe I'll try writing a test case to prove the brokenness, it's fashionable these days.

Jan, as this is your code, are you interested in doing this?

Sheng, the Intel bits?

--
error compiling committee.c: too many arguments to function

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux