static int virtio_blk_load(QEMUFile *f, void *opaque, int version_id) { VirtIOBlock *s = opaque; int ret; if (version_id != 2) return -EINVAL; ret = virtio_load(&s->vdev, f); if (ret) { return ret; } while (qemu_get_sbyte(f)) { VirtIOBlockReq *req = virtio_blk_alloc_request(s); qemu_get_buffer(f, (unsigned char*)&req->elem, sizeof(req->elem)); req->next = s->rq; s->rq = req; virtqueue_map_sg(req->elem.in_sg, req->elem.in_addr, req->elem.in_num, 1); virtqueue_map_sg(req->elem.out_sg, req->elem.out_addr, req->elem.out_num, 0); } return 0; }
static int virtio_balloon_load(QEMUFile *f, void *opaque, int version_id) { if (version_id != 1) return -EINVAL; return virtio_load(VIRTIO_DEVICE(opaque), f, version_id); }
static int vhost_vsock_load(QEMUFile *f, void *opaque, size_t size) { VHostVSock *vsock = opaque; VirtIODevice *vdev = VIRTIO_DEVICE(vsock); int ret; ret = virtio_load(vdev, f, VHOST_VSOCK_SAVEVM_VERSION); if (ret) { return ret; } if (virtio_queue_get_addr(vdev, 2)) { /* Defer transport reset event to a vm clock timer so that virtqueue * changes happen after migration has completed. */ assert(!vsock->post_load_timer); vsock->post_load_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, vhost_vsock_post_load_timer_cb, vsock); timer_mod(vsock->post_load_timer, 1); } return 0; }
static int virtio_blk_load(QEMUFile *f, void *opaque, int version_id) { VirtIOBlock *s = opaque; VirtIODevice *vdev = VIRTIO_DEVICE(s); if (version_id != 2) return -EINVAL; return virtio_load(vdev, f, version_id); }
static int virtio_console_load(QEMUFile *f, void *opaque, int version_id) { VirtIOConsole *s = opaque; if (version_id != 1) return -EINVAL; virtio_load(&s->vdev, f); return 0; }
static int virtio_balloon_load(QEMUFile *f, void *opaque, int version_id) { VirtIOBalloon *s = opaque; if (version_id != 1) return -EINVAL; virtio_load(&s->vdev, f); s->num_pages = qemu_get_be32(f); s->actual = qemu_get_be32(f); return 0; }
static int virtio_audio_load(QEMUFile *f, void *opaque, int version_id) { VirtIOAudio *s = opaque; VirtIOAudioStream *stream; int i; int mode; if (version_id != 1) return -EINVAL; /* FIXME: Do bad things happen if there is a transfer in progress? */ virtio_load(&s->vdev, f); for (i = 0; i < NUM_STREAMS; i++) { stream = &s->stream[i]; stream->has_buffer = 0; stream->data_left = 0; if (stream->in_voice) { AUD_close_in(&s->card, stream->in_voice); stream->in_voice = NULL; } if (stream->out_voice) { AUD_close_out(&s->card, stream->out_voice); stream->out_voice = NULL; } mode = qemu_get_byte(f); stream->fmt.endianness = qemu_get_byte(f); stream->fmt.nchannels = qemu_get_be16(f); stream->fmt.fmt = qemu_get_be32(f); stream->fmt.freq = qemu_get_be32(f); if (mode & 2) { stream->in_voice = AUD_open_in(&s->card, stream->in_voice, "virtio-audio.in", stream, virtio_audio_callback, &stream->fmt); AUD_set_active_in(stream->in_voice, mode & 1); } else if (mode & 4) { stream->out_voice = AUD_open_out(&s->card, stream->out_voice, "virtio-audio.out", stream, virtio_audio_callback, &stream->fmt); AUD_set_active_out(stream->out_voice, mode & 1); } } return 0; }
static int virtio_blk_load(QEMUFile *f, void *opaque, int version_id) { VirtIOBlock *s = opaque; if (version_id != 2) return -EINVAL; virtio_load(&s->vdev, f); while (qemu_get_sbyte(f)) { VirtIOBlockReq *req = virtio_blk_alloc_request(s); qemu_get_buffer(f, (unsigned char*)&req->elem, sizeof(req->elem)); req->next = s->rq; s->rq = req->next; } return 0; }
static int virtio_balloon_load(QEMUFile *f, void *opaque, int version_id) { VirtIOBalloon *s = VIRTIO_BALLOON(opaque); VirtIODevice *vdev = VIRTIO_DEVICE(s); int ret; if (version_id != 1) return -EINVAL; ret = virtio_load(vdev, f); if (ret) { return ret; } s->num_pages = qemu_get_be32(f); s->actual = qemu_get_be32(f); return 0; }
static int virtio_net_load(QEMUFile *f, void *opaque, int version_id) { VirtIONet *n = opaque; if (version_id != 1) return -EINVAL; virtio_load(&n->vdev, f); qemu_get_buffer(f, n->mac, 6); n->tx_timer_active = qemu_get_be32(f); if (n->tx_timer_active) { qemu_mod_timer(n->tx_timer, qemu_get_clock(vm_clock) + TX_TIMER_INTERVAL); } return 0; }
static int virtio_rng_load(QEMUFile *f, void *opaque, int version_id) { VirtIORNG *vrng = opaque; int ret; if (version_id != 1) { return -EINVAL; } ret = virtio_load(VIRTIO_DEVICE(vrng), f, version_id); if (ret != 0) { return ret; } /* We may have an element ready but couldn't process it due to a quota * limit. Make sure to try again after live migration when the quota may * have been reset. */ virtio_rng_process(vrng); return 0; }
static int virtio_9p_load(QEMUFile *f, void *opaque, int version_id) { return virtio_load(VIRTIO_DEVICE(opaque), f, version_id); }