Re: [PATCH 5/6] KVM: x86: Preserve injected TF across emulation

Gleb Natapov
2010-02-23T10:31:06Z

On Tue, Feb 23, 2010 at 11:13:13AM +0100, Jan Kiszka wrote:
> Gleb Natapov wrote:
> > On Mon, Feb 22, 2010 at 06:51:22PM +0100, Jan Kiszka wrote:
> >> Call directly into the vendor services for getting/setting rflags in
> >> emulate_instruction to ensure injected TF survives the emulation.
> >>
> >> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> >> ---
> >> arch/x86/kvm/x86.c | 4 ++--
> >> 1 files changed, 2 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> >> index e2e03a4..19e8b28 100644
> >> --- a/arch/x86/kvm/x86.c
> >> +++ b/arch/x86/kvm/x86.c
> >> @@ -3468,7 +3468,7 @@ int emulate_instruction(struct kvm_vcpu *vcpu,
> >> kvm_x86_ops->get_cs_db_l_bits(vcpu, &cs_db, &cs_l);
> >>
> >> vcpu->arch.emulate_ctxt.vcpu = vcpu;
> >> - vcpu->arch.emulate_ctxt.eflags = kvm_get_rflags(vcpu);
> >> + vcpu->arch.emulate_ctxt.eflags = kvm_x86_ops->get_rflags(vcpu);
> > So now emulator runs with injected TF? Hmm, then may be emulator should
> > inject DB when appropriate and caller of emulate_instruction() should
> > emulate DB intercept if external debugging is going on?
>
> That is what patch 6 aims at, both for external as well as
> guest-internal debugging.
>
It does at the wrong level. It tries to do it above emulator, but only emulator
knows what is the sate of instruction emulation and when emulation is completed.
If at this point TF is set it inject DB trap. The code above checks if
DB intercept is enabled when DB is injected and calls usual DB intercept
path.

> >
> >> vcpu->arch.emulate_ctxt.mode =
> >> (!is_protmode(vcpu)) ? X86EMUL_MODE_REAL :
> >> (vcpu->arch.emulate_ctxt.eflags & X86_EFLAGS_VM)
> >> @@ -3547,7 +3547,7 @@ int emulate_instruction(struct kvm_vcpu *vcpu,
> >> return EMULATE_DO_MMIO;
> >> }
> >>
> >> - kvm_set_rflags(vcpu, vcpu->arch.emulate_ctxt.eflags);
> >> + kvm_x86_ops->set_rflags(vcpu, vcpu->arch.emulate_ctxt.eflags);
> >>
> >> if (vcpu->mmio_is_write) {
> >> vcpu->mmio_needed = 0;
> >> --
> >> 1.6.0.2
>
> Jan
>
> --
> Siemens AG, Corporate Technology, CT T DE IT 1
> Corporate Competence Center Embedded Linux

--
Gleb.