From 6f3913cedcc0fc2399937e70f44b45c5fbff25a8 Mon Sep 17 00:00:00 2001 From: Tim Newsome Date: Thu, 4 Jan 2018 17:12:01 -0800 Subject: Select current hart before reading memory. This avoids trying to read memory from the wrong hart, if the current hart was changed by an earlier call (eg. to poll()). Change-Id: I73da1e01c8d01d68f01ac7fdd6c548380a70cfd3 --- src/target/riscv/riscv.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/target/riscv/riscv.c b/src/target/riscv/riscv.c index 009bc3a..5ea0c94 100644 --- a/src/target/riscv/riscv.c +++ b/src/target/riscv/riscv.c @@ -720,9 +720,19 @@ static int old_or_new_riscv_resume( return riscv_openocd_resume(target, current, address, handle_breakpoints, debug_execution); } +static void riscv_select_current_hart(struct target *target) +{ + RISCV_INFO(r); + if (r->rtos_hartid != -1 && riscv_rtos_enabled(target)) + riscv_set_current_hartid(target, r->rtos_hartid); + else + riscv_set_current_hartid(target, target->coreid); +} + static int riscv_read_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t count, uint8_t *buffer) { + riscv_select_current_hart(target); struct target_type *tt = get_target_type(target); return tt->read_memory(target, address, size, count, buffer); } @@ -730,6 +740,7 @@ static int riscv_read_memory(struct target *target, target_addr_t address, static int riscv_write_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t count, const uint8_t *buffer) { + riscv_select_current_hart(target); struct target_type *tt = get_target_type(target); return tt->write_memory(target, address, size, count, buffer); } @@ -747,10 +758,7 @@ static int riscv_get_gdb_reg_list(struct target *target, return ERROR_FAIL; } - if (r->rtos_hartid != -1 && riscv_rtos_enabled(target)) - riscv_set_current_hartid(target, r->rtos_hartid); - else - riscv_set_current_hartid(target, target->coreid); + riscv_select_current_hart(target); switch (reg_class) { case REG_CLASS_GENERAL: -- cgit v1.1