diff mbox series

[v3,20/20] cputlb: Pass retaddr to tb_check_watchpoint

Message ID 20190922035458.14879-21-richard.henderson@linaro.org
State Superseded
Headers show
Series Move rom and notdirty handling to cputlb | expand

Commit Message

Richard Henderson Sept. 22, 2019, 3:54 a.m. UTC
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

Comments

David Hildenbrand Sept. 23, 2019, 8:54 a.m. UTC | #1
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 mbox series

Patch

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();