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

Reply via email to