Skip to content

Commit

Permalink
replay: replay blockers for devices
Browse files Browse the repository at this point in the history
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: Pavel Dovgalyuk <[email protected]>
Message-Id: <[email protected]>
Signed-off-by: Paolo Bonzini <[email protected]>
Signed-off-by: Pavel Dovgalyuk <[email protected]>
  • Loading branch information
Dovgalyuk authored and bonzini committed Nov 6, 2015
1 parent 7615936 commit 0194749
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 0 deletions.
7 changes: 7 additions & 0 deletions hw/bt/hci.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -72,6 +74,8 @@ struct bt_hci_s {

struct HCIInfo info;
struct bt_device_s device;

Error *replay_blocker;
};

#define DEFAULT_RSSI_DBM 20
Expand Down Expand Up @@ -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;
}

Expand Down
3 changes: 3 additions & 0 deletions include/qapi/qmp/qerror.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 3 additions & 0 deletions include/sysemu/replay.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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 */

Expand Down
12 changes: 12 additions & 0 deletions replay/replay.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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 changes: 10 additions & 0 deletions vl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 0194749

Please sign in to comment.