From: Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru>
To: qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org, peter.crosthwaite@xilinx.com,
alex.bennee@linaro.org, mark.burton@greensocs.com,
real@ispras.ru, batuzovk@ispras.ru,
maria.klimushenkova@ispras.ru, pavel.dovgaluk@ispras.ru,
pbonzini@redhat.com, afaerber@suse.de, fred.konrad@greensocs.com
Subject: [Qemu-devel] [RFC PATCH v4 09/25] replay: introduce icount event
Date: Fri, 07 Nov 2014 13:32:18 +0300 [thread overview]
Message-ID: <20141107103218.6136.86507.stgit@PASHA-ISP> (raw)
In-Reply-To: <20141107103123.6136.18545.stgit@PASHA-ISP>
This patch adds icount event to the replay subsystem. This event corresponds
to execution of several instructions and used to synchronize input events
in the replay phase.
Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
---
replay/replay-internal.c | 14 ++++++++++++++
replay/replay-internal.h | 18 ++++++++++++++++++
replay/replay.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
replay/replay.h | 7 +++++++
4 files changed, 84 insertions(+), 0 deletions(-)
diff --git a/replay/replay-internal.c b/replay/replay-internal.c
index 29f995d..14881b7 100755
--- a/replay/replay-internal.c
+++ b/replay/replay-internal.c
@@ -10,6 +10,7 @@
*/
#include "qemu-common.h"
+#include "replay.h"
#include "replay-internal.h"
volatile unsigned int replay_data_kind = -1;
@@ -139,3 +140,16 @@ void replay_fetch_data_kind(void)
}
}
}
+
+/*! Saves cached instructions. */
+void replay_save_instructions(void)
+{
+ if (replay_file && replay_mode == REPLAY_MODE_RECORD) {
+ int diff = (int)(replay_get_current_step() - replay_state.current_step);
+ if (first_cpu != NULL && diff > 0) {
+ replay_put_event(EVENT_INSTRUCTION);
+ replay_put_dword(diff);
+ replay_state.current_step += diff;
+ }
+ }
+}
diff --git a/replay/replay-internal.h b/replay/replay-internal.h
index 45bb344..577d1e9 100755
--- a/replay/replay-internal.h
+++ b/replay/replay-internal.h
@@ -14,6 +14,17 @@
#include <stdio.h>
+/* for instruction event */
+#define EVENT_INSTRUCTION 32
+
+typedef struct ReplayState {
+ /*! Current step - number of processed instructions and timer events. */
+ uint64_t current_step;
+ /*! Number of instructions to be executed before other events happen. */
+ int instructions_count;
+} ReplayState;
+extern ReplayState replay_state;
+
extern volatile unsigned int replay_data_kind;
extern volatile unsigned int replay_has_unread_data;
@@ -47,4 +58,11 @@ void replay_save_instructions(void);
Terminates the program in case of error. */
void validate_data_kind(int kind);
+/*! Skips async events until some sync event will be found. */
+bool skip_async_events(int stop_event);
+/*! Skips async events invocations from the input,
+ until required data kind is found. If the requested data is not found
+ reports an error and stops the execution. */
+void skip_async_events_until(unsigned int kind);
+
#endif
diff --git a/replay/replay.c b/replay/replay.c
index ac976b2..c305e0c 100755
--- a/replay/replay.c
+++ b/replay/replay.c
@@ -9,7 +9,10 @@
*
*/
+#include "qemu-common.h"
#include "replay.h"
+#include "replay-internal.h"
+#include "qemu/timer.h"
ReplayMode replay_mode = REPLAY_MODE_NONE;
/*! Stores current submode for PLAY mode */
@@ -18,8 +21,50 @@ ReplaySubmode play_submode = REPLAY_SUBMODE_UNKNOWN;
/* Suffix for the disk images filenames */
char *replay_image_suffix;
+ReplayState replay_state;
ReplaySubmode replay_get_play_submode(void)
{
return play_submode;
}
+
+bool skip_async_events(int stop_event)
+{
+ /* nothing to skip - not all instructions used */
+ if (replay_state.instructions_count != 0
+ && replay_has_unread_data) {
+ return stop_event == EVENT_INSTRUCTION;
+ }
+
+ bool res = false;
+ while (true) {
+ replay_fetch_data_kind();
+ if (stop_event == replay_data_kind) {
+ res = true;
+ }
+ switch (replay_data_kind) {
+ case EVENT_INSTRUCTION:
+ replay_state.instructions_count = replay_get_dword();
+ return res;
+ default:
+ /* clock, time_t, checkpoint and other events */
+ return res;
+ }
+ }
+
+ return res;
+}
+
+void skip_async_events_until(unsigned int kind)
+{
+ if (!skip_async_events(kind)) {
+ fprintf(stderr, "%"PRId64": Read data kind %d instead of expected %d\n",
+ replay_get_current_step(), replay_data_kind, kind);
+ exit(1);
+ }
+}
+
+uint64_t replay_get_current_step(void)
+{
+ return cpu_get_instructions_counter();
+}
diff --git a/replay/replay.h b/replay/replay.h
index 51a18fe..e40daf5 100755
--- a/replay/replay.h
+++ b/replay/replay.h
@@ -12,6 +12,8 @@
*
*/
+#include <stdbool.h>
+#include <stdint.h>
#include "qapi-types.h"
extern ReplayMode replay_mode;
@@ -20,4 +22,9 @@ extern char *replay_image_suffix;
/*! Returns replay play submode */
ReplaySubmode replay_get_play_submode(void);
+/* Processing the instructions */
+
+/*! Returns number of executed instructions. */
+uint64_t replay_get_current_step(void);
+
#endif
next prev parent reply other threads:[~2014-11-07 10:32 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-07 10:31 [Qemu-devel] [RFC PATCH v4 00/25] Deterministic replay and reverse execution Pavel Dovgalyuk
2014-11-07 10:31 ` [Qemu-devel] [RFC PATCH v4 01/25] acpi: accurate overflow check Pavel Dovgalyuk
2014-11-07 11:16 ` Paolo Bonzini
2014-11-07 10:31 ` [Qemu-devel] [RFC PATCH v4 02/25] mc146818rtc: add missed field to vmstate Pavel Dovgalyuk
2014-11-07 11:18 ` Paolo Bonzini
2014-11-07 10:31 ` [Qemu-devel] [RFC PATCH v4 03/25] replay: global variables and function stubs Pavel Dovgalyuk
2014-11-07 10:44 ` Eric Blake
2014-11-07 10:31 ` [Qemu-devel] [RFC PATCH v4 04/25] sysemu: system functions for replay Pavel Dovgalyuk
2014-11-07 15:51 ` Alex Bennée
2014-11-07 10:31 ` [Qemu-devel] [RFC PATCH v4 05/25] replay: internal functions for replay log Pavel Dovgalyuk
2014-11-07 16:01 ` Alex Bennée
2014-11-07 10:32 ` [Qemu-devel] [RFC PATCH v4 06/25] cpu-exec: reset exception_index correctly Pavel Dovgalyuk
2014-11-07 11:27 ` Paolo Bonzini
2014-11-12 12:02 ` Paolo Bonzini
2014-11-13 11:41 ` Pavel Dovgaluk
2014-11-07 10:32 ` [Qemu-devel] [RFC PATCH v4 07/25] icount: implement icount requesting Pavel Dovgalyuk
2014-11-07 11:19 ` Paolo Bonzini
2014-11-07 11:36 ` Pavel Dovgaluk
2014-11-07 11:45 ` Frederic Konrad
2014-11-11 9:41 ` Pavel Dovgaluk
2014-11-07 10:32 ` [Qemu-devel] [RFC PATCH v4 08/25] icount: improve enable/disable ticks Pavel Dovgalyuk
2014-11-07 11:20 ` Paolo Bonzini
2014-11-07 10:32 ` Pavel Dovgalyuk [this message]
2014-11-07 10:32 ` [Qemu-devel] [RFC PATCH v4 10/25] i386: do not cross the pages boundaries in replay mode Pavel Dovgalyuk
2014-11-07 11:20 ` Paolo Bonzini
2014-11-07 11:39 ` Pavel Dovgaluk
2014-11-07 11:27 ` Andreas Färber
2014-11-07 10:32 ` [Qemu-devel] [RFC PATCH v4 11/25] cpu-exec: allow temporary disabling icount Pavel Dovgalyuk
2014-11-07 11:22 ` Paolo Bonzini
2014-11-11 9:49 ` Pavel Dovgaluk
2014-11-13 14:16 ` Paolo Bonzini
2014-11-17 9:35 ` Pavel Dovgaluk
2014-11-07 10:32 ` [Qemu-devel] [RFC PATCH v4 12/25] replay: interrupts and exceptions Pavel Dovgalyuk
2014-11-07 10:32 ` [Qemu-devel] [RFC PATCH v4 13/25] replay: asynchronous events infrastructure Pavel Dovgalyuk
2014-11-07 10:53 ` Eric Blake
2014-11-07 10:32 ` [Qemu-devel] [RFC PATCH v4 14/25] cpu: replay instructions sequence Pavel Dovgalyuk
2014-11-07 10:32 ` [Qemu-devel] [RFC PATCH v4 15/25] replay: recording and replaying clock ticks Pavel Dovgalyuk
2014-11-07 10:32 ` [Qemu-devel] [RFC PATCH v4 16/25] replay: recording and replaying different timers Pavel Dovgalyuk
2014-11-07 10:33 ` [Qemu-devel] [RFC PATCH v4 17/25] cpus: make icount warp deterministic in replay mode Pavel Dovgalyuk
2014-11-07 11:24 ` Paolo Bonzini
2014-11-07 11:45 ` Pavel Dovgaluk
2014-11-07 12:00 ` Paolo Bonzini
2014-11-07 10:33 ` [Qemu-devel] [RFC PATCH v4 18/25] replay: shutdown event Pavel Dovgalyuk
2014-11-07 10:33 ` [Qemu-devel] [RFC PATCH v4 19/25] replay: checkpoints Pavel Dovgalyuk
2014-11-07 10:33 ` [Qemu-devel] [RFC PATCH v4 20/25] replay: bottom halves Pavel Dovgalyuk
2014-11-07 10:33 ` [Qemu-devel] [RFC PATCH v4 21/25] replay: replay aio requests Pavel Dovgalyuk
2014-11-07 10:33 ` [Qemu-devel] [RFC PATCH v4 22/25] replay: thread pool Pavel Dovgalyuk
2014-11-07 10:33 ` [Qemu-devel] [RFC PATCH v4 23/25] replay: initialization and deinitialization Pavel Dovgalyuk
2014-11-07 10:33 ` [Qemu-devel] [RFC PATCH v4 24/25] replay: command line options Pavel Dovgalyuk
2014-11-07 10:33 ` [Qemu-devel] [RFC PATCH v4 25/25] replay: recording of the user input Pavel Dovgalyuk
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20141107103218.6136.86507.stgit@PASHA-ISP \
--to=pavel.dovgaluk@ispras.ru \
--cc=afaerber@suse.de \
--cc=alex.bennee@linaro.org \
--cc=batuzovk@ispras.ru \
--cc=fred.konrad@greensocs.com \
--cc=maria.klimushenkova@ispras.ru \
--cc=mark.burton@greensocs.com \
--cc=pbonzini@redhat.com \
--cc=peter.crosthwaite@xilinx.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=real@ispras.ru \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.