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

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

 



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@xxxxxxxxxxx>
> >> ---
> >>  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.
--
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