Lots of RISC-V improvements.
This represents months of continuing RISC-V work, with too many changes to list individually. Some improvements: * Fixed memory leaks. * Better handling of dbus timeouts. * Add `riscv expose_custom` command. * Somewhat deal with cache coherency. * Deal with more timeouts during block memory accesses. * Basic debug compliance test. * Tell gdb which watchpoint hit. * SMP support for use with -rtos hwthread * Add `riscv set_ir` Change-Id: Ica507ee2a57eaf51b578ab1d9b7de71512fdf47f Signed-off-by: Tim Newsome <tim@sifive.com> Reviewed-on: http://openocd.zylin.com/4922 Tested-by: jenkins Reviewed-by: Philipp Guehring <pg@futureware.at> Reviewed-by: Liviu Ionescu <ilg@livius.net> Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>
This commit is contained in:
committed by
Matthias Welwarsky
parent
89f07325f2
commit
bc72695f67
@@ -358,6 +358,15 @@ static void add_dbus_scan(const struct target *target, struct scan_field *field,
|
||||
uint16_t address, uint64_t data)
|
||||
{
|
||||
riscv011_info_t *info = get_info(target);
|
||||
RISCV_INFO(r);
|
||||
|
||||
if (r->reset_delays_wait >= 0) {
|
||||
r->reset_delays_wait--;
|
||||
if (r->reset_delays_wait < 0) {
|
||||
info->dbus_busy_delay = 0;
|
||||
info->interrupt_high_delay = 0;
|
||||
}
|
||||
}
|
||||
|
||||
field->num_bits = info->addrbits + DBUS_OP_SIZE + DBUS_DATA_SIZE;
|
||||
field->in_value = in_value;
|
||||
@@ -1408,12 +1417,6 @@ static int strict_step(struct target *target, bool announce)
|
||||
|
||||
LOG_DEBUG("enter");
|
||||
|
||||
struct breakpoint *breakpoint = target->breakpoints;
|
||||
while (breakpoint) {
|
||||
riscv_remove_breakpoint(target, breakpoint);
|
||||
breakpoint = breakpoint->next;
|
||||
}
|
||||
|
||||
struct watchpoint *watchpoint = target->watchpoints;
|
||||
while (watchpoint) {
|
||||
riscv_remove_watchpoint(target, watchpoint);
|
||||
@@ -1424,12 +1427,6 @@ static int strict_step(struct target *target, bool announce)
|
||||
if (result != ERROR_OK)
|
||||
return result;
|
||||
|
||||
breakpoint = target->breakpoints;
|
||||
while (breakpoint) {
|
||||
riscv_add_breakpoint(target, breakpoint);
|
||||
breakpoint = breakpoint->next;
|
||||
}
|
||||
|
||||
watchpoint = target->watchpoints;
|
||||
while (watchpoint) {
|
||||
riscv_add_watchpoint(target, watchpoint);
|
||||
@@ -1463,7 +1460,7 @@ static int step(struct target *target, int current, target_addr_t address,
|
||||
if (result != ERROR_OK)
|
||||
return result;
|
||||
} else {
|
||||
return resume(target, 0, true);
|
||||
return full_step(target, false);
|
||||
}
|
||||
|
||||
return ERROR_OK;
|
||||
@@ -1676,7 +1673,7 @@ static riscv_error_t handle_halt_routine(struct target *target)
|
||||
break;
|
||||
default:
|
||||
LOG_ERROR("Got invalid bus access status: %d", status);
|
||||
return ERROR_FAIL;
|
||||
goto error;
|
||||
}
|
||||
if (data & DMCONTROL_INTERRUPT) {
|
||||
interrupt_set++;
|
||||
@@ -1850,7 +1847,7 @@ static int handle_halt(struct target *target, bool announce)
|
||||
target->debug_reason = DBG_REASON_BREAKPOINT;
|
||||
break;
|
||||
case DCSR_CAUSE_HWBP:
|
||||
target->debug_reason = DBG_REASON_WPTANDBKPT;
|
||||
target->debug_reason = DBG_REASON_WATCHPOINT;
|
||||
/* If we halted because of a data trigger, gdb doesn't know to do
|
||||
* the disable-breakpoints-step-enable-breakpoints dance. */
|
||||
info->need_strict_step = true;
|
||||
|
||||
Reference in New Issue
Block a user