Change version labels to work better with GIT
[fw/openocd] / src / target / arm926ejs.c
index d9c677ffa88e7bb6c06d98bbcb12771e5152454b..3c80802145890525f6e7aeea9e09d3fe2d2bf6e4 100644 (file)
@@ -159,8 +159,9 @@ int arm926ejs_cp15_read(target_t *target, uint32_t op1, uint32_t op2, uint32_t C
 
        jtag_add_dr_scan(4, fields, jtag_get_end_state());
 
-       /*TODO: add timeout*/
-       do
+       long long then = timeval_ms();
+
+       for (;;)
        {
                /* rescan with NOP, to wait for the access to complete */
                access = 0;
@@ -173,7 +174,19 @@ int arm926ejs_cp15_read(target_t *target, uint32_t op1, uint32_t op2, uint32_t C
                {
                        return retval;
                }
-       } while (buf_get_u32(&access, 0, 1) != 1);
+
+               if (buf_get_u32(&access, 0, 1) == 1)
+               {
+                       break;
+               }
+
+               /* 10ms timeout */
+               if ((timeval_ms()-then)>10)
+               {
+                       LOG_ERROR("cp15 read operation timed out");
+                       return ERROR_FAIL;
+               }
+       }
 
 #ifdef _DEBUG_INSTRUCTION_EXECUTION_
        LOG_DEBUG("addr: 0x%x value: %8.8x", address, *value);
@@ -228,8 +241,10 @@ int arm926ejs_cp15_write(target_t *target, uint32_t op1, uint32_t op2, uint32_t
        fields[3].in_value = NULL;
 
        jtag_add_dr_scan(4, fields, jtag_get_end_state());
-       /*TODO: add timeout*/
-       do
+
+       long long then = timeval_ms();
+
+       for (;;)
        {
                /* rescan with NOP, to wait for the access to complete */
                access = 0;
@@ -239,7 +254,19 @@ int arm926ejs_cp15_write(target_t *target, uint32_t op1, uint32_t op2, uint32_t
                {
                        return retval;
                }
-       } while (buf_get_u32(&access, 0, 1) != 1);
+
+               if (buf_get_u32(&access, 0, 1) == 1)
+               {
+                       break;
+               }
+
+               /* 10ms timeout */
+               if ((timeval_ms()-then)>10)
+               {
+                       LOG_ERROR("cp15 write operation timed out");
+                       return ERROR_FAIL;
+               }
+       }
 
 #ifdef _DEBUG_INSTRUCTION_EXECUTION_
        LOG_DEBUG("addr: 0x%x value: %8.8x", address, value);
@@ -250,7 +277,7 @@ int arm926ejs_cp15_write(target_t *target, uint32_t op1, uint32_t op2, uint32_t
        return ERROR_OK;
 }
 
-int arm926ejs_examine_debug_reason(target_t *target)
+static int arm926ejs_examine_debug_reason(target_t *target)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        arm7_9_common_t *arm7_9 = armv4_5->arch_info;
@@ -267,7 +294,11 @@ int arm926ejs_examine_debug_reason(target_t *target)
 
        switch (debug_reason)
        {
-               /* case 0:  no debug entry */
+               case 0:
+                       LOG_DEBUG("no *NEW* debug entry (?missed one?)");
+                       /* ... since last restart or debug reset ... */
+                       target->debug_reason = DBG_REASON_DBGRQ;
+                       break;
                case 1:
                        LOG_DEBUG("breakpoint from EICE unit 0");
                        target->debug_reason = DBG_REASON_BREAKPOINT;
@@ -333,20 +364,21 @@ int arm926ejs_examine_debug_reason(target_t *target)
                         * openocd development mailing list if you have hardware
                         * to donate to look into this problem....
                         */
-                       LOG_ERROR("mystery debug reason MOE = 0xc. Try issuing a resume + halt.");
+                       LOG_WARNING("WARNING: mystery debug reason MOE = 0xc. Try issuing a resume + halt.");
                        target->debug_reason = DBG_REASON_DBGRQ;
-                       retval = ERROR_TARGET_FAILURE;
                        break;
                default:
-                       LOG_ERROR("BUG: unknown debug reason: 0x%x", debug_reason);
+                       LOG_WARNING("WARNING: unknown debug reason: 0x%x", debug_reason);
+                       /* Oh agony! should we interpret this as a halt request or
+                        * that the target stopped on it's own accord?
+                        */
                        target->debug_reason = DBG_REASON_DBGRQ;
                        /* if we fail here, we won't talk to the target and it will
                         * be reported to be in the halted state */
-                       retval = ERROR_TARGET_FAILURE;
                        break;
        }
 
-       return retval;
+       return ERROR_OK;
 }
 
 uint32_t arm926ejs_get_ttb(target_t *target)