@@ -34,7 +34,6 @@ struct priv_op_ctxt {
unsigned long base, limit;
} cs;
char *io_emul_stub;
- unsigned int bpmatch;
};
/* I/O emulation helpers. Use non-standard calling conventions. */
@@ -367,7 +366,8 @@ static int cf_check read_io(
if ( !guest_io_okay(port, bytes, curr, ctxt->regs) )
return X86EMUL_UNHANDLEABLE;
- poc->bpmatch = check_guest_io_breakpoint(curr, port, bytes);
+ poc->ctxt.retire.pending_dbg |=
+ check_guest_io_breakpoint(curr, port, bytes);
if ( admin_io_okay(port, bytes, currd) )
{
@@ -472,7 +472,8 @@ static int cf_check write_io(
if ( !guest_io_okay(port, bytes, curr, ctxt->regs) )
return X86EMUL_UNHANDLEABLE;
- poc->bpmatch = check_guest_io_breakpoint(curr, port, bytes);
+ poc->ctxt.retire.pending_dbg |=
+ check_guest_io_breakpoint(curr, port, bytes);
if ( admin_io_okay(port, bytes, currd) )
{
@@ -636,7 +637,8 @@ static int cf_check rep_ins(
return X86EMUL_EXCEPTION;
}
- poc->bpmatch = check_guest_io_breakpoint(curr, port, bytes_per_rep);
+ poc->ctxt.retire.pending_dbg |=
+ check_guest_io_breakpoint(curr, port, bytes_per_rep);
while ( *reps < goal )
{
@@ -658,7 +660,7 @@ static int cf_check rep_ins(
++*reps;
- if ( poc->bpmatch || hypercall_preempt_check() )
+ if ( poc->ctxt.retire.pending_dbg || hypercall_preempt_check() )
break;
/* x86_emulate() clips the repetition count to ensure we don't wrap. */
@@ -703,7 +705,8 @@ static int cf_check rep_outs(
return X86EMUL_EXCEPTION;
}
- poc->bpmatch = check_guest_io_breakpoint(curr, port, bytes_per_rep);
+ poc->ctxt.retire.pending_dbg |=
+ check_guest_io_breakpoint(curr, port, bytes_per_rep);
while ( *reps < goal )
{
@@ -726,7 +729,7 @@ static int cf_check rep_outs(
++*reps;
- if ( poc->bpmatch || hypercall_preempt_check() )
+ if ( poc->ctxt.retire.pending_dbg || hypercall_preempt_check() )
break;
/* x86_emulate() clips the repetition count to ensure we don't wrap. */
@@ -1361,12 +1364,9 @@ int pv_emulate_privileged_op(struct cpu_user_regs *regs)
case X86EMUL_DONE:
ASSERT(!curr->arch.pv.trap_bounce.flags);
- if ( ctxt.ctxt.retire.singlestep )
- ctxt.bpmatch |= DR_STEP;
-
- if ( ctxt.bpmatch )
+ if ( ctxt.ctxt.retire.pending_dbg )
{
- curr->arch.dr6 |= ctxt.bpmatch | DR_STATUS_RESERVED_ONE;
+ curr->arch.dr6 |= ctxt.ctxt.retire.pending_dbg | DR_STATUS_RESERVED_ONE;
pv_inject_hw_exception(X86_EXC_DB, X86_EVENT_NO_EC);
}
With a full pending_dbg field in x86_emulate_ctxt, use it rather than using a local bpmatch field. This simplifies the OKAY/DONE path as singlestep is already accumulated by x86_emulate() when appropriate. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> --- CC: Jan Beulich <JBeulich@suse.com> CC: Roger Pau Monné <roger.pau@citrix.com> CC: Wei Liu <wl@xen.org> CC: Jinoh Kang <jinoh.kang.kr@gmail.com> --- xen/arch/x86/pv/emul-priv-op.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)