This is an automated email from Gerrit.

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

-- gerrit

commit f06dd223095cb0e732ca4829eb3ac0e817c02c30
Author: Tomas Vanek <[email protected]>
Date:   Sun Oct 20 15:03:44 2019 +0200

    target/armv7m: minor fixes of target algo exit point check
    
    Introduce a new ERROR_TARGET_ALGO_EXIT as currently used
    ERROR_TARGET_TIMEOUT should be reserved for the timeout only.
    
    Do not load PC directly from CPU HW as the register value
    has already been cached.
    
    Change-Id: I0d3630da41fd021676789dc12b52545cc0432ba8
    Signed-off-by: Tomas Vanek <[email protected]>

diff --git a/src/target/armv7m.c b/src/target/armv7m.c
index 4c56c43..67409df 100644
--- a/src/target/armv7m.c
+++ b/src/target/armv7m.c
@@ -538,7 +538,6 @@ int armv7m_wait_algorithm(struct target *target,
        struct armv7m_common *armv7m = target_to_armv7m(target);
        struct armv7m_algorithm *armv7m_algorithm_info = arch_info;
        int retval = ERROR_OK;
-       uint32_t pc;
 
        /* NOTE: armv7m_run_algorithm requires that each algorithm uses a 
software breakpoint
         * at the exit point */
@@ -560,12 +559,14 @@ int armv7m_wait_algorithm(struct target *target,
                return ERROR_TARGET_TIMEOUT;
        }
 
-       armv7m->load_core_reg_u32(target, 15, &pc);
-       if (exit_point && (pc != exit_point)) {
-               LOG_DEBUG("failed algorithm halted at 0x%" PRIx32 ", expected 
0x%" TARGET_PRIxADDR,
-                       pc,
-                       exit_point);
-               return ERROR_TARGET_TIMEOUT;
+       if (exit_point) {
+               /* PC value has been cached in cortex_m_debug_entry() */
+               uint32_t pc = buf_get_u32(armv7m->arm.pc->value, 0, 32);
+               if (pc != exit_point) {
+                       LOG_DEBUG("failed algorithm halted at 0x%" PRIx32 ", 
expected 0x%" TARGET_PRIxADDR,
+                                         pc, exit_point);
+                       return ERROR_TARGET_ALGO_EXIT;
+               }
        }
 
        /* Read memory values to mem_params[] */
diff --git a/src/target/target.h b/src/target/target.h
index 81fd9d2..94ed3e4 100644
--- a/src/target/target.h
+++ b/src/target/target.h
@@ -756,6 +756,7 @@ void target_handle_md_output(struct command_invocation *cmd,
 #define ERROR_TARGET_NOT_RUNNING (-310)
 #define ERROR_TARGET_NOT_EXAMINED (-311)
 #define ERROR_TARGET_DUPLICATE_BREAKPOINT (-312)
+#define ERROR_TARGET_ALGO_EXIT  (-313)
 
 extern bool get_target_reset_nag(void);
 

-- 


_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to