summaryrefslogtreecommitdiff
path: root/src/target
diff options
context:
space:
mode:
authorØyvind Harboe <oyvind.harboe@zylin.com>2010-02-10 20:04:00 +0100
committerØyvind Harboe <oyvind.harboe@zylin.com>2010-02-10 22:54:06 +0100
commit65cc81ddb609456707c2ba47cfe8540192c6dce7 (patch)
tree9aea72f3ced433321614262b973344bcbb3cdb57 /src/target
parent84ac6bb0d99275ccf7ff15691ffa1b22127d7339 (diff)
downloadopenocd_libswd-65cc81ddb609456707c2ba47cfe8540192c6dce7.tar.gz
openocd_libswd-65cc81ddb609456707c2ba47cfe8540192c6dce7.tar.bz2
openocd_libswd-65cc81ddb609456707c2ba47cfe8540192c6dce7.tar.xz
openocd_libswd-65cc81ddb609456707c2ba47cfe8540192c6dce7.zip
arm11: fix another infinite loop bug
reset init would get stuck in an infinite loop when e.g. khz was too high. Added timeout. This is a copy of paste of a number of such bugfixes in the arm11 code. Arm11 code reviewed for further such infinite loop bugs and I couldn't find any more. Xing fingers it's the last one... Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
Diffstat (limited to 'src/target')
-rw-r--r--src/target/arm11_dbgtap.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/src/target/arm11_dbgtap.c b/src/target/arm11_dbgtap.c
index 088981f8..6d132a79 100644
--- a/src/target/arm11_dbgtap.c
+++ b/src/target/arm11_dbgtap.c
@@ -854,7 +854,9 @@ int arm11_sc7_run(struct arm11_common * arm11, struct arm11_sc7_action * actions
AddressOut = 0;
}
- do
+ /* Timeout here so we don't get stuck. */
+ int i = 0;
+ while (1)
{
JTAG_DEBUG("SC7 <= c%-3d Data %08x %s",
(unsigned) AddressOut,
@@ -866,10 +868,27 @@ int arm11_sc7_run(struct arm11_common * arm11, struct arm11_sc7_action * actions
CHECK_RETVAL(jtag_execute_queue());
- if (!Ready)
- JTAG_DEBUG("SC7 => !ready");
+ /* 'nRW' is 'Ready' on read out */
+ if (Ready)
+ break;
+
+ long long then = 0;
+
+ if (i == 1000)
+ {
+ then = timeval_ms();
+ }
+ if (i >= 1000)
+ {
+ if ((timeval_ms()-then) > 1000)
+ {
+ LOG_WARNING("Timeout (1000ms) waiting for instructions to complete");
+ return ERROR_FAIL;
+ }
+ }
+
+ i++;
}
- while (!Ready); /* 'nRW' is 'Ready' on read out */
if (!nRW)
JTAG_DEBUG("SC7 => Data %08x", (unsigned) DataIn);