From e676d3dae62b5fe710a9c80141e48e74d51819af Mon Sep 17 00:00:00 2001 From: Gleb Gagarin Date: Fri, 11 Aug 2017 17:46:35 -0700 Subject: [PATCH 1/2] Fixed off-by-one error in previous commit --- src/target/riscv/riscv-013.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/target/riscv/riscv-013.c b/src/target/riscv/riscv-013.c index 747488e2a..6dc5bef0b 100644 --- a/src/target/riscv/riscv-013.c +++ b/src/target/riscv/riscv-013.c @@ -1374,7 +1374,7 @@ static int read_memory(struct target *target, target_addr_t address, size_t rereads = reads; for (riscv_addr_t i = start; i < count; ++i) { - if (i == count - 1) { + if (i == count) { // don't do actual read in this batch, // we will do it later after we disable autoexec // From 3109da7dfd90885261d0d8ad58b62a1a083b10d9 Mon Sep 17 00:00:00 2001 From: Gleb Gagarin Date: Sat, 12 Aug 2017 14:51:12 -0700 Subject: [PATCH 2/2] Force actual read from prog buffer for the last transaction in read_memory() --- src/target/riscv/riscv-013.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/target/riscv/riscv-013.c b/src/target/riscv/riscv-013.c index 6dc5bef0b..0296ffdd1 100644 --- a/src/target/riscv/riscv-013.c +++ b/src/target/riscv/riscv-013.c @@ -1374,7 +1374,7 @@ static int read_memory(struct target *target, target_addr_t address, size_t rereads = reads; for (riscv_addr_t i = start; i < count; ++i) { - if (i == count) { + if (i == count - 1) { // don't do actual read in this batch, // we will do it later after we disable autoexec // @@ -1436,7 +1436,10 @@ static int read_memory(struct target *target, target_addr_t address, if (this_is_last_read && i == start + reads - 1) { riscv013_set_autoexec(target, d_data, 0); - value = riscv_program_read_ram(&program, r_data); + + // access debug buffer without executing a program - this address logic was taken from program.c + int const off = (r_data - riscv_debug_buffer_addr(program.target)) / sizeof(program.debug_buffer[0]); + value = riscv_read_debug_buffer(target, off); } else { uint64_t dmi_out = riscv_batch_get_dmi_read(batch, rereads); value = get_field(dmi_out, DTM_DMI_DATA);