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>
This commit is contained in:
parent
0a804222da
commit
25efc15069
|
@ -4924,6 +4924,10 @@ when reset disables PLLs needed to use a fast clock.
|
|||
@* After all targets have resumed
|
||||
@item @b{resumed}
|
||||
@* Target has resumed
|
||||
@item @b{step-start}
|
||||
@* Before a target is single-stepped
|
||||
@item @b{step-end}
|
||||
@* After single-step has completed
|
||||
@item @b{trace-config}
|
||||
@* After target hardware trace configuration was changed
|
||||
@end itemize
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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) */
|
||||
|
|
Loading…
Reference in New Issue