Commit 0194749a authored by Pavel Dovgalyuk's avatar Pavel Dovgalyuk Committed by Paolo Bonzini
Browse files

replay: replay blockers for devices



Some devices are not supported by record/replay subsystem.
This patch introduces replay blocker which denies starting record/replay
if such devices are included into the configuration.

Signed-off-by: default avatarPavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
Message-Id: <20150917162512.8676.11367.stgit@PASHA-ISP.def.inno>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarPavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru>
parent 7615936e
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@
#include "hw/usb.h"
#include "sysemu/bt.h"
#include "hw/bt.h"
#include "qapi/qmp/qerror.h"
#include "sysemu/replay.h"

struct bt_hci_s {
    uint8_t *(*evt_packet)(void *opaque);
@@ -72,6 +74,8 @@ struct bt_hci_s {

    struct HCIInfo info;
    struct bt_device_s device;

    Error *replay_blocker;
};

#define DEFAULT_RSSI_DBM	20
@@ -2189,6 +2193,9 @@ struct HCIInfo *bt_new_hci(struct bt_scatternet_s *net)

    s->device.handle_destroy = bt_hci_destroy;

    error_setg(&s->replay_blocker, QERR_REPLAY_NOT_SUPPORTED, "-bt hci");
    replay_add_blocker(s->replay_blocker);

    return &s->info;
}

+3 −0
Original line number Diff line number Diff line
@@ -106,4 +106,7 @@
#define QERR_UNSUPPORTED \
    "this feature or command is not currently supported"

#define QERR_REPLAY_NOT_SUPPORTED \
    "Record/replay feature is not supported for '%s'"

#endif /* QERROR_H */
+3 −0
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
#include <stdbool.h>
#include <stdint.h>
#include "qapi-types.h"
#include "qapi/error.h"
#include "qemu/typedefs.h"

/* replay clock kinds */
@@ -51,6 +52,8 @@ void replay_configure(struct QemuOpts *opts);
void replay_start(void);
/*! Closes replay log file and frees other resources. */
void replay_finish(void);
/*! Adds replay blocker with the specified error description */
void replay_add_blocker(Error *reason);

/* Processing the instructions */

+12 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ ReplayMode replay_mode = REPLAY_MODE_NONE;
/* Name of replay file  */
static char *replay_filename;
ReplayState replay_state;
static GSList *replay_blockers;

bool replay_next_event_is(int event)
{
@@ -289,6 +290,12 @@ void replay_start(void)
        return;
    }

    if (replay_blockers) {
        error_report("Record/replay: %s",
                     error_get_pretty(replay_blockers->data));
        exit(1);
    }

    /* Timer for snapshotting will be set up here. */

    replay_enable_events();
@@ -324,3 +331,8 @@ void replay_finish(void)
    replay_finish_events();
    replay_mutex_destroy();
}

void replay_add_blocker(Error *reason)
{
    replay_blockers = g_slist_prepend(replay_blockers, reason);
}
+10 −0
Original line number Diff line number Diff line
@@ -123,6 +123,7 @@ int main(int argc, char **argv)
#include "exec/semihost.h"
#include "crypto/init.h"
#include "sysemu/replay.h"
#include "qapi/qmp/qerror.h"

#define MAX_VIRTIO_CONSOLES 1
#define MAX_SCLP_CONSOLES 1
@@ -847,7 +848,11 @@ static void configure_rtc(QemuOpts *opts)
        if (!strcmp(value, "utc")) {
            rtc_utc = 1;
        } else if (!strcmp(value, "localtime")) {
            Error *blocker = NULL;
            rtc_utc = 0;
            error_setg(&blocker, QERR_REPLAY_NOT_SUPPORTED,
                      "-rtc base=localtime");
            replay_add_blocker(blocker);
        } else {
            configure_rtc_date_offset(value, 0);
        }
@@ -1256,6 +1261,11 @@ static void smp_parse(QemuOpts *opts)
        exit(1);
    }

    if (smp_cpus > 1 || smp_cores > 1 || smp_threads > 1) {
        Error *blocker = NULL;
        error_setg(&blocker, QERR_REPLAY_NOT_SUPPORTED, "smp");
        replay_add_blocker(blocker);
    }
}

static void realtime_init(void)