diff options
author | Jan Matyas <matyas@codasip.com> | 2020-04-01 11:58:20 +0200 |
---|---|---|
committer | Tomas Vanek <vanekt@fbl.cz> | 2020-04-09 11:06:39 +0100 |
commit | 25efc150694042b349b8df1ff7c41f16955c5288 (patch) | |
tree | a01e4feb8433dc306dd6878ce4174651058f90ac /src | |
parent | 0a804222da63c5f849efa23b019a59e2dea76842 (diff) | |
download | riscv-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')
-rw-r--r-- | src/target/target.c | 16 | ||||
-rw-r--r-- | src/target/target.h | 2 |
2 files changed, 16 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, diff --git a/src/target/target.h b/src/target/target.h index b954ec2..ddeb00b 100644 --- a/src/target/target.h +++ b/src/target/target.h @@ -258,6 +258,8 @@ enum target_event { TARGET_EVENT_RESUMED, /* target resumed to normal execution */ TARGET_EVENT_RESUME_START, TARGET_EVENT_RESUME_END, + TARGET_EVENT_STEP_START, + TARGET_EVENT_STEP_END, TARGET_EVENT_GDB_START, /* debugger started execution (step/run) */ TARGET_EVENT_GDB_END, /* debugger stopped execution (step/run) */ |