aboutsummaryrefslogtreecommitdiff
path: root/src/target/target.c
diff options
context:
space:
mode:
authorJan Matyas <matyas@codasip.com>2020-04-01 11:58:20 +0200
committerTomas Vanek <vanekt@fbl.cz>2020-04-09 11:06:39 +0100
commit25efc150694042b349b8df1ff7c41f16955c5288 (patch)
treea01e4feb8433dc306dd6878ce4174651058f90ac /src/target/target.c
parent0a804222da63c5f849efa23b019a59e2dea76842 (diff)
downloadriscv-openocd-25efc150694042b349b8df1ff7c41f16955c5288.zip
riscv-openocd-25efc150694042b349b8df1ff7c41f16955c5288.tar.gz
riscv-openocd-25efc150694042b349b8df1ff7c41f16955c5288.tar.bz2
target: added events TARGET_EVENT_STEP_START and _END
Events TARGET_EVENT_STEP_START and TARGET_EVENT_STEP_END have been added - analogous to already existing events TARGET_EVENT_RESUME_*. This is an example of a concrete use case where having these events is important: In RISC-V processors without Debug Program Buffer, OpenOCD cannot execute fence/fence.i when resuming or single- stepping. With these events implemented, the user can instead provide custom operations to achieve that same effect prior to resuming the processor. Change-Id: I786348ff08940759d99b0f24e9e0ed5a44581094 Signed-off-by: Jan Matyas <matyas@codasip.com> Reviewed-on: http://openocd.zylin.com/5551 Tested-by: jenkins Reviewed-by: Tim Newsome <tim@sifive.com>
Diffstat (limited to 'src/target/target.c')
-rw-r--r--src/target/target.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/target/target.c b/src/target/target.c
index 50dd148..24fa416 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -205,6 +205,8 @@ static const Jim_Nvp nvp_target_event[] = {
{ .value = TARGET_EVENT_RESUMED, .name = "resumed" },
{ .value = TARGET_EVENT_RESUME_START, .name = "resume-start" },
{ .value = TARGET_EVENT_RESUME_END, .name = "resume-end" },
+ { .value = TARGET_EVENT_STEP_START, .name = "step-start" },
+ { .value = TARGET_EVENT_STEP_END, .name = "step-end" },
{ .name = "gdb-start", .value = TARGET_EVENT_GDB_START },
{ .name = "gdb-end", .value = TARGET_EVENT_GDB_END },
@@ -1256,7 +1258,17 @@ bool target_supports_gdb_connection(struct target *target)
int target_step(struct target *target,
int current, target_addr_t address, int handle_breakpoints)
{
- return target->type->step(target, current, address, handle_breakpoints);
+ int retval;
+
+ target_call_event_callbacks(target, TARGET_EVENT_STEP_START);
+
+ retval = target->type->step(target, current, address, handle_breakpoints);
+ if (retval != ERROR_OK)
+ return retval;
+
+ target_call_event_callbacks(target, TARGET_EVENT_STEP_END);
+
+ return retval;
}
int target_get_gdb_fileio_info(struct target *target, struct gdb_fileio_info *fileio_info)
@@ -3145,7 +3157,7 @@ COMMAND_HANDLER(handle_step_command)
struct target *target = get_current_target(CMD_CTX);
- return target->type->step(target, current_pc, addr, 1);
+ return target_step(target, current_pc, addr, 1);
}
void target_handle_md_output(struct command_invocation *cmd,