All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Alex Bennée" <alex.bennee@linaro.org>
Subject: [Qemu-devel] [PULL 65/69] scripts/replay-dump.py: replay log dumper
Date: Tue, 13 Mar 2018 23:47:15 +0100	[thread overview]
Message-ID: <20180313224719.4954-66-pbonzini@redhat.com> (raw)
In-Reply-To: <20180313224719.4954-1-pbonzini@redhat.com>

From: Alex Bennée <alex.bennee@linaro.org>

This script is a debugging tool for looking through the contents of a
replay log file. It is incomplete but should fail gracefully at events
it doesn't understand.

It currently understands two different log formats as the audio
record/replay support was merged during since MTTCG. It was written to
help debug what has caused the BQL changes to break replay support.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20180227095310.1060.14500.stgit@pasha-VirtualBox>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 scripts/replay-dump.py | 308 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 308 insertions(+)
 create mode 100755 scripts/replay-dump.py

diff --git a/scripts/replay-dump.py b/scripts/replay-dump.py
new file mode 100755
index 0000000000..e274086277
--- /dev/null
+++ b/scripts/replay-dump.py
@@ -0,0 +1,308 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Dump the contents of a recorded execution stream
+#
+#  Copyright (c) 2017 Alex Bennée <alex.bennee@linaro.org>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, see <http://www.gnu.org/licenses/>.
+
+import argparse
+import struct
+from collections import namedtuple
+
+# This mirrors some of the global replay state which some of the
+# stream loading refers to. Some decoders may read the next event so
+# we need handle that case. Calling reuse_event will ensure the next
+# event is read from the cache rather than advancing the file.
+
+class ReplayState(object):
+    def __init__(self):
+        self.event = -1
+        self.event_count = 0
+        self.already_read = False
+        self.current_checkpoint = 0
+        self.checkpoint = 0
+
+    def set_event(self, ev):
+        self.event = ev
+        self.event_count += 1
+
+    def get_event(self):
+        self.already_read = False
+        return self.event
+
+    def reuse_event(self, ev):
+        self.event = ev
+        self.already_read = True
+
+    def set_checkpoint(self):
+        self.checkpoint = self.event - self.checkpoint_start
+
+    def get_checkpoint(self):
+        return self.checkpoint
+
+replay_state = ReplayState()
+
+# Simple read functions that mirror replay-internal.c
+# The file-stream is big-endian and manually written out a byte at a time.
+
+def read_byte(fin):
+    "Read a single byte"
+    return struct.unpack('>B', fin.read(1))[0]
+
+def read_event(fin):
+    "Read a single byte event, but save some state"
+    if replay_state.already_read:
+        return replay_state.get_event()
+    else:
+        replay_state.set_event(read_byte(fin))
+        return replay_state.event
+
+def read_word(fin):
+    "Read a 16 bit word"
+    return struct.unpack('>H', fin.read(2))[0]
+
+def read_dword(fin):
+    "Read a 32 bit word"
+    return struct.unpack('>I', fin.read(4))[0]
+
+def read_qword(fin):
+    "Read a 64 bit word"
+    return struct.unpack('>Q', fin.read(8))[0]
+
+# Generic decoder structure
+Decoder = namedtuple("Decoder", "eid name fn")
+
+def call_decode(table, index, dumpfile):
+    "Search decode table for next step"
+    decoder = next((d for d in table if d.eid == index), None)
+    if not decoder:
+        print "Could not decode index: %d" % (index)
+        print "Entry is: %s" % (decoder)
+        print "Decode Table is:\n%s" % (table)
+        return False
+    else:
+        return decoder.fn(decoder.eid, decoder.name, dumpfile)
+
+# Print event
+def print_event(eid, name, string=None, event_count=None):
+    "Print event with count"
+    if not event_count:
+        event_count = replay_state.event_count
+
+    if string:
+        print "%d:%s(%d) %s" % (event_count, name, eid, string)
+    else:
+        print "%d:%s(%d)" % (event_count, name, eid)
+
+
+# Decoders for each event type
+
+def decode_unimp(eid, name, _unused_dumpfile):
+    "Unimplimented decoder, will trigger exit"
+    print "%s not handled - will now stop" % (name)
+    return False
+
+# Checkpoint decoder
+def swallow_async_qword(eid, name, dumpfile):
+    "Swallow a qword of data without looking at it"
+    step_id = read_qword(dumpfile)
+    print "  %s(%d) @ %d" % (name, eid, step_id)
+    return True
+
+async_decode_table = [ Decoder(0, "REPLAY_ASYNC_EVENT_BH", swallow_async_qword),
+                       Decoder(1, "REPLAY_ASYNC_INPUT", decode_unimp),
+                       Decoder(2, "REPLAY_ASYNC_INPUT_SYNC", decode_unimp),
+                       Decoder(3, "REPLAY_ASYNC_CHAR_READ", decode_unimp),
+                       Decoder(4, "REPLAY_ASYNC_EVENT_BLOCK", decode_unimp),
+                       Decoder(5, "REPLAY_ASYNC_EVENT_NET", decode_unimp),
+]
+# See replay_read_events/replay_read_event
+def decode_async(eid, name, dumpfile):
+    """Decode an ASYNC event"""
+
+    print_event(eid, name)
+
+    async_event_kind = read_byte(dumpfile)
+    async_event_checkpoint = read_byte(dumpfile)
+
+    if async_event_checkpoint != replay_state.current_checkpoint:
+        print "  mismatch between checkpoint %d and async data %d" % (
+            replay_state.current_checkpoint, async_event_checkpoint)
+        return True
+
+    return call_decode(async_decode_table, async_event_kind, dumpfile)
+
+
+def decode_instruction(eid, name, dumpfile):
+    ins_diff = read_dword(dumpfile)
+    print_event(eid, name, "0x%x" % (ins_diff))
+    return True
+
+def decode_audio_out(eid, name, dumpfile):
+    audio_data = read_dword(dumpfile)
+    print_event(eid, name, "%d" % (audio_data))
+    return True
+
+def decode_checkpoint(eid, name, dumpfile):
+    """Decode a checkpoint.
+
+    Checkpoints contain a series of async events with their own specific data.
+    """
+    replay_state.set_checkpoint()
+    # save event count as we peek ahead
+    event_number = replay_state.event_count
+    next_event = read_event(dumpfile)
+
+    # if the next event is EVENT_ASYNC there are a bunch of
+    # async events to read, otherwise we are done
+    if next_event != 3:
+        print_event(eid, name, "no additional data", event_number)
+    else:
+        print_event(eid, name, "more data follows", event_number)
+
+    replay_state.reuse_event(next_event)
+    return True
+
+def decode_checkpoint_init(eid, name, dumpfile):
+    print_event(eid, name)
+    return True
+
+def decode_interrupt(eid, name, dumpfile):
+    print_event(eid, name)
+    return True
+
+def decode_clock(eid, name, dumpfile):
+    clock_data = read_qword(dumpfile)
+    print_event(eid, name, "0x%x" % (clock_data))
+    return True
+
+
+# pre-MTTCG merge
+v5_event_table = [Decoder(0, "EVENT_INSTRUCTION", decode_instruction),
+                  Decoder(1, "EVENT_INTERRUPT", decode_interrupt),
+                  Decoder(2, "EVENT_EXCEPTION", decode_unimp),
+                  Decoder(3, "EVENT_ASYNC", decode_async),
+                  Decoder(4, "EVENT_SHUTDOWN", decode_unimp),
+                  Decoder(5, "EVENT_CHAR_WRITE", decode_unimp),
+                  Decoder(6, "EVENT_CHAR_READ_ALL", decode_unimp),
+                  Decoder(7, "EVENT_CHAR_READ_ALL_ERROR", decode_unimp),
+                  Decoder(8, "EVENT_CLOCK_HOST", decode_clock),
+                  Decoder(9, "EVENT_CLOCK_VIRTUAL_RT", decode_clock),
+                  Decoder(10, "EVENT_CP_CLOCK_WARP_START", decode_checkpoint),
+                  Decoder(11, "EVENT_CP_CLOCK_WARP_ACCOUNT", decode_checkpoint),
+                  Decoder(12, "EVENT_CP_RESET_REQUESTED", decode_checkpoint),
+                  Decoder(13, "EVENT_CP_SUSPEND_REQUESTED", decode_checkpoint),
+                  Decoder(14, "EVENT_CP_CLOCK_VIRTUAL", decode_checkpoint),
+                  Decoder(15, "EVENT_CP_CLOCK_HOST", decode_checkpoint),
+                  Decoder(16, "EVENT_CP_CLOCK_VIRTUAL_RT", decode_checkpoint),
+                  Decoder(17, "EVENT_CP_INIT", decode_checkpoint_init),
+                  Decoder(18, "EVENT_CP_RESET", decode_checkpoint),
+]
+
+# post-MTTCG merge, AUDIO support added
+v6_event_table = [Decoder(0, "EVENT_INSTRUCTION", decode_instruction),
+                  Decoder(1, "EVENT_INTERRUPT", decode_interrupt),
+                  Decoder(2, "EVENT_EXCEPTION", decode_unimp),
+                  Decoder(3, "EVENT_ASYNC", decode_async),
+                  Decoder(4, "EVENT_SHUTDOWN", decode_unimp),
+                  Decoder(5, "EVENT_CHAR_WRITE", decode_unimp),
+                  Decoder(6, "EVENT_CHAR_READ_ALL", decode_unimp),
+                  Decoder(7, "EVENT_CHAR_READ_ALL_ERROR", decode_unimp),
+                  Decoder(8, "EVENT_AUDIO_OUT", decode_audio_out),
+                  Decoder(9, "EVENT_AUDIO_IN", decode_unimp),
+                  Decoder(10, "EVENT_CLOCK_HOST", decode_clock),
+                  Decoder(11, "EVENT_CLOCK_VIRTUAL_RT", decode_clock),
+                  Decoder(12, "EVENT_CP_CLOCK_WARP_START", decode_checkpoint),
+                  Decoder(13, "EVENT_CP_CLOCK_WARP_ACCOUNT", decode_checkpoint),
+                  Decoder(14, "EVENT_CP_RESET_REQUESTED", decode_checkpoint),
+                  Decoder(15, "EVENT_CP_SUSPEND_REQUESTED", decode_checkpoint),
+                  Decoder(16, "EVENT_CP_CLOCK_VIRTUAL", decode_checkpoint),
+                  Decoder(17, "EVENT_CP_CLOCK_HOST", decode_checkpoint),
+                  Decoder(18, "EVENT_CP_CLOCK_VIRTUAL_RT", decode_checkpoint),
+                  Decoder(19, "EVENT_CP_INIT", decode_checkpoint_init),
+                  Decoder(20, "EVENT_CP_RESET", decode_checkpoint),
+]
+
+# Shutdown cause added
+v7_event_table = [Decoder(0, "EVENT_INSTRUCTION", decode_instruction),
+                  Decoder(1, "EVENT_INTERRUPT", decode_interrupt),
+                  Decoder(2, "EVENT_EXCEPTION", decode_unimp),
+                  Decoder(3, "EVENT_ASYNC", decode_async),
+                  Decoder(4, "EVENT_SHUTDOWN", decode_unimp),
+                  Decoder(5, "EVENT_SHUTDOWN_HOST_ERR", decode_unimp),
+                  Decoder(6, "EVENT_SHUTDOWN_HOST_QMP", decode_unimp),
+                  Decoder(7, "EVENT_SHUTDOWN_HOST_SIGNAL", decode_unimp),
+                  Decoder(8, "EVENT_SHUTDOWN_HOST_UI", decode_unimp),
+                  Decoder(9, "EVENT_SHUTDOWN_GUEST_SHUTDOWN", decode_unimp),
+                  Decoder(10, "EVENT_SHUTDOWN_GUEST_RESET", decode_unimp),
+                  Decoder(11, "EVENT_SHUTDOWN_GUEST_PANIC", decode_unimp),
+                  Decoder(12, "EVENT_SHUTDOWN___MAX", decode_unimp),
+                  Decoder(13, "EVENT_CHAR_WRITE", decode_unimp),
+                  Decoder(14, "EVENT_CHAR_READ_ALL", decode_unimp),
+                  Decoder(15, "EVENT_CHAR_READ_ALL_ERROR", decode_unimp),
+                  Decoder(16, "EVENT_AUDIO_OUT", decode_audio_out),
+                  Decoder(17, "EVENT_AUDIO_IN", decode_unimp),
+                  Decoder(18, "EVENT_CLOCK_HOST", decode_clock),
+                  Decoder(19, "EVENT_CLOCK_VIRTUAL_RT", decode_clock),
+                  Decoder(20, "EVENT_CP_CLOCK_WARP_START", decode_checkpoint),
+                  Decoder(21, "EVENT_CP_CLOCK_WARP_ACCOUNT", decode_checkpoint),
+                  Decoder(22, "EVENT_CP_RESET_REQUESTED", decode_checkpoint),
+                  Decoder(23, "EVENT_CP_SUSPEND_REQUESTED", decode_checkpoint),
+                  Decoder(24, "EVENT_CP_CLOCK_VIRTUAL", decode_checkpoint),
+                  Decoder(25, "EVENT_CP_CLOCK_HOST", decode_checkpoint),
+                  Decoder(26, "EVENT_CP_CLOCK_VIRTUAL_RT", decode_checkpoint),
+                  Decoder(27, "EVENT_CP_INIT", decode_checkpoint_init),
+                  Decoder(28, "EVENT_CP_RESET", decode_checkpoint),
+]
+
+def parse_arguments():
+    "Grab arguments for script"
+    parser = argparse.ArgumentParser()
+    parser.add_argument("-f", "--file", help='record/replay dump to read from',
+                        required=True)
+    return parser.parse_args()
+
+def decode_file(filename):
+    "Decode a record/replay dump"
+    dumpfile = open(filename, "rb")
+
+    # read and throwaway the header
+    version = read_dword(dumpfile)
+    junk = read_qword(dumpfile)
+
+    print "HEADER: version 0x%x" % (version)
+
+    if version == 0xe02007:
+        event_decode_table = v7_event_table
+        replay_state.checkpoint_start = 12
+    elif version == 0xe02006:
+        event_decode_table = v6_event_table
+        replay_state.checkpoint_start = 12
+    else:
+        event_decode_table = v5_event_table
+        replay_state.checkpoint_start = 10
+
+    try:
+        decode_ok = True
+        while decode_ok:
+            event = read_event(dumpfile)
+            decode_ok = call_decode(event_decode_table, event, dumpfile)
+    finally:
+        dumpfile.close()
+
+if __name__ == "__main__":
+    args = parse_arguments()
+    decode_file(args.file)
-- 
2.14.3

  parent reply	other threads:[~2018-03-13 22:48 UTC|newest]

