This is an automated email from Gerrit.

Tarek BOCHKATI ([email protected]) just uploaded a new patch set to 
Gerrit, which you can find at http://openocd.zylin.com/6181

-- gerrit

commit d1aba08a00ae83044c6ddc464de8c6eaaf282ba4
Author: Tarek BOCHKATI <[email protected]>
Date:   Thu Apr 22 20:47:23 2021 +0100

    cortex_m: implement hit_watchpoint function
    
    this change aims to provide a better gdb debugging experience,
    by making gdb understand what's really happening.
    
    before this change when hitting a watchpoint
     - openocd reports "T05" to gdb
     - gdb displays: Program received signal SIGTRAP, Trace/breakpoint trap.
    
    after the change
     - openocd reports "T05watch:20000000;" to gdb
     - gdb displays:
       Hardware watchpoint 1: *0x20000000
    
       Old value = 16000000
       New value = 170000000
       ...
    
    Change-Id: Iac3a85eadd86663617889001dd04513a4211ced9
    Signed-off-by: Tarek BOCHKATI <[email protected]>

diff --git a/src/target/cortex_m.c b/src/target/cortex_m.c
index 6dc33c8..6b36a71 100644
--- a/src/target/cortex_m.c
+++ b/src/target/cortex_m.c
@@ -1596,6 +1596,37 @@ int cortex_m_remove_watchpoint(struct target *target, 
struct watchpoint *watchpo
        return ERROR_OK;
 }
 
+int cortex_m_hit_watchpoint(struct target *target, struct watchpoint 
**hit_watchpoint)
+{
+       if (target->debug_reason != DBG_REASON_WATCHPOINT)
+               return ERROR_FAIL;
+
+       struct cortex_m_common *cortex_m = target_to_cm(target);
+       struct cortex_m_dwt_comparator *comparator;
+       struct watchpoint *wp;
+       int dwt_num;
+
+       for (wp = target->watchpoints; wp; wp = wp->next) {
+               if (!wp->set)
+                       continue;
+
+               dwt_num = wp->set - 1;
+               comparator = cortex_m->dwt_comparator_list + dwt_num;
+
+               uint32_t dwt_function;
+               int retval = target_read_u32(target, 
comparator->dwt_comparator_address + 8, &dwt_function);
+               if (retval != ERROR_OK)
+                       return ERROR_FAIL;
+
+               if (dwt_function & BIT(24)) {
+                       *hit_watchpoint = wp;
+                       return ERROR_OK;
+               }
+       }
+
+       return ERROR_FAIL;
+}
+
 void cortex_m_enable_watchpoints(struct target *target)
 {
        struct watchpoint *watchpoint = target->watchpoints;
@@ -2531,6 +2562,7 @@ struct target_type cortexm_target = {
        .remove_breakpoint = cortex_m_remove_breakpoint,
        .add_watchpoint = cortex_m_add_watchpoint,
        .remove_watchpoint = cortex_m_remove_watchpoint,
+       .hit_watchpoint = cortex_m_hit_watchpoint,
 
        .commands = cortex_m_command_handlers,
        .target_create = cortex_m_target_create,

-- 

Reply via email to