Message ID | 20230814163135.187882-4-npiggin@gmail.com |
---|---|
State | New |
Headers | show |
Series | Assorted replay patches | expand |
Acked-by: Pavel Dovgalyuk <Pavel.Dovgalyuk@ispras.ru> On 14.08.2023 19:31, Nicholas Piggin wrote: > When replaying a trace, it is possible to go from shutdown to > running with a reverse-debugging step. This can be useful if the > problem being debugged triggers a reset or shutdown. > > Signed-off-by: Nicholas Piggin <npiggin@gmail.com> > --- > include/sysemu/runstate.h | 1 + > replay/replay.c | 2 ++ > softmmu/runstate.c | 19 +++++++++++++++++++ > 3 files changed, 22 insertions(+) > > diff --git a/include/sysemu/runstate.h b/include/sysemu/runstate.h > index 7beb29c2e2..85a1167ccb 100644 > --- a/include/sysemu/runstate.h > +++ b/include/sysemu/runstate.h > @@ -9,6 +9,7 @@ void runstate_set(RunState new_state); > RunState runstate_get(void); > bool runstate_is_running(void); > bool runstate_needs_reset(void); > +void runstate_replay_enable(void); > > typedef void VMChangeStateHandler(void *opaque, bool running, RunState state); > > diff --git a/replay/replay.c b/replay/replay.c > index 0f7d766efe..e64f71209a 100644 > --- a/replay/replay.c > +++ b/replay/replay.c > @@ -272,6 +272,8 @@ static void replay_enable(const char *fname, int mode) > /* go to the beginning */ > fseek(replay_file, HEADER_SIZE, SEEK_SET); > replay_fetch_data_kind(); > + > + runstate_replay_enable(); > } > > replay_init_events(); > diff --git a/softmmu/runstate.c b/softmmu/runstate.c > index f3bd862818..9fd3e57485 100644 > --- a/softmmu/runstate.c > +++ b/softmmu/runstate.c > @@ -174,6 +174,12 @@ static const RunStateTransition runstate_transitions_def[] = { > { RUN_STATE__MAX, RUN_STATE__MAX }, > }; > > +static const RunStateTransition replay_runstate_transitions_def[] = { > + { RUN_STATE_SHUTDOWN, RUN_STATE_RUNNING}, > + > + { RUN_STATE__MAX, RUN_STATE__MAX }, > +}; > + > static bool runstate_valid_transitions[RUN_STATE__MAX][RUN_STATE__MAX]; > > bool runstate_check(RunState state) > @@ -181,6 +187,19 @@ bool runstate_check(RunState state) > return current_run_state == state; > } > > +void runstate_replay_enable(void) > +{ > + const RunStateTransition *p; > + > + assert(replay_mode == REPLAY_MODE_PLAY); > + > + for (p = &replay_runstate_transitions_def[0]; p->from != RUN_STATE__MAX; > + p++) { > + runstate_valid_transitions[p->from][p->to] = true; > + } > + > +} > + > static void runstate_init(void) > { > const RunStateTransition *p;
diff --git a/include/sysemu/runstate.h b/include/sysemu/runstate.h index 7beb29c2e2..85a1167ccb 100644 --- a/include/sysemu/runstate.h +++ b/include/sysemu/runstate.h @@ -9,6 +9,7 @@ void runstate_set(RunState new_state); RunState runstate_get(void); bool runstate_is_running(void); bool runstate_needs_reset(void); +void runstate_replay_enable(void); typedef void VMChangeStateHandler(void *opaque, bool running, RunState state); diff --git a/replay/replay.c b/replay/replay.c index 0f7d766efe..e64f71209a 100644 --- a/replay/replay.c +++ b/replay/replay.c @@ -272,6 +272,8 @@ static void replay_enable(const char *fname, int mode) /* go to the beginning */ fseek(replay_file, HEADER_SIZE, SEEK_SET); replay_fetch_data_kind(); + + runstate_replay_enable(); } replay_init_events(); diff --git a/softmmu/runstate.c b/softmmu/runstate.c index f3bd862818..9fd3e57485 100644 --- a/softmmu/runstate.c +++ b/softmmu/runstate.c @@ -174,6 +174,12 @@ static const RunStateTransition runstate_transitions_def[] = { { RUN_STATE__MAX, RUN_STATE__MAX }, }; +static const RunStateTransition replay_runstate_transitions_def[] = { + { RUN_STATE_SHUTDOWN, RUN_STATE_RUNNING}, + + { RUN_STATE__MAX, RUN_STATE__MAX }, +}; + static bool runstate_valid_transitions[RUN_STATE__MAX][RUN_STATE__MAX]; bool runstate_check(RunState state) @@ -181,6 +187,19 @@ bool runstate_check(RunState state) return current_run_state == state; } +void runstate_replay_enable(void) +{ + const RunStateTransition *p; + + assert(replay_mode == REPLAY_MODE_PLAY); + + for (p = &replay_runstate_transitions_def[0]; p->from != RUN_STATE__MAX; + p++) { + runstate_valid_transitions[p->from][p->to] = true; + } + +} + static void runstate_init(void) { const RunStateTransition *p;
When replaying a trace, it is possible to go from shutdown to running with a reverse-debugging step. This can be useful if the problem being debugged triggers a reset or shutdown. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- include/sysemu/runstate.h | 1 + replay/replay.c | 2 ++ softmmu/runstate.c | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+)