|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 11/24] x86/emul: Implement singlestep as a retire flag
>>> On 30.11.16 at 14:50, <andrew.cooper3@xxxxxxxxxx> wrote:
> The behaviour of singlestep is to raise #DB after the instruction has been
> completed, but implementing it with inject_hw_exception() causes x86_emulate()
> to return X86EMUL_EXCEPTION, despite succesfully completing execution of the
> instruction, including register writeback.
Nice, I think that'll help simplify the privop patch a bit.
> --- a/xen/arch/x86/mm/shadow/multi.c
> +++ b/xen/arch/x86/mm/shadow/multi.c
> @@ -3422,6 +3422,16 @@ static int sh_page_fault(struct vcpu *v,
> v->arch.paging.last_write_emul_ok = 0;
> #endif
>
> + if ( emul_ctxt.ctxt.retire.singlestep )
> + {
> + if ( is_hvm_vcpu(v) )
> + hvm_inject_hw_exception(TRAP_debug, X86_EVENT_NO_EC);
> + else
> + pv_inject_hw_exception(TRAP_debug, X86_EVENT_NO_EC);
> +
> + goto emulate_done;
This results in skipping the PAE special code (which I think is intended)
but also the trace_shadow_emulate(), which I don't think is wanted.
> @@ -3433,7 +3443,7 @@ static int sh_page_fault(struct vcpu *v,
> shadow_continue_emulation(&emul_ctxt, regs);
> v->arch.paging.last_write_was_pt = 0;
> r = x86_emulate(&emul_ctxt.ctxt, emul_ops);
> - if ( r == X86EMUL_OKAY )
> + if ( r == X86EMUL_OKAY && !emul_ctxt.ctxt.retire.raw )
I think this wants to have a comment attached explaining why
a blanket check of all current and future retire flags here is the
right thing (or benign).
> @@ -3449,6 +3459,15 @@ static int sh_page_fault(struct vcpu *v,
> {
> perfc_incr(shadow_em_ex_fail);
> TRACE_SHADOW_PATH_FLAG(TRCE_SFLAG_EMULATION_LAST_FAILED);
> +
> + if ( emul_ctxt.ctxt.retire.singlestep )
> + {
> + if ( is_hvm_vcpu(v) )
> + hvm_inject_hw_exception(TRAP_debug, X86_EVENT_NO_EC);
> + else
> + pv_inject_hw_exception(TRAP_debug, X86_EVENT_NO_EC);
> + }
> +
> break; /* Don't emulate again if we failed! */
This comment is now slightly stale.
> @@ -5415,11 +5414,11 @@ x86_emulate(
> if ( !mode_64bit() )
> _regs.eip = (uint32_t)_regs.eip;
>
> - *ctxt->regs = _regs;
> + /* Was singestepping active at the start of this instruction? */
> + if ( (rc == X86EMUL_OKAY) && (ctxt->regs->eflags & EFLG_TF) )
> + ctxt->retire.singlestep = true;
Don't we need to avoid doing this when mov_ss is set? Or does the
hardware perhaps do the necessary deferring for us?
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |