Message ID | 20190923230004.9231-17-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | Move rom and notdirty handling to cputlb | expand |
Richard Henderson <richard.henderson@linaro.org> writes: > Fixes the previous TLB_WATCHPOINT patches because we are currently > failing to set cpu->mem_io_pc with the call to cpu_check_watchpoint. > Pass down the retaddr directly because it's readily available. > > Fixes: 50b107c5d61 > Reviewed-by: David Hildenbrand <david@redhat.com> > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> > --- > accel/tcg/translate-all.h | 2 +- > accel/tcg/translate-all.c | 6 +++--- > exec.c | 2 +- > 3 files changed, 5 insertions(+), 5 deletions(-) > > diff --git a/accel/tcg/translate-all.h b/accel/tcg/translate-all.h > index 135c1ea96a..a557b4e2bb 100644 > --- a/accel/tcg/translate-all.h > +++ b/accel/tcg/translate-all.h > @@ -30,7 +30,7 @@ void tb_invalidate_phys_page_fast(struct page_collection *pages, > tb_page_addr_t start, int len, > uintptr_t retaddr); > void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end); > -void tb_check_watchpoint(CPUState *cpu); > +void tb_check_watchpoint(CPUState *cpu, uintptr_t retaddr); > > #ifdef CONFIG_USER_ONLY > int page_unprotect(target_ulong address, uintptr_t pc); > diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c > index db77fb221b..66d4bc4341 100644 > --- a/accel/tcg/translate-all.c > +++ b/accel/tcg/translate-all.c > @@ -2142,16 +2142,16 @@ static bool tb_invalidate_phys_page(tb_page_addr_t addr, uintptr_t pc) > #endif > > /* user-mode: call with mmap_lock held */ > -void tb_check_watchpoint(CPUState *cpu) > +void tb_check_watchpoint(CPUState *cpu, uintptr_t retaddr) > { > TranslationBlock *tb; > > assert_memory_lock(); > > - tb = tcg_tb_lookup(cpu->mem_io_pc); > + tb = tcg_tb_lookup(retaddr); > if (tb) { > /* We can use retranslation to find the PC. */ > - cpu_restore_state_from_tb(cpu, tb, cpu->mem_io_pc, true); > + cpu_restore_state_from_tb(cpu, tb, retaddr, true); > tb_phys_invalidate(tb, -1); > } else { > /* The exception probably happened in a helper. The CPU state should > diff --git a/exec.c b/exec.c > index b3df826039..8a0a6613b1 100644 > --- a/exec.c > +++ b/exec.c > @@ -2758,7 +2758,7 @@ void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len, > cpu->watchpoint_hit = wp; > > mmap_lock(); > - tb_check_watchpoint(cpu); > + tb_check_watchpoint(cpu, ra); > if (wp->flags & BP_STOP_BEFORE_ACCESS) { > cpu->exception_index = EXCP_DEBUG; > mmap_unlock(); -- Alex Bennée
diff --git a/accel/tcg/translate-all.h b/accel/tcg/translate-all.h index 135c1ea96a..a557b4e2bb 100644 --- a/accel/tcg/translate-all.h +++ b/accel/tcg/translate-all.h @@ -30,7 +30,7 @@ void tb_invalidate_phys_page_fast(struct page_collection *pages, tb_page_addr_t start, int len, uintptr_t retaddr); void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end); -void tb_check_watchpoint(CPUState *cpu); +void tb_check_watchpoint(CPUState *cpu, uintptr_t retaddr); #ifdef CONFIG_USER_ONLY int page_unprotect(target_ulong address, uintptr_t pc); diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c index db77fb221b..66d4bc4341 100644 --- a/accel/tcg/translate-all.c +++ b/accel/tcg/translate-all.c @@ -2142,16 +2142,16 @@ static bool tb_invalidate_phys_page(tb_page_addr_t addr, uintptr_t pc) #endif /* user-mode: call with mmap_lock held */ -void tb_check_watchpoint(CPUState *cpu) +void tb_check_watchpoint(CPUState *cpu, uintptr_t retaddr) { TranslationBlock *tb; assert_memory_lock(); - tb = tcg_tb_lookup(cpu->mem_io_pc); + tb = tcg_tb_lookup(retaddr); if (tb) { /* We can use retranslation to find the PC. */ - cpu_restore_state_from_tb(cpu, tb, cpu->mem_io_pc, true); + cpu_restore_state_from_tb(cpu, tb, retaddr, true); tb_phys_invalidate(tb, -1); } else { /* The exception probably happened in a helper. The CPU state should diff --git a/exec.c b/exec.c index b3df826039..8a0a6613b1 100644 --- a/exec.c +++ b/exec.c @@ -2758,7 +2758,7 @@ void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len, cpu->watchpoint_hit = wp; mmap_lock(); - tb_check_watchpoint(cpu); + tb_check_watchpoint(cpu, ra); if (wp->flags & BP_STOP_BEFORE_ACCESS) { cpu->exception_index = EXCP_DEBUG; mmap_unlock();