From 099a3020d245aa69ed53d5c61d21ba2a4bc42659 Mon Sep 17 00:00:00 2001 From: Palmer Dabbelt Date: Mon, 12 Jun 2017 14:04:21 -0700 Subject: [PATCH 1/2] Clear abstract errors from register_read_direct --- src/target/riscv/riscv-013.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/target/riscv/riscv-013.c b/src/target/riscv/riscv-013.c index 38bc6a0ab..0d72e344e 100644 --- a/src/target/riscv/riscv-013.c +++ b/src/target/riscv/riscv-013.c @@ -542,8 +542,8 @@ static int register_write_direct(struct target *target, unsigned number, int exec_out = riscv_program_exec(&program, target); if (exec_out != ERROR_OK) { - LOG_ERROR("Unable to execute program"); - return exec_out; + riscv013_clear_abstract_error(target); + return ERROR_FAIL; } return ERROR_OK; @@ -575,8 +575,8 @@ static int register_read_direct(struct target *target, uint64_t *value, uint32_t int exec_out = riscv_program_exec(&program, target); if (exec_out != ERROR_OK) { - LOG_ERROR("Unable to execute program"); - return exec_out; + riscv013_clear_abstract_error(target); + return ERROR_FAIL; } *value = 0; @@ -679,7 +679,7 @@ static int init_target(struct command_context *cmd_ctx, info->ac_busy_delay = 0; target->reg_cache = calloc(1, sizeof(*target->reg_cache)); - target->reg_cache->name = "RISC-V registers"; + target->reg_cache->name = "RISC-V Registers"; target->reg_cache->num_regs = GDB_REGNO_COUNT; target->reg_cache->reg_list = calloc(GDB_REGNO_COUNT, sizeof(struct reg)); From afc9eb6c470f3fae951c833d2a8585aeba65f2df Mon Sep 17 00:00:00 2001 From: Palmer Dabbelt Date: Mon, 12 Jun 2017 17:46:31 -0700 Subject: [PATCH 2/2] Jump to the RTOS hartid after halting When I disappeared the polls everywhere I forgot to sanitize the hartid after halting. This is an invariant that GDB expects: when you return from a halt whatever thread is marked as currently selected is the thread that the next register accesses reference. --- src/target/riscv/riscv.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/target/riscv/riscv.c b/src/target/riscv/riscv.c index c54f08771..e578b9c3b 100644 --- a/src/target/riscv/riscv.c +++ b/src/target/riscv/riscv.c @@ -737,6 +737,8 @@ int riscv_openocd_poll(struct target *target) int riscv_openocd_halt(struct target *target) { + RISCV_INFO(r); + LOG_DEBUG("halting all harts"); int out = riscv_halt_all_harts(target); @@ -746,6 +748,11 @@ int riscv_openocd_halt(struct target *target) } register_cache_invalidate(target->reg_cache); + if (riscv_rtos_enabled(target)) { + target->rtos->current_threadid = r->rtos_hartid + 1; + target->rtos->current_thread = r->rtos_hartid + 1; + } + target->state = TARGET_HALTED; target->debug_reason = DBG_REASON_DBGRQ; target_call_event_callbacks(target, TARGET_EVENT_HALTED);