Message ID | 20190922035458.14879-21-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | Move rom and notdirty handling to cputlb | expand |
On 22.09.19 05:54, Richard Henderson wrote: > 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 > Signed-off-by: Richard Henderson <richard.henderson@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 fed25d029b..ceeef4cd4b 100644 > --- a/exec.c > +++ b/exec.c > @@ -2724,7 +2724,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(); > Finally, a lot of this stuff gets cleaned up :) Reviewed-by: David Hildenbrand <david@redhat.com> -- Thanks, David / dhildenb
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 fed25d029b..ceeef4cd4b 100644 --- a/exec.c +++ b/exec.c @@ -2724,7 +2724,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();
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 Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- accel/tcg/translate-all.h | 2 +- accel/tcg/translate-all.c | 6 +++--- exec.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) -- 2.17.1