diff options
author | Tim Newsome <tim@sifive.com> | 2017-10-18 12:32:41 -0700 |
---|---|---|
committer | Tim Newsome <tim@sifive.com> | 2017-10-18 12:32:41 -0700 |
commit | 5d3f5c35d285fe7dc684fcbd94d3c5a8b4e8b8e1 (patch) | |
tree | 6e6a1f953c95bd5848935b6b01d18cb0f83f6d6b | |
parent | 7edd9b17862570352c4c70729f2f141ec06f8325 (diff) | |
download | riscv-openocd-5d3f5c35d285fe7dc684fcbd94d3c5a8b4e8b8e1.zip riscv-openocd-5d3f5c35d285fe7dc684fcbd94d3c5a8b4e8b8e1.tar.gz riscv-openocd-5d3f5c35d285fe7dc684fcbd94d3c5a8b4e8b8e1.tar.bz2 |
Still restore registers if an access failed.
Change-Id: I11571f0926f69a34f95b4929f633fdecd3a4e810
-rw-r--r-- | src/target/riscv/riscv-013.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/src/target/riscv/riscv-013.c b/src/target/riscv/riscv-013.c index 70531e9..5495516 100644 --- a/src/target/riscv/riscv-013.c +++ b/src/target/riscv/riscv-013.c @@ -781,14 +781,13 @@ static int register_write_direct(struct target *target, unsigned number, int exec_out = riscv_program_exec(&program, target); if (exec_out != ERROR_OK) { riscv013_clear_abstract_error(target); - return ERROR_FAIL; } // Restore S0. if (register_write_direct(target, GDB_REGNO_S0, s0) != ERROR_OK) return ERROR_FAIL; - return ERROR_OK; + return exec_out; } /** Actually read registers from the target right now. */ @@ -798,6 +797,8 @@ static int register_read_direct(struct target *target, uint64_t *value, uint32_t riscv_xlen(target)); if (result != ERROR_OK) { + result = ERROR_OK; + struct riscv_program program; riscv_program_init(&program, target); assert(number != GDB_REGNO_S0); @@ -823,10 +824,9 @@ static int register_read_direct(struct target *target, uint64_t *value, uint32_t } // Execute program. - int exec_out = riscv_program_exec(&program, target); - if (exec_out != ERROR_OK) { + result = riscv_program_exec(&program, target); + if (result != ERROR_OK) { riscv013_clear_abstract_error(target); - return ERROR_FAIL; } // Read S0 @@ -837,9 +837,12 @@ static int register_read_direct(struct target *target, uint64_t *value, uint32_t return ERROR_FAIL; } - LOG_DEBUG("[%d] reg[0x%x] = 0x%" PRIx64, riscv_current_hartid(target), - number, *value); - return ERROR_OK; + if (result == ERROR_OK) { + LOG_DEBUG("[%d] reg[0x%x] = 0x%" PRIx64, riscv_current_hartid(target), + number, *value); + } + + return result; } /*** OpenOCD target functions. ***/ |