All of lore.kernel.org
 help / color / mirror / Atom feed
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
> 

  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 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.