aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Newsome <tim@sifive.com>2016-11-25 09:46:55 -0800
committerTim Newsome <tim@sifive.com>2016-11-25 09:46:55 -0800
commit7dd48acdc012612f2d102c7f25ade6514beda3dd (patch)
tree022dc961da54aa335c0e2ff08a3a7732ec40f73d
parentbb7dedcbaa3bef3870306a58648e4398c1b7f053 (diff)
downloadriscv-openocd-7dd48acdc012612f2d102c7f25ade6514beda3dd.zip
riscv-openocd-7dd48acdc012612f2d102c7f25ade6514beda3dd.tar.gz
riscv-openocd-7dd48acdc012612f2d102c7f25ade6514beda3dd.tar.bz2
Cope better if the target unexpectedly resets.
Change-Id: I713f7f8a3afbbb02be0e2f19f4d32778366d37f9
-rw-r--r--src/target/riscv/riscv.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/target/riscv/riscv.c b/src/target/riscv/riscv.c
index 6d2bf5b..d4af3de 100644
--- a/src/target/riscv/riscv.c
+++ b/src/target/riscv/riscv.c
@@ -722,22 +722,29 @@ static bits_t read_bits(struct target *target)
uint64_t value;
dbus_status_t status;
uint16_t address_in;
+ riscv_info_t *info = (riscv_info_t *) target->arch_info;
+
+ bits_t err_result = {
+ .haltnot = 0,
+ .interrupt = 0
+ };
do {
unsigned i = 0;
do {
status = dbus_scan(target, &address_in, &value, DBUS_OP_READ, 0, 0);
if (status == DBUS_STATUS_BUSY) {
+ if (address_in == (1<<info->addrbits) - 1 &&
+ value == (1ULL<<DBUS_DATA_SIZE) - 1) {
+ LOG_ERROR("TDO seems to be stuck high.");
+ return err_result;
+ }
increase_dbus_busy_delay(target);
}
} while (status == DBUS_STATUS_BUSY && i++ < 256);
if (i >= 256) {
LOG_ERROR("Failed to read from 0x%x; status=%d", address_in, status);
- bits_t err_result = {
- .haltnot = 0,
- .interrupt = 0
- };
return err_result;
}
} while (address_in > 0x10 && address_in != DMCONTROL);