From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Multiplexing RFLAGS.TF Date: Thu, 29 Jul 2010 17:37:53 +0300 Message-ID: <4C519241.2010706@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit To: KVM list , Sheng Yang , Jan Kiszka , Marcelo Tosatti Return-path: Received: from mx1.redhat.com ([209.132.183.28]:61867 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754069Ab0G2Oh4 (ORCPT ); Thu, 29 Jul 2010 10:37:56 -0400 Sender: kvm-owner@vger.kernel.org List-ID: 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