These patches add replaces calls of bdrv functions by calls of their replay versions.
Signed-off-by: Pavel Dovgalyuk <pavel.dovga...@gmail.com> --- diff --git a/hw/ide/atapi.c b/hw/ide/atapi.c index f7d2009..0614102 100644 --- a/hw/ide/atapi.c +++ b/hw/ide/atapi.c @@ -25,6 +25,7 @@ #include "hw/ide/internal.h" #include "hw/scsi/scsi.h" +#include "replay/replay.h" static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret); @@ -348,8 +349,10 @@ static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret) s->bus->dma->iov.iov_base = (void *)(s->io_buffer + data_offset); s->bus->dma->iov.iov_len = n * 4 * 512; qemu_iovec_init_external(&s->bus->dma->qiov, &s->bus->dma->iov, 1); + s->bus->dma->qiov.replay = true; + s->bus->dma->qiov.replay_step = replay_get_current_step(); - s->bus->dma->aiocb = bdrv_aio_readv(s->bs, (int64_t)s->lba << 2, + s->bus->dma->aiocb = bdrv_aio_readv_replay(s->bs, (int64_t)s->lba << 2, &s->bus->dma->qiov, n * 4, ide_atapi_cmd_read_dma_cb, s); return; diff --git a/hw/ide/core.c b/hw/ide/core.c index 3a38f1e..d69cc0f 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -32,6 +32,8 @@ #include "sysemu/dma.h" #include "hw/block/block.h" #include "sysemu/blockdev.h" +#include "replay/replay.h" +#include "qemu/log.h" #include <hw/ide/internal.h> @@ -82,8 +84,8 @@ static void ide_identify(IDEState *s) IDEDevice *dev = s->unit ? s->bus->slave : s->bus->master; if (s->identify_set) { - memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data)); - return; + memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data)); + return; } memset(s->io_buffer, 0, 512); @@ -409,7 +411,7 @@ BlockDriverAIOCB *ide_issue_trim(BlockDriverState *bs, TrimAIOCB *iocb; iocb = qemu_aio_get(&trim_aiocb_info, bs, cb, opaque); - iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb); + iocb->bh = qemu_bh_new_replay(ide_trim_bh_cb, iocb, replay_get_current_step()); iocb->ret = 0; iocb->qiov = qiov; iocb->i = -1; @@ -557,9 +559,11 @@ void ide_sector_read(IDEState *s) s->iov.iov_base = s->io_buffer; s->iov.iov_len = n * BDRV_SECTOR_SIZE; qemu_iovec_init_external(&s->qiov, &s->iov, 1); + s->qiov.replay = true; + s->qiov.replay_step = replay_get_current_step(); bdrv_acct_start(s->bs, &s->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ); - s->pio_aiocb = bdrv_aio_readv(s->bs, sector_num, &s->qiov, n, + s->pio_aiocb = bdrv_aio_readv_replay(s->bs, sector_num, &s->qiov, n, ide_sector_read_cb, s); } @@ -793,9 +797,11 @@ void ide_sector_write(IDEState *s) s->iov.iov_base = s->io_buffer; s->iov.iov_len = n * BDRV_SECTOR_SIZE; qemu_iovec_init_external(&s->qiov, &s->iov, 1); + s->qiov.replay = true; + s->qiov.replay_step = replay_get_current_step(); bdrv_acct_start(s->bs, &s->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ); - s->pio_aiocb = bdrv_aio_writev(s->bs, sector_num, &s->qiov, n, + s->pio_aiocb = bdrv_aio_writev_replay(s->bs, sector_num, &s->qiov, n, ide_sector_write_cb, s); } @@ -825,7 +831,7 @@ void ide_flush_cache(IDEState *s) s->status |= BUSY_STAT; bdrv_acct_start(s->bs, &s->acct, 0, BDRV_ACCT_FLUSH); - bdrv_aio_flush(s->bs, ide_flush_cb, s); + bdrv_aio_flush_replay(s->bs, ide_flush_cb, s); } static void ide_cfata_metadata_inquiry(IDEState *s) @@ -2124,6 +2130,7 @@ int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind, if (model) { pstrcpy(s->drive_model_str, sizeof(s->drive_model_str), model); } else { + char *str; switch (kind) { case IDE_CD: strcpy(s->drive_model_str, "QEMU DVD-ROM"); diff --git a/hw/ide/pci.c b/hw/ide/pci.c index 6257a21..47ab24d --- a/hw/ide/pci.c +++ b/hw/ide/pci.c @@ -382,6 +382,15 @@ static bool ide_bmdma_status_needed(void *opaque) return ((bm->status & abused_bits) != 0); } +static int ide_bmdma_pre_load(void *opaque) +{ + BMDMAState *bm = opaque; + /* Reset is not performed in replay mode, + so reset status manually to allow ide_bmdma_post_load function initialize it. */ + bm->status = 0; + return 0; +} + static void ide_bmdma_pre_save(void *opaque) { BMDMAState *bm = opaque; @@ -434,6 +443,7 @@ static const VMStateDescription vmstate_bmdma = { .name = "ide bmdma", .version_id = 3, .minimum_version_id = 0, + .pre_load = ide_bmdma_pre_load, .pre_save = ide_bmdma_pre_save, .fields = (VMStateField[]) { VMSTATE_UINT8(cmd, BMDMAState),