Thread overview: 83+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-13 22:46 [Qemu-devel] [PULL 00/69] Misc patches for QEMU soft freeze Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 01/69] qom: introduce object_class_get_list_sorted Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 02/69] net: allow using any PCI NICs in -net or -nic Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 03/69] q35: change default NIC to e1000e Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 04/69] scsi-disk.c: consider bl->max_transfer in INQUIRY emulation Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 05/69] qemu-doc: update deprecation section to use -nic and -netdev hubport Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 06/69] qemu-doc: Add the paragraph about the -no-frame deprecation again Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 07/69] build-sys: make help could have 'modules' target Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 08/69] hw: Do not include "sysemu/block-backend.h" if it is not necessary Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 09/69] checkpatch: Exempt long URLs Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 10/69] vl: export machine_init_done Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 11/69] chardev: fix handling of EAGAIN for TCP chardev Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 12/69] chardev: update net listener gcontext Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 13/69] chardev: allow telnet gsource to switch gcontext Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 14/69] chardev: introduce chr_machine_done hook Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 15/69] chardev: use chardev's gcontext for async connect Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 16/69] chardev: tcp: postpone async connection setup Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 17/69] chardev: tcp: let TLS run on chardev context Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 18/69] scsi: support NDOB (no data-out buffer) for WRITE SAME commands Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 19/69] hw/i386: make IOMMUs configurable via default-configs/ Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 20/69] Polish the version strings containing the package version Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 21/69] hw/mips/jazz: Fix implicit creation of "-drive if=scsi" devices Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 22/69] rcutorture: remove synchronize_rcu from readers Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 23/69] docs: document atomic_load_acquire and atomic_store_release Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 24/69] rcu: make memory barriers more explicit Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 25/69] membarrier: introduce qemu/sys_membarrier.h Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 26/69] membarrier: add --enable-membarrier Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 27/69] hw/isa: Move parallel_hds_isa_init() to hw/char/parallel-isa.c Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 28/69] hw/dma/i8257: Rename DMA_init() to i8257_dma_init() Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 29/69] hw/input/i8042: Extract declarations from i386/pc.h into input/i8042.h Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 30/69] MAINTAINERS: Fix the PC87312 include path Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 31/69] hw/isa/pc87312: Rename the device type as TYPE_PC87312_SUPERIO Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 32/69] hw/isa/pc87312: Use uint16_t for the ISA I/O base address Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 33/69] hw/isa/pc87312: Use 'unsigned int' for the irq value Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 34/69] hw/isa/superio: Add a Super I/O template based on the PC87312 device Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 35/69] hw/isa/pc87312: Inherit from the abstract TYPE_ISA_SUPERIO Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 36/69] hw/isa/superio: Factor out the parallel code from pc87312.c Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 37/69] hw/isa/superio: Factor out the serial " Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 38/69] hw/isa/superio: Factor out the floppy disc controller " Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 39/69] hw/isa/superio: Add a keyboard/mouse controller (8042) Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 40/69] hw/isa/superio: Factor out the IDE code from pc87312.c Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 41/69] hw/mips/malta: Code movement Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 42/69] hw/isa/superio: Factor out the FDC37M817 Super I/O from mips_malta.c Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 43/69] hw/mips/mips_fulong2e: Factor out vt82c686b_southbridge_init() Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 44/69] hw/isa/vt82c686: Rename vt82c686b_init() -> vt82c686b_isa_init() Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 45/69] hw/isa/vt82c686: Add the TYPE_VT82C686B_SUPERIO Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 46/69] MAINTAINERS: Add entries for the VT82C686B Super I/O Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 47/69] MAINTAINERS: Split the Alpha TCG/machine section Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 48/69] hw/isa/superio: Add the SMC FDC37C669 Super I/O Paolo Bonzini
2018-03-13 22:46 ` [Qemu-devel] [PULL 49/69] hw/alpha/dp264: Add the ISA DMA controller Paolo Bonzini
2018-03-13 22:47 ` [Qemu-devel] [PULL 50/69] hw/alpha/dp264: Use the TYPE_SMC37C669_SUPERIO Paolo Bonzini
2018-06-01 18:51   ` Emilio G. Cota
2018-06-01 19:49     ` Richard Henderson
2018-06-13 16:21     ` Paolo Bonzini
2018-06-13 16:35       ` Philippe Mathieu-Daudé
2018-06-13 17:17         ` Philippe Mathieu-Daudé
2018-06-14 12:21           ` Philippe Mathieu-Daudé
2018-03-13 22:47 ` [Qemu-devel] [PULL 51/69] hw/i386/pc: Factor out the superio code Paolo Bonzini
2018-03-13 22:47 ` [Qemu-devel] [PULL 52/69] cpu-exec: fix exception_index handling Paolo Bonzini
2018-03-13 22:47 ` [Qemu-devel] [PULL 53/69] replay: fix processing async events Paolo Bonzini
2018-03-13 22:47 ` [Qemu-devel] [PULL 54/69] replay: fixed replay_enable_events Paolo Bonzini
2018-03-13 22:47 ` [Qemu-devel] [PULL 55/69] replay: fix save/load vm for non-empty queue Paolo Bonzini
2018-03-13 22:47 ` [Qemu-devel] [PULL 56/69] replay: added replay log format description Paolo Bonzini
2018-03-13 22:47 ` [Qemu-devel] [PULL 57/69] replay: save prior value of the host clock Paolo Bonzini
2018-03-13 22:47 ` [Qemu-devel] [PULL 58/69] replay/replay.c: bump REPLAY_VERSION again Paolo Bonzini
2018-03-13 22:47 ` [Qemu-devel] [PULL 59/69] replay/replay-internal.c: track holding of replay_lock Paolo Bonzini
2018-03-13 22:47 ` [Qemu-devel] [PULL 60/69] replay: make locking visible outside replay code Paolo Bonzini
2018-03-13 22:47 ` [Qemu-devel] [PULL 61/69] replay: don't destroy mutex at exit Paolo Bonzini
2018-03-13 22:47 ` [Qemu-devel] [PULL 62/69] replay: push replay_mutex_lock up the call tree Paolo Bonzini
2018-03-13 22:47 ` [Qemu-devel] [PULL 63/69] replay: check return values of fwrite Paolo Bonzini
2018-03-13 22:47 ` [Qemu-devel] [PULL 64/69] replay: avoid recursive call of checkpoints Paolo Bonzini
2018-03-13 22:47 ` Paolo Bonzini [this message]
2018-03-13 22:47 ` [Qemu-devel] [PULL 66/69] replay: don't process async events when warping the clock Paolo Bonzini
2018-03-13 22:47 ` [Qemu-devel] [PULL 67/69] replay: save vmstate of the asynchronous events Paolo Bonzini
2018-03-13 22:47 ` [Qemu-devel] [PULL 68/69] replay: update documentation Paolo Bonzini
2018-03-13 22:47 ` [Qemu-devel] [PULL 69/69] tcg: fix cpu_io_recompile Paolo Bonzini
2018-03-14  0:15 ` [Qemu-devel] [PULL 00/69] Misc patches for QEMU soft freeze no-reply
2018-03-14  3:35   ` Peter Xu
2018-03-14 10:12     ` Paolo Bonzini
2018-03-14 11:30       ` Eric Blake
2018-03-14 11:36         ` Peter Xu
2018-03-14 11:53         ` Paolo Bonzini
2018-03-16 12:58 ` Peter Maydell

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=20180313224719.4954-66-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=alex.bennee@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /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.