diff options
author | Tim Newsome <tim@sifive.com> | 2016-11-25 09:46:55 -0800 |
---|---|---|
committer | Tim Newsome <tim@sifive.com> | 2016-11-25 09:46:55 -0800 |
commit | 7dd48acdc012612f2d102c7f25ade6514beda3dd (patch) | |
tree | 022dc961da54aa335c0e2ff08a3a7732ec40f73d | |
parent | bb7dedcbaa3bef3870306a58648e4398c1b7f053 (diff) | |
download | riscv-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.c | 15 |
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); |