diff options
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 |
commit | 65cc81ddb609456707c2ba47cfe8540192c6dce7 (patch) | |
tree | 9aea72f3ced433321614262b973344bcbb3cdb57 /src/target | |
parent | 84ac6bb0d99275ccf7ff15691ffa1b22127d7339 (diff) | |
download | openocd_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.c | 27 |
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); |