From: Paolo Bonzini <pbonzini@redhat.com>
To: Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru>, 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, afaerber@suse.de,
fred.konrad@greensocs.com
Subject: Re: [Qemu-devel] [RFC PATCH v8 04/21] replay: internal functions for replay log
Date: Thu, 29 Jan 2015 10:11:55 +0100 [thread overview]
Message-ID: <54C9F95B.5020806@redhat.com> (raw)
In-Reply-To: <20150122085153.5276.96905.stgit@PASHA-ISP.def.inno>
On 22/01/2015 09:51, Pavel Dovgalyuk wrote:
> This patch adds functions to perform read and write operations
> with replay log.
>
> Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
> ---
> replay/Makefile.objs | 1
> replay/replay-internal.c | 141 ++++++++++++++++++++++++++++++++++++++++++++++
> replay/replay-internal.h | 50 ++++++++++++++++
> 3 files changed, 192 insertions(+), 0 deletions(-)
> create mode 100755 replay/replay-internal.c
> create mode 100755 replay/replay-internal.h
>
> diff --git a/replay/Makefile.objs b/replay/Makefile.objs
> index 7ea860f..1148f45 100755
> --- a/replay/Makefile.objs
> +++ b/replay/Makefile.objs
> @@ -1 +1,2 @@
> obj-y += replay.o
> +obj-y += replay-internal.o
> diff --git a/replay/replay-internal.c b/replay/replay-internal.c
> new file mode 100755
> index 0000000..3865fa5
> --- /dev/null
> +++ b/replay/replay-internal.c
> @@ -0,0 +1,141 @@
> +/*
> + * replay-internal.c
> + *
> + * Copyright (c) 2010-2015 Institute for System Programming
> + * of the Russian Academy of Sciences.
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
> + *
> + */
> +
> +#include "qemu-common.h"
> +#include "replay-internal.h"
> +
> +unsigned int replay_data_kind = -1;
> +unsigned int replay_has_unread_data;
> +
> +/* File for replay writing */
> +FILE *replay_file;
> +
> +void replay_put_byte(uint8_t byte)
> +{
> + if (replay_file) {
> + fwrite(&byte, sizeof(byte), 1, replay_file);
putc(byte, replay_file);
> + }
> +}
> +
> +void replay_put_event(uint8_t event)
> +{
> + replay_put_byte(event);
> +}
> +
> +
> +void replay_put_word(uint16_t word)
> +{
> + if (replay_file) {
> + fwrite(&word, sizeof(word), 1, replay_file);
Let's make this use a guaranteed endianness. QEMU usually uses big
endian. So either use putc, or use cpu_to_be16 and fwrite.
> + }
> +}
> +
> +void replay_put_dword(uint32_t dword)
> +{
> + if (replay_file) {
> + fwrite(&dword, sizeof(dword), 1, replay_file);
Same here.
> + }
> +}
> +
> +void replay_put_qword(int64_t qword)
> +{
> + if (replay_file) {
> + fwrite(&qword, sizeof(qword), 1, replay_file);
And same here.
> + }
> +}
> +
> +void replay_put_array(const uint8_t *buf, size_t size)
> +{
> + if (replay_file) {
> + fwrite(&size, sizeof(size), 1, replay_file);
replay_put_dword (a limit of 2^32 elements should not be a problem :)).
> + fwrite(buf, 1, size, replay_file);
> + }
> +}
> +
> +uint8_t replay_get_byte(void)
> +{
> + uint8_t byte;
> + if (replay_file) {
> + fread(&byte, sizeof(byte), 1, replay_file);
byte = getc(replay_file)
> + }
> + return byte;
> +}
> +
> +uint16_t replay_get_word(void)
> +{
> + uint16_t word;
> + if (replay_file) {
> + fread(&word, sizeof(word), 1, replay_file);
Same comment about endianness.
> + }
> +
> + return word;
> +}
> +
> +uint32_t replay_get_dword(void)
> +{
> + uint32_t dword;
> + if (replay_file) {
> + fread(&dword, sizeof(dword), 1, replay_file);
> + }
> +
> + return dword;
> +}
> +
> +int64_t replay_get_qword(void)
> +{
> + int64_t qword;
> + if (replay_file) {
> + fread(&qword, sizeof(qword), 1, replay_file);
> + }
> +
> + return qword;
> +}
> +
> +void replay_get_array(uint8_t *buf, size_t *size)
> +{
> + if (replay_file) {
> + fread(size, sizeof(*size), 1, replay_file);
> + fread(buf, 1, *size, replay_file);
> + }
> +}
> +
> +void replay_get_array_alloc(uint8_t **buf, size_t *size)
> +{
> + if (replay_file) {
> + fread(size, sizeof(*size), 1, replay_file);
> + *buf = g_malloc(*size);
> + fread(*buf, 1, *size, replay_file);
> + }
> +}
> +
> +void replay_check_error(void)
Could this be static? (I haven't checked).
> +{
> + if (replay_file) {
> + if (feof(replay_file)) {
> + fprintf(stderr, "replay file is over\n");
> + exit(1);
Perhaps qemu_system_vmstop_request_prepare +
qemu_system_vmstop_request(RUN_STATE_PAUSED) instead of exit? Those two
functions are thread-safe.
> + } else if (ferror(replay_file)) {
> + fprintf(stderr, "replay file is over or something goes wrong\n");
Same here (RUN_STATE_INTERNAL_ERROR?).
> + exit(1);
> + }
> + }
> +}
> +
> +void replay_fetch_data_kind(void)
> +{
> + if (replay_file) {
> + if (!replay_has_unread_data) {
> + replay_data_kind = replay_get_byte();
> + replay_check_error();
> + replay_has_unread_data = 1;
> + }
> + }
> +}
> diff --git a/replay/replay-internal.h b/replay/replay-internal.h
> new file mode 100755
> index 0000000..dad5bc8
> --- /dev/null
> +++ b/replay/replay-internal.h
> @@ -0,0 +1,50 @@
> +#ifndef REPLAY_INTERNAL_H
> +#define REPLAY_INTERNAL_H
> +
> +/*
> + * replay-internal.h
> + *
> + * Copyright (c) 2010-2015 Institute for System Programming
> + * of the Russian Academy of Sciences.
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
> + *
> + */
> +
> +#include <stdio.h>
> +
> +extern unsigned int replay_data_kind;
> +extern unsigned int replay_has_unread_data;
> +
> +/* File for replay writing */
> +extern FILE *replay_file;
> +
> +void replay_put_byte(uint8_t byte);
> +void replay_put_event(uint8_t event);
> +void replay_put_word(uint16_t word);
> +void replay_put_dword(uint32_t dword);
> +void replay_put_qword(int64_t qword);
> +void replay_put_array(const uint8_t *buf, size_t size);
> +
> +uint8_t replay_get_byte(void);
> +uint16_t replay_get_word(void);
> +uint32_t replay_get_dword(void);
> +int64_t replay_get_qword(void);
> +void replay_get_array(uint8_t *buf, size_t *size);
> +void replay_get_array_alloc(uint8_t **buf, size_t *size);
> +
> +/*! Checks error status of the file. */
> +void replay_check_error(void);
> +
> +/*! Reads data type from the file and stores it in the
> + replay_data_kind variable. */
> +void replay_fetch_data_kind(void);
> +
> +/*! Saves queued events (like instructions and sound). */
> +void replay_save_instructions(void);
> +/*! Checks that the next data is corresponding to the desired kind.
> + Terminates the program in case of error. */
> +void validate_data_kind(int kind);
Please move the last two prototypes to the patches that introduce the
functions.
> +
> +#endif
>
next prev parent reply other threads:[~2015-01-29 10:17 UTC|newest]
Thread overview: 82+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-22 8:51 [Qemu-devel] [RFC PATCH v8 00/21] Deterministic replay core Pavel Dovgalyuk
2015-01-22 8:51 ` [Qemu-devel] [RFC PATCH v8 01/21] i386: partial revert of interrupt poll fix Pavel Dovgalyuk
2015-01-22 8:51 ` [Qemu-devel] [RFC PATCH v8 02/21] replay: global variables and function stubs Pavel Dovgalyuk
2015-01-29 9:02 ` Paolo Bonzini
2015-01-29 23:23 ` Eric Blake
2015-01-22 8:51 ` [Qemu-devel] [RFC PATCH v8 03/21] sysemu: system functions for replay Pavel Dovgalyuk
2015-01-29 9:03 ` Paolo Bonzini
2015-01-22 8:51 ` [Qemu-devel] [RFC PATCH v8 04/21] replay: internal functions for replay log Pavel Dovgalyuk
2015-01-29 9:11 ` Paolo Bonzini [this message]
2015-01-30 12:56 ` Pavel Dovgaluk
2015-01-30 13:06 ` Paolo Bonzini
2015-01-30 13:11 ` Mark Burton
2015-01-22 8:51 ` [Qemu-devel] [RFC PATCH v8 05/21] replay: introduce mutex to protect the " Pavel Dovgalyuk
2015-01-29 9:12 ` Paolo Bonzini
2015-01-22 8:52 ` [Qemu-devel] [RFC PATCH v8 06/21] replay: introduce icount event Pavel Dovgalyuk
2015-01-29 9:14 ` Paolo Bonzini
2015-01-22 8:52 ` [Qemu-devel] [RFC PATCH v8 07/21] cpu-exec: allow temporary disabling icount Pavel Dovgalyuk
2015-01-22 8:52 ` [Qemu-devel] [RFC PATCH v8 08/21] cpu: replay instructions sequence Pavel Dovgalyuk
2015-01-29 9:32 ` Paolo Bonzini
2015-02-02 12:28 ` Pavel Dovgaluk
2015-02-02 12:38 ` Paolo Bonzini
2015-02-02 12:42 ` Pavel Dovgaluk
[not found] ` <28583.7738695138$1422880978@news.gmane.org>
2015-02-02 13:18 ` Paolo Bonzini
2015-02-16 12:26 ` Pavel Dovgaluk
[not found] ` <6071.25815372473$1424089600@news.gmane.org>
2015-02-16 12:59 ` Paolo Bonzini
2015-02-16 13:27 ` Pavel Dovgaluk
[not found] ` <8198.56250095672$1424093273@news.gmane.org>
2015-02-16 13:31 ` Paolo Bonzini
2015-02-16 13:37 ` Pavel Dovgaluk
[not found] ` <39577.5216319182$1424093895@news.gmane.org>
2015-02-16 13:53 ` Paolo Bonzini
2015-02-17 8:43 ` Pavel Dovgaluk
2015-02-17 10:58 ` Paolo Bonzini
2015-02-17 11:35 ` Pavel Dovgaluk
2015-02-17 12:21 ` Paolo Bonzini
2015-01-22 8:52 ` [Qemu-devel] [RFC PATCH v8 09/21] replay: interrupts and exceptions Pavel Dovgalyuk
2015-01-29 9:44 ` Paolo Bonzini
2015-02-02 13:50 ` Pavel Dovgaluk
[not found] ` <23862.806443549$1422885088@news.gmane.org>
2015-02-02 14:18 ` Paolo Bonzini
2015-01-22 8:52 ` [Qemu-devel] [RFC PATCH v8 10/21] replay: asynchronous events infrastructure Pavel Dovgalyuk
2015-01-29 10:06 ` Paolo Bonzini
2015-01-22 8:52 ` [Qemu-devel] [RFC PATCH v8 11/21] replay: recording and replaying clock ticks Pavel Dovgalyuk
2015-01-29 10:16 ` Paolo Bonzini
2015-02-03 10:51 ` Pavel Dovgaluk
2015-02-03 11:04 ` Paolo Bonzini
2015-02-03 11:23 ` Pavel Dovgaluk
2015-02-03 11:59 ` Paolo Bonzini
2015-01-22 8:52 ` [Qemu-devel] [RFC PATCH v8 12/21] replay: recording and replaying different timers Pavel Dovgalyuk
2015-01-29 10:20 ` Paolo Bonzini
2015-02-03 14:05 ` Pavel Dovgaluk
2015-02-04 15:20 ` Paolo Bonzini
2015-01-22 8:52 ` [Qemu-devel] [RFC PATCH v8 13/21] replay: shutdown event Pavel Dovgalyuk
2015-01-29 10:20 ` Paolo Bonzini
2015-01-22 8:52 ` [Qemu-devel] [RFC PATCH v8 14/21] replay: checkpoints Pavel Dovgalyuk
2015-01-30 11:05 ` Paolo Bonzini
2015-01-22 8:52 ` [Qemu-devel] [RFC PATCH v8 15/21] aio: replace stack of bottom halves with queue Pavel Dovgalyuk
2015-01-30 10:43 ` Paolo Bonzini
2015-01-22 8:53 ` [Qemu-devel] [RFC PATCH v8 16/21] replay: bottom halves Pavel Dovgalyuk
2015-01-30 10:49 ` Paolo Bonzini
2015-02-11 13:03 ` Pavel Dovgaluk
2015-01-22 8:53 ` [Qemu-devel] [RFC PATCH v8 17/21] replay: replay aio requests Pavel Dovgalyuk
2015-01-30 11:07 ` Paolo Bonzini
2015-01-22 8:53 ` [Qemu-devel] [RFC PATCH v8 18/21] replay: thread pool Pavel Dovgalyuk
2015-01-30 11:13 ` Paolo Bonzini
2015-01-22 8:53 ` [Qemu-devel] [RFC PATCH v8 19/21] replay: initialization and deinitialization Pavel Dovgalyuk
2015-01-30 11:02 ` Paolo Bonzini
2015-02-09 12:59 ` Pavel Dovgaluk
2015-02-09 13:01 ` Paolo Bonzini
2015-01-22 8:53 ` [Qemu-devel] [RFC PATCH v8 20/21] replay: command line options Pavel Dovgalyuk
2015-01-30 10:54 ` Paolo Bonzini
2015-02-09 12:15 ` Pavel Dovgaluk
2015-02-09 12:26 ` Paolo Bonzini
2015-02-12 9:12 ` Pavel Dovgaluk
2015-02-12 14:12 ` Paolo Bonzini
2015-01-22 8:53 ` [Qemu-devel] [RFC PATCH v8 21/21] replay: recording of the user input Pavel Dovgalyuk
2015-01-30 11:23 ` Paolo Bonzini
2015-02-12 7:43 ` Pavel Dovgaluk
2015-02-12 8:08 ` Pavel Dovgaluk
2015-02-12 14:41 ` Paolo Bonzini
2015-01-28 11:45 ` [Qemu-devel] [RFC PATCH v8 00/21] Deterministic replay core Pavel Dovgaluk
[not found] ` <28048.5671981753$1422445570@news.gmane.org>
2015-01-29 10:21 ` Paolo Bonzini
2015-01-30 11:25 ` Paolo Bonzini
2015-02-02 14:30 ` Paolo Bonzini
2015-02-03 6:47 ` Pavel Dovgaluk
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=54C9F95B.5020806@redhat.com \
--to=pbonzini@redhat.com \
--cc=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=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).