On Mon, Nov 28, 2016 at 3:42 AM, Paolo Bonzini <pbonzini@xxxxxxxxxx> wrote: > > > On 28/11/2016 05:18, Kyle Huey wrote: >> + >> + if (unlikely(vmx_get_rflags(vcpu) & X86_EFLAGS_TF)) { >> + if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP) { >> + vcpu->run->debug.arch.dr6 = DR6_BS | DR6_FIXED_1 | >> + DR6_RTM; >> + vcpu->run->debug.arch.pc = vcpu->arch.singlestep_rip; >> + vcpu->run->debug.arch.exception = DB_VECTOR; >> + vcpu->run->exit_reason = KVM_EXIT_DEBUG; >> + return 0; >> + } >> + >> + /* >> + * "Certain debug exceptions may clear bit 0-3. The >> + * remaining contents of the DR6 register are never >> + * cleared by the processor". >> + */ >> + vcpu->arch.dr6 &= ~15; >> + vcpu->arch.dr6 |= DR6_BS | DR6_RTM; >> + kvm_queue_exception(vcpu, DB_VECTOR); >> + } > > This code is pretty much the same as kvm_vcpu_check_singlestep. Let's > not duplicate the code and implement skip_emulated_instruction can be > implemented in x86.c, like > > unsigned long rflags = kvm_x86_ops->get_rflags(vcpu); > int r = EMULATE_DONE; > > /* This would be the no_trap variant */ > kvm_x86_ops->skip_emulated_instruction(vcpu); > kvm_vcpu_check_singlestep(vcpu, rflags, &r); > return r == EMULATE_DONE; > > (because x86.c/vmx.c/svm.c are separate modules, when moving the function > to x86.c you should rename it to kvm_skip_emulated_instruction). > > Paolo They're not exactly the same. For some reason I don't understand kvm_vcpu_check_singlestep clears the trap flag. Perhaps that is also a bug? - Kyle -- 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