On 14 September 2015 at 11:50, Sergey Fedorov <[email protected]> wrote: > When QEMU watchpoint matches, that is not definitely an architectural > watchpoint match yet. If it is a stop-before-access watchpoint then that > is hardly possible to ignore it after throwing a TCG exception. > > A special callback is introduced to check for architectural watchpoint > match before raising a TCG exception. > > Signed-off-by: Sergey Fedorov <[email protected]> > --- > exec.c | 5 +++++ > include/qom/cpu.h | 3 +++ > qom/cpu.c | 9 +++++++++ > 3 files changed, 17 insertions(+) > > diff --git a/exec.c b/exec.c > index 54cd70a..64ed543 100644 > --- a/exec.c > +++ b/exec.c > @@ -1921,6 +1921,7 @@ static const MemoryRegionOps notdirty_mem_ops = { > static void check_watchpoint(int offset, int len, MemTxAttrs attrs, int > flags) > { > CPUState *cpu = current_cpu; > + CPUClass *cc = CPU_GET_CLASS(cpu); > CPUArchState *env = cpu->env_ptr; > target_ulong pc, cs_base; > target_ulong vaddr; > @@ -1947,6 +1948,10 @@ static void check_watchpoint(int offset, int len, > MemTxAttrs attrs, int flags) > wp->hitattrs = attrs; > if (!cpu->watchpoint_hit) { > cpu->watchpoint_hit = wp; > + if (wp->flags & BP_CPU && !cc->debug_check_watchpoint(cpu)) { > + cpu->watchpoint_hit = NULL; > + continue; > + } > tb_check_watchpoint(cpu); > if (wp->flags & BP_STOP_BEFORE_ACCESS) { > cpu->exception_index = EXCP_DEBUG;
Missed this on first readthrough, but this code doesn't clear the BP_WATCHPOINT_HIT flags from wp->flags if we decide that the architectural watchpoint shouldn't fire. That means that next time around when we call check_watchpoint() it might decide spruriously that it should fire. thanks -- PMM
