cputlb: Pass retaddr to tb_check_watchpoint
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: 50b107c5d6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
5a7c27bb8a
commit
ae57db63ac
@ -2142,16 +2142,16 @@ static bool tb_invalidate_phys_page(tb_page_addr_t addr, uintptr_t pc)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* user-mode: call with mmap_lock held */
|
/* user-mode: call with mmap_lock held */
|
||||||
void tb_check_watchpoint(CPUState *cpu)
|
void tb_check_watchpoint(CPUState *cpu, uintptr_t retaddr)
|
||||||
{
|
{
|
||||||
TranslationBlock *tb;
|
TranslationBlock *tb;
|
||||||
|
|
||||||
assert_memory_lock();
|
assert_memory_lock();
|
||||||
|
|
||||||
tb = tcg_tb_lookup(cpu->mem_io_pc);
|
tb = tcg_tb_lookup(retaddr);
|
||||||
if (tb) {
|
if (tb) {
|
||||||
/* We can use retranslation to find the PC. */
|
/* 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);
|
tb_phys_invalidate(tb, -1);
|
||||||
} else {
|
} else {
|
||||||
/* The exception probably happened in a helper. The CPU state should
|
/* The exception probably happened in a helper. The CPU state should
|
||||||
|
@ -30,7 +30,7 @@ void tb_invalidate_phys_page_fast(struct page_collection *pages,
|
|||||||
tb_page_addr_t start, int len,
|
tb_page_addr_t start, int len,
|
||||||
uintptr_t retaddr);
|
uintptr_t retaddr);
|
||||||
void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end);
|
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
|
#ifdef CONFIG_USER_ONLY
|
||||||
int page_unprotect(target_ulong address, uintptr_t pc);
|
int page_unprotect(target_ulong address, uintptr_t pc);
|
||||||
|
2
exec.c
2
exec.c
@ -2758,7 +2758,7 @@ void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len,
|
|||||||
cpu->watchpoint_hit = wp;
|
cpu->watchpoint_hit = wp;
|
||||||
|
|
||||||
mmap_lock();
|
mmap_lock();
|
||||||
tb_check_watchpoint(cpu);
|
tb_check_watchpoint(cpu, ra);
|
||||||
if (wp->flags & BP_STOP_BEFORE_ACCESS) {
|
if (wp->flags & BP_STOP_BEFORE_ACCESS) {
|
||||||
cpu->exception_index = EXCP_DEBUG;
|
cpu->exception_index = EXCP_DEBUG;
|
||||||
mmap_unlock();
|
mmap_unlock();
|
||||||
|
Loading…
Reference in New Issue
Block a user