Migration pull 2017-09-27
-----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJZy64HAAoJEAUWMx68W/3nTqwP/A5Gx4Qwkv5KKdpM0YLq//d+ OODmzl7Ni3a5Up1ETqGdLb84estrgY+5DISp73Rkt4a5tbT7+XKrhb4qD+93NnTe zynY9in4C1jGxYm7YzeOhwSeIiuLZMTCLQlGdYw7/nunIFwkItUEvAFx3AG1WCJe 2Mk0lvmg4LikruDDMdzqZaJu7h5RU5sQjA7SsyrTBdsN7tNWl3rKLYGXwgzv0uz5 n2xkUgzvvnj1Bk/Adojkn05yxA86xKD/4rhFED9fjNVSjAGHMrHIWOJ70V26Cg5w 3gJ+5mesWsH+erf0JFYv0S38SyFbmIOE39Nn13D/d0o1x89P8B8cgqbi3ADTKM77 875wuIVnZzi2vIwVdxXQ9GHQ79cpXwr2fOfQ2rjT6Ll95K+u/MQG86fQiO0eJW+0 KwQVCwwh+HmCUcCogMuxAc9+F8C8qolwCi/9QXwS2yLBElHKaWDIMyTce36cW9d7 cZaKIOeSJUGNFoaWZnXN88MRuOYbdywTl+GddVAW3+VJCTYV2oi0o5fsTfxXy5AV y7uYo/pcSj2gSZJ5GairMlB6p5iXnE8yusi1e4ZKA1x1TaSHSb6zR59lRUFr+j/L JhUCfA85v5/elGqgkYp6UhSzFDJ2ID2oSEMQTIzfVrinOXtnf2KEh33YMbUH5qyo yHVEu12uPe9rE6A0vWlu =/+LV -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/dgilbert/tags/pull-migration-20170927a' into staging Migration pull 2017-09-27 # gpg: Signature made Wed 27 Sep 2017 14:56:23 BST # gpg: using RSA key 0x0516331EBC5BFDE7 # gpg: Good signature from "Dr. David Alan Gilbert (RH2) <dgilbert@redhat.com>" # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: 45F5 C71B 4A0C B7FB 977A 9FA9 0516 331E BC5B FDE7 * remotes/dgilbert/tags/pull-migration-20170927a: migration: Route more error paths migration: Route errors up through vmstate_save migration: wire vmstate_save_state errors up to vmstate_subsection_save migration: Check field save returns migration: check pre_save return in vmstate_save_state migration: pre_save return int migration: disable auto-converge during bulk block migration Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
ab16152926
@ -202,7 +202,7 @@ The functions to do that are inside a vmstate definition, and are called:
|
|||||||
|
|
||||||
This function is called after we load the state of one device.
|
This function is called after we load the state of one device.
|
||||||
|
|
||||||
- void (*pre_save)(void *opaque);
|
- int (*pre_save)(void *opaque);
|
||||||
|
|
||||||
This function is called before we save the state of one device.
|
This function is called before we save the state of one device.
|
||||||
|
|
||||||
|
@ -1143,13 +1143,15 @@ static void pxa2xx_rtc_init(Object *obj)
|
|||||||
sysbus_init_mmio(dev, &s->iomem);
|
sysbus_init_mmio(dev, &s->iomem);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pxa2xx_rtc_pre_save(void *opaque)
|
static int pxa2xx_rtc_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
PXA2xxRTCState *s = (PXA2xxRTCState *) opaque;
|
PXA2xxRTCState *s = (PXA2xxRTCState *) opaque;
|
||||||
|
|
||||||
pxa2xx_rtc_hzupdate(s);
|
pxa2xx_rtc_hzupdate(s);
|
||||||
pxa2xx_rtc_piupdate(s);
|
pxa2xx_rtc_piupdate(s);
|
||||||
pxa2xx_rtc_swupdate(s);
|
pxa2xx_rtc_swupdate(s);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pxa2xx_rtc_post_load(void *opaque, int version_id)
|
static int pxa2xx_rtc_post_load(void *opaque, int version_id)
|
||||||
|
@ -406,11 +406,13 @@ static void strongarm_rtc_init(Object *obj)
|
|||||||
sysbus_init_mmio(dev, &s->iomem);
|
sysbus_init_mmio(dev, &s->iomem);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void strongarm_rtc_pre_save(void *opaque)
|
static int strongarm_rtc_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
StrongARMRTCState *s = opaque;
|
StrongARMRTCState *s = opaque;
|
||||||
|
|
||||||
strongarm_rtc_hzupdate(s);
|
strongarm_rtc_hzupdate(s);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int strongarm_rtc_post_load(void *opaque, int version_id)
|
static int strongarm_rtc_post_load(void *opaque, int version_id)
|
||||||
|
@ -567,11 +567,13 @@ static int wm8750_rx(I2CSlave *i2c)
|
|||||||
return 0x00;
|
return 0x00;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wm8750_pre_save(void *opaque)
|
static int wm8750_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
WM8750State *s = opaque;
|
WM8750State *s = opaque;
|
||||||
|
|
||||||
s->rate_vmstate = s->rate - wm_rate_table;
|
s->rate_vmstate = s->rate - wm_rate_table;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int wm8750_post_load(void *opaque, int version_id)
|
static int wm8750_post_load(void *opaque, int version_id)
|
||||||
|
@ -1101,11 +1101,13 @@ static int reconstruct_phase(FDCtrl *fdctrl)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fdc_pre_save(void *opaque)
|
static int fdc_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
FDCtrl *s = opaque;
|
FDCtrl *s = opaque;
|
||||||
|
|
||||||
s->dor_vmstate = s->dor | GET_CUR_DRV(s);
|
s->dor_vmstate = s->dor | GET_CUR_DRV(s);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fdc_pre_load(void *opaque)
|
static int fdc_pre_load(void *opaque)
|
||||||
|
@ -1251,9 +1251,11 @@ static void m25p80_reset(DeviceState *d)
|
|||||||
reset_memory(s);
|
reset_memory(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void m25p80_pre_save(void *opaque)
|
static int m25p80_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
flash_sync_dirty((Flash *)opaque, -1);
|
flash_sync_dirty((Flash *)opaque, -1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Property m25p80_properties[] = {
|
static Property m25p80_properties[] = {
|
||||||
|
@ -325,11 +325,13 @@ static void nand_command(NANDFlashState *s)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nand_pre_save(void *opaque)
|
static int nand_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
NANDFlashState *s = NAND(opaque);
|
NANDFlashState *s = NAND(opaque);
|
||||||
|
|
||||||
s->ioaddr_vmstate = s->ioaddr - s->io;
|
s->ioaddr_vmstate = s->ioaddr - s->io;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nand_post_load(void *opaque, int version_id)
|
static int nand_post_load(void *opaque, int version_id)
|
||||||
|
@ -137,7 +137,7 @@ static void onenand_intr_update(OneNANDState *s)
|
|||||||
qemu_set_irq(s->intr, ((s->intstatus >> 15) ^ (~s->config[0] >> 6)) & 1);
|
qemu_set_irq(s->intr, ((s->intstatus >> 15) ^ (~s->config[0] >> 6)) & 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void onenand_pre_save(void *opaque)
|
static int onenand_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
OneNANDState *s = opaque;
|
OneNANDState *s = opaque;
|
||||||
if (s->current == s->otp) {
|
if (s->current == s->otp) {
|
||||||
@ -147,6 +147,8 @@ static void onenand_pre_save(void *opaque)
|
|||||||
} else {
|
} else {
|
||||||
s->current_direction = 0;
|
s->current_direction = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int onenand_post_load(void *opaque, int version_id)
|
static int onenand_post_load(void *opaque, int version_id)
|
||||||
|
@ -630,10 +630,12 @@ static void serial_event(void *opaque, int event)
|
|||||||
serial_receive_break(s);
|
serial_receive_break(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void serial_pre_save(void *opaque)
|
static int serial_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
SerialState *s = opaque;
|
SerialState *s = opaque;
|
||||||
s->fcr_vmstate = s->fcr;
|
s->fcr_vmstate = s->fcr;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int serial_pre_load(void *opaque)
|
static int serial_pre_load(void *opaque)
|
||||||
|
@ -2204,7 +2204,7 @@ static void qxl_realize_secondary(PCIDevice *dev, Error **errp)
|
|||||||
qxl_realize_common(qxl, errp);
|
qxl_realize_common(qxl, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qxl_pre_save(void *opaque)
|
static int qxl_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
PCIQXLDevice* d = opaque;
|
PCIQXLDevice* d = opaque;
|
||||||
uint8_t *ram_start = d->vga.vram_ptr;
|
uint8_t *ram_start = d->vga.vram_ptr;
|
||||||
@ -2216,6 +2216,8 @@ static void qxl_pre_save(void *opaque)
|
|||||||
d->last_release_offset = (uint8_t *)d->last_release - ram_start;
|
d->last_release_offset = (uint8_t *)d->last_release - ram_start;
|
||||||
}
|
}
|
||||||
assert(d->last_release_offset < d->vga.vram_size);
|
assert(d->last_release_offset < d->vga.vram_size);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qxl_pre_load(void *opaque)
|
static int qxl_pre_load(void *opaque)
|
||||||
|
@ -1050,9 +1050,7 @@ static int virtio_gpu_save(QEMUFile *f, void *opaque, size_t size,
|
|||||||
}
|
}
|
||||||
qemu_put_be32(f, 0); /* end of list */
|
qemu_put_be32(f, 0); /* end of list */
|
||||||
|
|
||||||
vmstate_save_state(f, &vmstate_virtio_gpu_scanouts, g, NULL);
|
return vmstate_save_state(f, &vmstate_virtio_gpu_scanouts, g, NULL);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
|
static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
|
||||||
|
@ -41,7 +41,7 @@ static const TypeInfo i2c_bus_info = {
|
|||||||
.instance_size = sizeof(I2CBus),
|
.instance_size = sizeof(I2CBus),
|
||||||
};
|
};
|
||||||
|
|
||||||
static void i2c_bus_pre_save(void *opaque)
|
static int i2c_bus_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
I2CBus *bus = opaque;
|
I2CBus *bus = opaque;
|
||||||
|
|
||||||
@ -53,6 +53,8 @@ static void i2c_bus_pre_save(void *opaque)
|
|||||||
bus->saved_address = I2C_BROADCAST;
|
bus->saved_address = I2C_BROADCAST;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const VMStateDescription vmstate_i2c_bus = {
|
static const VMStateDescription vmstate_i2c_bus = {
|
||||||
|
@ -254,11 +254,13 @@ static const VMStateDescription kvmclock_reliable_get_clock = {
|
|||||||
* final pages of memory (which happens between vm_stop()
|
* final pages of memory (which happens between vm_stop()
|
||||||
* and pre_save()) takes max_downtime.
|
* and pre_save()) takes max_downtime.
|
||||||
*/
|
*/
|
||||||
static void kvmclock_pre_save(void *opaque)
|
static int kvmclock_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
KVMClockState *s = opaque;
|
KVMClockState *s = opaque;
|
||||||
|
|
||||||
kvm_update_clock(s);
|
kvm_update_clock(s);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const VMStateDescription kvmclock_vmsd = {
|
static const VMStateDescription kvmclock_vmsd = {
|
||||||
|
@ -2752,7 +2752,7 @@ static int ide_drive_pio_post_load(void *opaque, int version_id)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ide_drive_pio_pre_save(void *opaque)
|
static int ide_drive_pio_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
IDEState *s = opaque;
|
IDEState *s = opaque;
|
||||||
int idx;
|
int idx;
|
||||||
@ -2768,6 +2768,8 @@ static void ide_drive_pio_pre_save(void *opaque)
|
|||||||
} else {
|
} else {
|
||||||
s->end_transfer_fn_idx = idx;
|
s->end_transfer_fn_idx = idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ide_drive_pio_state_needed(void *opaque)
|
static bool ide_drive_pio_state_needed(void *opaque)
|
||||||
|
@ -296,7 +296,7 @@ static bool ide_bmdma_status_needed(void *opaque)
|
|||||||
return ((bm->status & abused_bits) != 0);
|
return ((bm->status & abused_bits) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ide_bmdma_pre_save(void *opaque)
|
static int ide_bmdma_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
BMDMAState *bm = opaque;
|
BMDMAState *bm = opaque;
|
||||||
uint8_t abused_bits = BM_MIGRATION_COMPAT_STATUS_BITS;
|
uint8_t abused_bits = BM_MIGRATION_COMPAT_STATUS_BITS;
|
||||||
@ -310,6 +310,8 @@ static void ide_bmdma_pre_save(void *opaque)
|
|||||||
bm->migration_retry_nsector = bm->bus->retry_nsector;
|
bm->migration_retry_nsector = bm->bus->retry_nsector;
|
||||||
bm->migration_compat_status =
|
bm->migration_compat_status =
|
||||||
(bm->status & ~abused_bits) | (bm->bus->error_status & abused_bits);
|
(bm->status & ~abused_bits) | (bm->bus->error_status & abused_bits);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function accesses bm->bus->error_status which is loaded only after
|
/* This function accesses bm->bus->error_status which is loaded only after
|
||||||
|
@ -1216,12 +1216,14 @@ static int ps2_kbd_post_load(void* opaque, int version_id)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ps2_kbd_pre_save(void *opaque)
|
static int ps2_kbd_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
PS2KbdState *s = (PS2KbdState *)opaque;
|
PS2KbdState *s = (PS2KbdState *)opaque;
|
||||||
PS2State *ps2 = &s->common;
|
PS2State *ps2 = &s->common;
|
||||||
|
|
||||||
ps2_common_post_load(ps2);
|
ps2_common_post_load(ps2);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const VMStateDescription vmstate_ps2_keyboard = {
|
static const VMStateDescription vmstate_ps2_keyboard = {
|
||||||
@ -1254,12 +1256,14 @@ static int ps2_mouse_post_load(void *opaque, int version_id)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ps2_mouse_pre_save(void *opaque)
|
static int ps2_mouse_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
PS2MouseState *s = (PS2MouseState *)opaque;
|
PS2MouseState *s = (PS2MouseState *)opaque;
|
||||||
PS2State *ps2 = &s->common;
|
PS2State *ps2 = &s->common;
|
||||||
|
|
||||||
ps2_common_post_load(ps2);
|
ps2_common_post_load(ps2);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const VMStateDescription vmstate_ps2_mouse = {
|
static const VMStateDescription vmstate_ps2_mouse = {
|
||||||
|
@ -976,10 +976,12 @@ static void tsc210x_i2s_set_rate(TSC210xState *s, int in, int out)
|
|||||||
s->i2s_rx_rate = in;
|
s->i2s_rx_rate = in;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tsc210x_pre_save(void *opaque)
|
static int tsc210x_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
TSC210xState *s = (TSC210xState *) opaque;
|
TSC210xState *s = (TSC210xState *) opaque;
|
||||||
s->now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
|
s->now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tsc210x_post_load(void *opaque, int version_id)
|
static int tsc210x_post_load(void *opaque, int version_id)
|
||||||
|
@ -360,7 +360,7 @@ static int apic_pre_load(void *opaque)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void apic_dispatch_pre_save(void *opaque)
|
static int apic_dispatch_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
APICCommonState *s = APIC_COMMON(opaque);
|
APICCommonState *s = APIC_COMMON(opaque);
|
||||||
APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
|
APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
|
||||||
@ -368,6 +368,8 @@ static void apic_dispatch_pre_save(void *opaque)
|
|||||||
if (info->pre_save) {
|
if (info->pre_save) {
|
||||||
info->pre_save(s);
|
info->pre_save(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int apic_dispatch_post_load(void *opaque, int version_id)
|
static int apic_dispatch_post_load(void *opaque, int version_id)
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
#include "gic_internal.h"
|
#include "gic_internal.h"
|
||||||
#include "hw/arm/linux-boot-if.h"
|
#include "hw/arm/linux-boot-if.h"
|
||||||
|
|
||||||
static void gic_pre_save(void *opaque)
|
static int gic_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
GICState *s = (GICState *)opaque;
|
GICState *s = (GICState *)opaque;
|
||||||
ARMGICCommonClass *c = ARM_GIC_COMMON_GET_CLASS(s);
|
ARMGICCommonClass *c = ARM_GIC_COMMON_GET_CLASS(s);
|
||||||
@ -31,6 +31,8 @@ static void gic_pre_save(void *opaque)
|
|||||||
if (c->pre_save) {
|
if (c->pre_save) {
|
||||||
c->pre_save(s);
|
c->pre_save(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gic_post_load(void *opaque, int version_id)
|
static int gic_post_load(void *opaque, int version_id)
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
#include "gicv3_internal.h"
|
#include "gicv3_internal.h"
|
||||||
#include "hw/arm/linux-boot-if.h"
|
#include "hw/arm/linux-boot-if.h"
|
||||||
|
|
||||||
static void gicv3_pre_save(void *opaque)
|
static int gicv3_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
GICv3State *s = (GICv3State *)opaque;
|
GICv3State *s = (GICv3State *)opaque;
|
||||||
ARMGICv3CommonClass *c = ARM_GICV3_COMMON_GET_CLASS(s);
|
ARMGICv3CommonClass *c = ARM_GICV3_COMMON_GET_CLASS(s);
|
||||||
@ -36,6 +36,8 @@ static void gicv3_pre_save(void *opaque)
|
|||||||
if (c->pre_save) {
|
if (c->pre_save) {
|
||||||
c->pre_save(s);
|
c->pre_save(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gicv3_post_load(void *opaque, int version_id)
|
static int gicv3_post_load(void *opaque, int version_id)
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
#include "hw/intc/arm_gicv3_its_common.h"
|
#include "hw/intc/arm_gicv3_its_common.h"
|
||||||
#include "qemu/log.h"
|
#include "qemu/log.h"
|
||||||
|
|
||||||
static void gicv3_its_pre_save(void *opaque)
|
static int gicv3_its_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
GICv3ITSState *s = (GICv3ITSState *)opaque;
|
GICv3ITSState *s = (GICv3ITSState *)opaque;
|
||||||
GICv3ITSCommonClass *c = ARM_GICV3_ITS_COMMON_GET_CLASS(s);
|
GICv3ITSCommonClass *c = ARM_GICV3_ITS_COMMON_GET_CLASS(s);
|
||||||
@ -31,6 +31,8 @@ static void gicv3_its_pre_save(void *opaque)
|
|||||||
if (c->pre_save) {
|
if (c->pre_save) {
|
||||||
c->pre_save(s);
|
c->pre_save(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gicv3_its_post_load(void *opaque, int version_id)
|
static int gicv3_its_post_load(void *opaque, int version_id)
|
||||||
|
@ -46,7 +46,7 @@ void pic_reset_common(PICCommonState *s)
|
|||||||
/* Note: ELCR is not reset */
|
/* Note: ELCR is not reset */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pic_dispatch_pre_save(void *opaque)
|
static int pic_dispatch_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
PICCommonState *s = opaque;
|
PICCommonState *s = opaque;
|
||||||
PICCommonClass *info = PIC_COMMON_GET_CLASS(s);
|
PICCommonClass *info = PIC_COMMON_GET_CLASS(s);
|
||||||
@ -54,6 +54,8 @@ static void pic_dispatch_pre_save(void *opaque)
|
|||||||
if (info->pre_save) {
|
if (info->pre_save) {
|
||||||
info->pre_save(s);
|
info->pre_save(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pic_dispatch_post_load(void *opaque, int version_id)
|
static int pic_dispatch_post_load(void *opaque, int version_id)
|
||||||
|
@ -102,7 +102,7 @@ void ioapic_reset_common(DeviceState *dev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ioapic_dispatch_pre_save(void *opaque)
|
static int ioapic_dispatch_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
IOAPICCommonState *s = IOAPIC_COMMON(opaque);
|
IOAPICCommonState *s = IOAPIC_COMMON(opaque);
|
||||||
IOAPICCommonClass *info = IOAPIC_COMMON_GET_CLASS(s);
|
IOAPICCommonClass *info = IOAPIC_COMMON_GET_CLASS(s);
|
||||||
@ -110,6 +110,8 @@ static void ioapic_dispatch_pre_save(void *opaque)
|
|||||||
if (info->pre_save) {
|
if (info->pre_save) {
|
||||||
info->pre_save(s);
|
info->pre_save(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ioapic_dispatch_post_load(void *opaque, int version_id)
|
static int ioapic_dispatch_post_load(void *opaque, int version_id)
|
||||||
|
@ -420,7 +420,7 @@ typedef struct KVMS390FLICStateMigTmp {
|
|||||||
uint8_t nimm;
|
uint8_t nimm;
|
||||||
} KVMS390FLICStateMigTmp;
|
} KVMS390FLICStateMigTmp;
|
||||||
|
|
||||||
static void kvm_flic_ais_pre_save(void *opaque)
|
static int kvm_flic_ais_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
KVMS390FLICStateMigTmp *tmp = opaque;
|
KVMS390FLICStateMigTmp *tmp = opaque;
|
||||||
KVMS390FLICState *flic = tmp->parent;
|
KVMS390FLICState *flic = tmp->parent;
|
||||||
@ -433,11 +433,13 @@ static void kvm_flic_ais_pre_save(void *opaque)
|
|||||||
|
|
||||||
if (ioctl(flic->fd, KVM_GET_DEVICE_ATTR, &attr)) {
|
if (ioctl(flic->fd, KVM_GET_DEVICE_ATTR, &attr)) {
|
||||||
error_report("Failed to retrieve kvm flic ais states");
|
error_report("Failed to retrieve kvm flic ais states");
|
||||||
return;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp->simm = ais.simm;
|
tmp->simm = ais.simm;
|
||||||
tmp->nimm = ais.nimm;
|
tmp->nimm = ais.nimm;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int kvm_flic_ais_post_load(void *opaque, int version_id)
|
static int kvm_flic_ais_post_load(void *opaque, int version_id)
|
||||||
|
@ -241,7 +241,7 @@ static void icp_irq(ICSState *ics, int server, int nr, uint8_t priority)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void icp_dispatch_pre_save(void *opaque)
|
static int icp_dispatch_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
ICPState *icp = opaque;
|
ICPState *icp = opaque;
|
||||||
ICPStateClass *info = ICP_GET_CLASS(icp);
|
ICPStateClass *info = ICP_GET_CLASS(icp);
|
||||||
@ -249,6 +249,8 @@ static void icp_dispatch_pre_save(void *opaque)
|
|||||||
if (info->pre_save) {
|
if (info->pre_save) {
|
||||||
info->pre_save(icp);
|
info->pre_save(icp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int icp_dispatch_post_load(void *opaque, int version_id)
|
static int icp_dispatch_post_load(void *opaque, int version_id)
|
||||||
@ -533,7 +535,7 @@ static void ics_simple_reset(void *dev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ics_simple_dispatch_pre_save(void *opaque)
|
static int ics_simple_dispatch_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
ICSState *ics = opaque;
|
ICSState *ics = opaque;
|
||||||
ICSStateClass *info = ICS_BASE_GET_CLASS(ics);
|
ICSStateClass *info = ICS_BASE_GET_CLASS(ics);
|
||||||
@ -541,6 +543,8 @@ static void ics_simple_dispatch_pre_save(void *opaque)
|
|||||||
if (info->pre_save) {
|
if (info->pre_save) {
|
||||||
info->pre_save(ics);
|
info->pre_save(ics);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ics_simple_dispatch_post_load(void *opaque, int version_id)
|
static int ics_simple_dispatch_post_load(void *opaque, int version_id)
|
||||||
|
@ -1343,7 +1343,7 @@ static bool is_version_1(void *opaque, int version_id)
|
|||||||
return version_id == 1;
|
return version_id == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void e1000_pre_save(void *opaque)
|
static int e1000_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
E1000State *s = opaque;
|
E1000State *s = opaque;
|
||||||
NetClientState *nc = qemu_get_queue(s->nic);
|
NetClientState *nc = qemu_get_queue(s->nic);
|
||||||
@ -1361,6 +1361,8 @@ static void e1000_pre_save(void *opaque)
|
|||||||
if (nc->link_down && have_autoneg(s)) {
|
if (nc->link_down && have_autoneg(s)) {
|
||||||
s->phy_reg[PHY_STATUS] |= MII_SR_AUTONEG_COMPLETE;
|
s->phy_reg[PHY_STATUS] |= MII_SR_AUTONEG_COMPLETE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int e1000_post_load(void *opaque, int version_id)
|
static int e1000_post_load(void *opaque, int version_id)
|
||||||
|
@ -523,13 +523,15 @@ static void e1000e_qdev_reset(DeviceState *dev)
|
|||||||
e1000e_core_reset(&s->core);
|
e1000e_core_reset(&s->core);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void e1000e_pre_save(void *opaque)
|
static int e1000e_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
E1000EState *s = opaque;
|
E1000EState *s = opaque;
|
||||||
|
|
||||||
trace_e1000e_cb_pre_save();
|
trace_e1000e_cb_pre_save();
|
||||||
|
|
||||||
e1000e_core_pre_save(&s->core);
|
e1000e_core_pre_save(&s->core);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int e1000e_post_load(void *opaque, int version_id)
|
static int e1000e_post_load(void *opaque, int version_id)
|
||||||
|
@ -3162,7 +3162,7 @@ static const VMStateDescription vmstate_rtl8139_hotplug_ready ={
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static void rtl8139_pre_save(void *opaque)
|
static int rtl8139_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
RTL8139State* s = opaque;
|
RTL8139State* s = opaque;
|
||||||
int64_t current_time = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
|
int64_t current_time = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
|
||||||
@ -3170,6 +3170,8 @@ static void rtl8139_pre_save(void *opaque)
|
|||||||
/* for migration to older versions */
|
/* for migration to older versions */
|
||||||
s->TCTR = (current_time - s->TCTR_base) / PCI_PERIOD;
|
s->TCTR = (current_time - s->TCTR_base) / PCI_PERIOD;
|
||||||
s->rtl8139_mmio_io_addr_dummy = 0;
|
s->rtl8139_mmio_io_addr_dummy = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const VMStateDescription vmstate_rtl8139 = {
|
static const VMStateDescription vmstate_rtl8139 = {
|
||||||
|
@ -1712,7 +1712,7 @@ struct VirtIONetMigTmp {
|
|||||||
* pointer and count and also validate the count.
|
* pointer and count and also validate the count.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void virtio_net_tx_waiting_pre_save(void *opaque)
|
static int virtio_net_tx_waiting_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
struct VirtIONetMigTmp *tmp = opaque;
|
struct VirtIONetMigTmp *tmp = opaque;
|
||||||
|
|
||||||
@ -1721,6 +1721,8 @@ static void virtio_net_tx_waiting_pre_save(void *opaque)
|
|||||||
if (tmp->parent->curr_queues == 0) {
|
if (tmp->parent->curr_queues == 0) {
|
||||||
tmp->curr_queues_1 = 0;
|
tmp->curr_queues_1 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int virtio_net_tx_waiting_pre_load(void *opaque)
|
static int virtio_net_tx_waiting_pre_load(void *opaque)
|
||||||
@ -1768,11 +1770,13 @@ static int virtio_net_ufo_post_load(void *opaque, int version_id)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void virtio_net_ufo_pre_save(void *opaque)
|
static int virtio_net_ufo_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
struct VirtIONetMigTmp *tmp = opaque;
|
struct VirtIONetMigTmp *tmp = opaque;
|
||||||
|
|
||||||
tmp->has_ufo = tmp->parent->has_ufo;
|
tmp->has_ufo = tmp->parent->has_ufo;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const VMStateDescription vmstate_virtio_net_has_ufo = {
|
static const VMStateDescription vmstate_virtio_net_has_ufo = {
|
||||||
@ -1800,11 +1804,13 @@ static int virtio_net_vnet_post_load(void *opaque, int version_id)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void virtio_net_vnet_pre_save(void *opaque)
|
static int virtio_net_vnet_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
struct VirtIONetMigTmp *tmp = opaque;
|
struct VirtIONetMigTmp *tmp = opaque;
|
||||||
|
|
||||||
tmp->has_vnet_hdr = tmp->parent->has_vnet_hdr;
|
tmp->has_vnet_hdr = tmp->parent->has_vnet_hdr;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const VMStateDescription vmstate_virtio_net_has_vnet = {
|
static const VMStateDescription vmstate_virtio_net_has_vnet = {
|
||||||
@ -2079,13 +2085,15 @@ static void virtio_net_instance_init(Object *obj)
|
|||||||
DEVICE(n), NULL);
|
DEVICE(n), NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void virtio_net_pre_save(void *opaque)
|
static int virtio_net_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
VirtIONet *n = opaque;
|
VirtIONet *n = opaque;
|
||||||
|
|
||||||
/* At this point, backend must be stopped, otherwise
|
/* At this point, backend must be stopped, otherwise
|
||||||
* it might keep writing to memory. */
|
* it might keep writing to memory. */
|
||||||
assert(!n->vhost_started);
|
assert(!n->vhost_started);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const VMStateDescription vmstate_virtio_net = {
|
static const VMStateDescription vmstate_virtio_net = {
|
||||||
|
@ -2388,11 +2388,13 @@ static int vmxnet3_mcast_list_pre_load(void *opaque)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void vmxnet3_pre_save(void *opaque)
|
static int vmxnet3_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
VMXNET3State *s = opaque;
|
VMXNET3State *s = opaque;
|
||||||
|
|
||||||
s->mcast_list_buff_size = s->mcast_list_len * sizeof(MACAddr);
|
s->mcast_list_buff_size = s->mcast_list_len * sizeof(MACAddr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const VMStateDescription vmxstate_vmxnet3_mcast_list = {
|
static const VMStateDescription vmxstate_vmxnet3_mcast_list = {
|
||||||
|
@ -579,7 +579,7 @@ static int piix3_post_load(void *opaque, int version_id)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void piix3_pre_save(void *opaque)
|
static int piix3_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
PIIX3State *piix3 = opaque;
|
PIIX3State *piix3 = opaque;
|
||||||
@ -588,6 +588,8 @@ static void piix3_pre_save(void *opaque)
|
|||||||
piix3->pci_irq_levels_vmstate[i] =
|
piix3->pci_irq_levels_vmstate[i] =
|
||||||
pci_bus_get_irq_level(piix3->dev.bus, i);
|
pci_bus_get_irq_level(piix3->dev.bus, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool piix3_rcr_needed(void *opaque)
|
static bool piix3_rcr_needed(void *opaque)
|
||||||
|
@ -937,11 +937,13 @@ void cpu_ppc_clock_vm_state_change(void *opaque, int running,
|
|||||||
* final pages of memory (which happens between vm_stop()
|
* final pages of memory (which happens between vm_stop()
|
||||||
* and pre_save()) takes max_downtime.
|
* and pre_save()) takes max_downtime.
|
||||||
*/
|
*/
|
||||||
static void timebase_pre_save(void *opaque)
|
static int timebase_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
PPCTimebase *tb = opaque;
|
PPCTimebase *tb = opaque;
|
||||||
|
|
||||||
timebase_save(tb);
|
timebase_save(tb);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const VMStateDescription vmstate_ppc_timebase = {
|
const VMStateDescription vmstate_ppc_timebase = {
|
||||||
|
@ -140,7 +140,7 @@ static IOMMUTLBEntry spapr_tce_translate_iommu(IOMMUMemoryRegion *iommu,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spapr_tce_table_pre_save(void *opaque)
|
static int spapr_tce_table_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
sPAPRTCETable *tcet = SPAPR_TCE_TABLE(opaque);
|
sPAPRTCETable *tcet = SPAPR_TCE_TABLE(opaque);
|
||||||
|
|
||||||
@ -149,6 +149,8 @@ static void spapr_tce_table_pre_save(void *opaque)
|
|||||||
|
|
||||||
trace_spapr_iommu_pre_save(tcet->liobn, tcet->mig_nb_table,
|
trace_spapr_iommu_pre_save(tcet->liobn, tcet->mig_nb_table,
|
||||||
tcet->bus_offset, tcet->page_shift);
|
tcet->bus_offset, tcet->page_shift);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64_t spapr_tce_get_min_page_size(IOMMUMemoryRegion *iommu)
|
static uint64_t spapr_tce_get_min_page_size(IOMMUMemoryRegion *iommu)
|
||||||
|
@ -1798,7 +1798,7 @@ static const VMStateDescription vmstate_spapr_pci_msi = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static void spapr_pci_pre_save(void *opaque)
|
static int spapr_pci_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
sPAPRPHBState *sphb = opaque;
|
sPAPRPHBState *sphb = opaque;
|
||||||
GHashTableIter iter;
|
GHashTableIter iter;
|
||||||
@ -1823,7 +1823,7 @@ static void spapr_pci_pre_save(void *opaque)
|
|||||||
sphb->msi_devs = NULL;
|
sphb->msi_devs = NULL;
|
||||||
sphb->msi_devs_num = g_hash_table_size(sphb->msi);
|
sphb->msi_devs_num = g_hash_table_size(sphb->msi);
|
||||||
if (!sphb->msi_devs_num) {
|
if (!sphb->msi_devs_num) {
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
sphb->msi_devs = g_malloc(sphb->msi_devs_num * sizeof(spapr_pci_msi_mig));
|
sphb->msi_devs = g_malloc(sphb->msi_devs_num * sizeof(spapr_pci_msi_mig));
|
||||||
|
|
||||||
@ -1832,6 +1832,8 @@ static void spapr_pci_pre_save(void *opaque)
|
|||||||
sphb->msi_devs[i].key = *(uint32_t *) key;
|
sphb->msi_devs[i].key = *(uint32_t *) key;
|
||||||
sphb->msi_devs[i].value = *(spapr_pci_msi *) value;
|
sphb->msi_devs[i].value = *(spapr_pci_msi *) value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int spapr_pci_post_load(void *opaque, int version_id)
|
static int spapr_pci_post_load(void *opaque, int version_id)
|
||||||
|
@ -196,7 +196,7 @@ static const VMStateDescription vmstate_schdev_orb = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static int subch_dev_post_load(void *opaque, int version_id);
|
static int subch_dev_post_load(void *opaque, int version_id);
|
||||||
static void subch_dev_pre_save(void *opaque);
|
static int subch_dev_pre_save(void *opaque);
|
||||||
|
|
||||||
const char err_hint_devno[] = "Devno mismatch, tried to load wrong section!"
|
const char err_hint_devno[] = "Devno mismatch, tried to load wrong section!"
|
||||||
" Likely reason: some sequences of plug and unplug can break"
|
" Likely reason: some sequences of plug and unplug can break"
|
||||||
@ -249,7 +249,7 @@ static int post_load_ind_addr(void *opaque, int version_id)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pre_save_ind_addr(void *opaque)
|
static int pre_save_ind_addr(void *opaque)
|
||||||
{
|
{
|
||||||
IndAddrPtrTmp *ptmp = opaque;
|
IndAddrPtrTmp *ptmp = opaque;
|
||||||
IndAddr *ind_addr = *(ptmp->parent);
|
IndAddr *ind_addr = *(ptmp->parent);
|
||||||
@ -261,6 +261,8 @@ static void pre_save_ind_addr(void *opaque)
|
|||||||
ptmp->len = 0;
|
ptmp->len = 0;
|
||||||
ptmp->addr = 0L;
|
ptmp->addr = 0L;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const VMStateDescription vmstate_ind_addr_tmp = {
|
const VMStateDescription vmstate_ind_addr_tmp = {
|
||||||
@ -358,12 +360,14 @@ static ChannelSubSys channel_subsys = {
|
|||||||
QTAILQ_HEAD_INITIALIZER(channel_subsys.indicator_addresses),
|
QTAILQ_HEAD_INITIALIZER(channel_subsys.indicator_addresses),
|
||||||
};
|
};
|
||||||
|
|
||||||
static void subch_dev_pre_save(void *opaque)
|
static int subch_dev_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
SubchDev *s = opaque;
|
SubchDev *s = opaque;
|
||||||
|
|
||||||
/* Prepare remote_schid for save */
|
/* Prepare remote_schid for save */
|
||||||
s->migrated_schid = s->schid;
|
s->migrated_schid = s->schid;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int subch_dev_post_load(void *opaque, int version_id)
|
static int subch_dev_post_load(void *opaque, int version_id)
|
||||||
|
@ -62,13 +62,15 @@ typedef struct VirtioCcwDeviceTmp {
|
|||||||
uint16_t config_vector;
|
uint16_t config_vector;
|
||||||
} VirtioCcwDeviceTmp;
|
} VirtioCcwDeviceTmp;
|
||||||
|
|
||||||
static void virtio_ccw_dev_tmp_pre_save(void *opaque)
|
static int virtio_ccw_dev_tmp_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
VirtioCcwDeviceTmp *tmp = opaque;
|
VirtioCcwDeviceTmp *tmp = opaque;
|
||||||
VirtioCcwDevice *dev = tmp->parent;
|
VirtioCcwDevice *dev = tmp->parent;
|
||||||
VirtIODevice *vdev = virtio_bus_get_device(&dev->bus);
|
VirtIODevice *vdev = virtio_bus_get_device(&dev->bus);
|
||||||
|
|
||||||
tmp->config_vector = vdev->config_vector;
|
tmp->config_vector = vdev->config_vector;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int virtio_ccw_dev_tmp_post_load(void *opaque, int version_id)
|
static int virtio_ccw_dev_tmp_post_load(void *opaque, int version_id)
|
||||||
|
@ -2083,7 +2083,7 @@ static void lsi_scsi_reset(DeviceState *dev)
|
|||||||
lsi_soft_reset(s);
|
lsi_soft_reset(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lsi_pre_save(void *opaque)
|
static int lsi_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
LSIState *s = opaque;
|
LSIState *s = opaque;
|
||||||
|
|
||||||
@ -2092,6 +2092,8 @@ static void lsi_pre_save(void *opaque)
|
|||||||
assert(s->current->dma_len == 0);
|
assert(s->current->dma_len == 0);
|
||||||
}
|
}
|
||||||
assert(QTAILQ_EMPTY(&s->queue));
|
assert(QTAILQ_EMPTY(&s->queue));
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const VMStateDescription vmstate_lsi_scsi = {
|
static const VMStateDescription vmstate_lsi_scsi = {
|
||||||
|
@ -1167,7 +1167,7 @@ pvscsi_reset(DeviceState *dev)
|
|||||||
pvscsi_reset_adapter(s);
|
pvscsi_reset_adapter(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
pvscsi_pre_save(void *opaque)
|
pvscsi_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
PVSCSIState *s = (PVSCSIState *) opaque;
|
PVSCSIState *s = (PVSCSIState *) opaque;
|
||||||
@ -1176,6 +1176,8 @@ pvscsi_pre_save(void *opaque)
|
|||||||
|
|
||||||
assert(QTAILQ_EMPTY(&s->pending_queue));
|
assert(QTAILQ_EMPTY(&s->pending_queue));
|
||||||
assert(QTAILQ_EMPTY(&s->completion_queue));
|
assert(QTAILQ_EMPTY(&s->completion_queue));
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -421,9 +421,11 @@ static void cadence_ttc_init(Object *obj)
|
|||||||
sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->iomem);
|
sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->iomem);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cadence_timer_pre_save(void *opaque)
|
static int cadence_timer_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
cadence_timer_sync((CadenceTimerState *)opaque);
|
cadence_timer_sync((CadenceTimerState *)opaque);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cadence_timer_post_load(void *opaque, int version_id)
|
static int cadence_timer_post_load(void *opaque, int version_id)
|
||||||
|
@ -216,12 +216,14 @@ static void update_irq(struct HPETTimer *timer, int set)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hpet_pre_save(void *opaque)
|
static int hpet_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
HPETState *s = opaque;
|
HPETState *s = opaque;
|
||||||
|
|
||||||
/* save current counter value */
|
/* save current counter value */
|
||||||
s->hpet_counter = hpet_get_ticks(s);
|
s->hpet_counter = hpet_get_ticks(s);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hpet_pre_load(void *opaque)
|
static int hpet_pre_load(void *opaque)
|
||||||
|
@ -237,7 +237,7 @@ static int pit_load_old(QEMUFile *f, void *opaque, int version_id)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pit_dispatch_pre_save(void *opaque)
|
static int pit_dispatch_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
PITCommonState *s = opaque;
|
PITCommonState *s = opaque;
|
||||||
PITCommonClass *c = PIT_COMMON_GET_CLASS(s);
|
PITCommonClass *c = PIT_COMMON_GET_CLASS(s);
|
||||||
@ -245,6 +245,8 @@ static void pit_dispatch_pre_save(void *opaque)
|
|||||||
if (c->pre_save) {
|
if (c->pre_save) {
|
||||||
c->pre_save(s);
|
c->pre_save(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pit_dispatch_post_load(void *opaque, int version_id)
|
static int pit_dispatch_post_load(void *opaque, int version_id)
|
||||||
|
@ -795,11 +795,13 @@ static void rtc_set_date_from_host(ISADevice *dev)
|
|||||||
rtc_set_cmos(s, &tm);
|
rtc_set_cmos(s, &tm);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rtc_pre_save(void *opaque)
|
static int rtc_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
RTCState *s = opaque;
|
RTCState *s = opaque;
|
||||||
|
|
||||||
rtc_update_time(s);
|
rtc_update_time(s);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rtc_post_load(void *opaque, int version_id)
|
static int rtc_post_load(void *opaque, int version_id)
|
||||||
|
@ -211,7 +211,7 @@ static void pl031_init(Object *obj)
|
|||||||
s->timer = timer_new_ns(rtc_clock, pl031_interrupt, s);
|
s->timer = timer_new_ns(rtc_clock, pl031_interrupt, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pl031_pre_save(void *opaque)
|
static int pl031_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
PL031State *s = opaque;
|
PL031State *s = opaque;
|
||||||
|
|
||||||
@ -219,6 +219,8 @@ static void pl031_pre_save(void *opaque)
|
|||||||
* store the base time relative to the QEMU_CLOCK_VIRTUAL for backwards-compatibility. */
|
* store the base time relative to the QEMU_CLOCK_VIRTUAL for backwards-compatibility. */
|
||||||
int64_t delta = qemu_clock_get_ns(rtc_clock) - qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
|
int64_t delta = qemu_clock_get_ns(rtc_clock) - qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
|
||||||
s->tick_offset_vmstate = s->tick_offset + delta / NANOSECONDS_PER_SECOND;
|
s->tick_offset_vmstate = s->tick_offset + delta / NANOSECONDS_PER_SECOND;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pl031_post_load(void *opaque, int version_id)
|
static int pl031_post_load(void *opaque, int version_id)
|
||||||
|
@ -791,11 +791,13 @@ static const VMStateDescription vmstate_menelaus_tm = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static void menelaus_pre_save(void *opaque)
|
static int menelaus_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
MenelausState *s = opaque;
|
MenelausState *s = opaque;
|
||||||
/* Should be <= 1000 */
|
/* Should be <= 1000 */
|
||||||
s->rtc_next_vmstate = s->rtc.next - qemu_clock_get_ms(rtc_clock);
|
s->rtc_next_vmstate = s->rtc.next - qemu_clock_get_ms(rtc_clock);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int menelaus_post_load(void *opaque, int version_id)
|
static int menelaus_post_load(void *opaque, int version_id)
|
||||||
|
@ -1374,7 +1374,7 @@ static int ccid_post_load(void *opaque, int version_id)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ccid_pre_save(void *opaque)
|
static int ccid_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
USBCCIDState *s = opaque;
|
USBCCIDState *s = opaque;
|
||||||
|
|
||||||
@ -1386,6 +1386,8 @@ static void ccid_pre_save(void *opaque)
|
|||||||
*/
|
*/
|
||||||
s->migration_state = MIGRATION_MIGRATED;
|
s->migration_state = MIGRATION_MIGRATED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VMStateDescription bulk_in_vmstate = {
|
static VMStateDescription bulk_in_vmstate = {
|
||||||
|
@ -2381,7 +2381,7 @@ static USBBusOps ehci_bus_ops_standalone = {
|
|||||||
.wakeup_endpoint = ehci_wakeup_endpoint,
|
.wakeup_endpoint = ehci_wakeup_endpoint,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void usb_ehci_pre_save(void *opaque)
|
static int usb_ehci_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
EHCIState *ehci = opaque;
|
EHCIState *ehci = opaque;
|
||||||
uint32_t new_frindex;
|
uint32_t new_frindex;
|
||||||
@ -2390,6 +2390,8 @@ static void usb_ehci_pre_save(void *opaque)
|
|||||||
new_frindex = ehci->frindex & ~7;
|
new_frindex = ehci->frindex & ~7;
|
||||||
ehci->last_run_ns -= (ehci->frindex - new_frindex) * UFRAME_TIMER_NS;
|
ehci->last_run_ns -= (ehci->frindex - new_frindex) * UFRAME_TIMER_NS;
|
||||||
ehci->frindex = new_frindex;
|
ehci->frindex = new_frindex;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int usb_ehci_post_load(void *opaque, int version_id)
|
static int usb_ehci_post_load(void *opaque, int version_id)
|
||||||
|
@ -2111,11 +2111,13 @@ static void usbredir_buffered_bulk_packet(void *priv, uint64_t id,
|
|||||||
* Migration code
|
* Migration code
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void usbredir_pre_save(void *priv)
|
static int usbredir_pre_save(void *priv)
|
||||||
{
|
{
|
||||||
USBRedirDevice *dev = priv;
|
USBRedirDevice *dev = priv;
|
||||||
|
|
||||||
usbredir_fill_already_in_flight(dev);
|
usbredir_fill_already_in_flight(dev);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int usbredir_post_load(void *priv, int version_id)
|
static int usbredir_post_load(void *priv, int version_id)
|
||||||
|
@ -254,13 +254,15 @@ static void vhost_vsock_post_load_timer_cb(void *opaque)
|
|||||||
vhost_vsock_send_transport_reset(vsock);
|
vhost_vsock_send_transport_reset(vsock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vhost_vsock_pre_save(void *opaque)
|
static int vhost_vsock_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
VHostVSock *vsock = opaque;
|
VHostVSock *vsock = opaque;
|
||||||
|
|
||||||
/* At this point, backend must be stopped, otherwise
|
/* At this point, backend must be stopped, otherwise
|
||||||
* it might keep writing to memory. */
|
* it might keep writing to memory. */
|
||||||
assert(!vsock->vhost_dev.started);
|
assert(!vsock->vhost_dev.started);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vhost_vsock_post_load(void *opaque, int version_id)
|
static int vhost_vsock_post_load(void *opaque, int version_id)
|
||||||
|
@ -1897,7 +1897,7 @@ static const VMStateDescription vmstate_virtio = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void virtio_save(VirtIODevice *vdev, QEMUFile *f)
|
int virtio_save(VirtIODevice *vdev, QEMUFile *f)
|
||||||
{
|
{
|
||||||
BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
|
BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
|
||||||
VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
|
VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
|
||||||
@ -1947,20 +1947,21 @@ void virtio_save(VirtIODevice *vdev, QEMUFile *f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (vdc->vmsd) {
|
if (vdc->vmsd) {
|
||||||
vmstate_save_state(f, vdc->vmsd, vdev, NULL);
|
int ret = vmstate_save_state(f, vdc->vmsd, vdev, NULL);
|
||||||
|
if (ret) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Subsections */
|
/* Subsections */
|
||||||
vmstate_save_state(f, &vmstate_virtio, vdev, NULL);
|
return vmstate_save_state(f, &vmstate_virtio, vdev, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A wrapper for use as a VMState .put function */
|
/* A wrapper for use as a VMState .put function */
|
||||||
static int virtio_device_put(QEMUFile *f, void *opaque, size_t size,
|
static int virtio_device_put(QEMUFile *f, void *opaque, size_t size,
|
||||||
VMStateField *field, QJSON *vmdesc)
|
VMStateField *field, QJSON *vmdesc)
|
||||||
{
|
{
|
||||||
virtio_save(VIRTIO_DEVICE(opaque), f);
|
return virtio_save(VIRTIO_DEVICE(opaque), f);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A wrapper for use as a VMState .get function */
|
/* A wrapper for use as a VMState .get function */
|
||||||
|
@ -188,7 +188,7 @@ void virtqueue_get_avail_bytes(VirtQueue *vq, unsigned int *in_bytes,
|
|||||||
void virtio_notify_irqfd(VirtIODevice *vdev, VirtQueue *vq);
|
void virtio_notify_irqfd(VirtIODevice *vdev, VirtQueue *vq);
|
||||||
void virtio_notify(VirtIODevice *vdev, VirtQueue *vq);
|
void virtio_notify(VirtIODevice *vdev, VirtQueue *vq);
|
||||||
|
|
||||||
void virtio_save(VirtIODevice *vdev, QEMUFile *f);
|
int virtio_save(VirtIODevice *vdev, QEMUFile *f);
|
||||||
|
|
||||||
extern const VMStateInfo virtio_vmstate_info;
|
extern const VMStateInfo virtio_vmstate_info;
|
||||||
|
|
||||||
|
@ -179,7 +179,7 @@ struct VMStateDescription {
|
|||||||
LoadStateHandler *load_state_old;
|
LoadStateHandler *load_state_old;
|
||||||
int (*pre_load)(void *opaque);
|
int (*pre_load)(void *opaque);
|
||||||
int (*post_load)(void *opaque, int version_id);
|
int (*post_load)(void *opaque, int version_id);
|
||||||
void (*pre_save)(void *opaque);
|
int (*pre_save)(void *opaque);
|
||||||
bool (*needed)(void *opaque);
|
bool (*needed)(void *opaque);
|
||||||
VMStateField *fields;
|
VMStateField *fields;
|
||||||
const VMStateDescription **subsections;
|
const VMStateDescription **subsections;
|
||||||
@ -994,8 +994,8 @@ extern const VMStateInfo vmstate_info_qtailq;
|
|||||||
|
|
||||||
int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
|
int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
|
||||||
void *opaque, int version_id);
|
void *opaque, int version_id);
|
||||||
void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
|
int vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
|
||||||
void *opaque, QJSON *vmdesc);
|
void *opaque, QJSON *vmdesc);
|
||||||
|
|
||||||
bool vmstate_save_needed(const VMStateDescription *vmsd, void *opaque);
|
bool vmstate_save_needed(const VMStateDescription *vmsd, void *opaque);
|
||||||
|
|
||||||
|
@ -161,6 +161,11 @@ int blk_mig_active(void)
|
|||||||
return !QSIMPLEQ_EMPTY(&block_mig_state.bmds_list);
|
return !QSIMPLEQ_EMPTY(&block_mig_state.bmds_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int blk_mig_bulk_active(void)
|
||||||
|
{
|
||||||
|
return blk_mig_active() && !block_mig_state.bulk_completed;
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t blk_mig_bytes_transferred(void)
|
uint64_t blk_mig_bytes_transferred(void)
|
||||||
{
|
{
|
||||||
BlkMigDevState *bmds;
|
BlkMigDevState *bmds;
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
#ifdef CONFIG_LIVE_BLOCK_MIGRATION
|
#ifdef CONFIG_LIVE_BLOCK_MIGRATION
|
||||||
int blk_mig_active(void);
|
int blk_mig_active(void);
|
||||||
|
int blk_mig_bulk_active(void);
|
||||||
uint64_t blk_mig_bytes_transferred(void);
|
uint64_t blk_mig_bytes_transferred(void);
|
||||||
uint64_t blk_mig_bytes_remaining(void);
|
uint64_t blk_mig_bytes_remaining(void);
|
||||||
uint64_t blk_mig_bytes_total(void);
|
uint64_t blk_mig_bytes_total(void);
|
||||||
@ -25,6 +26,12 @@ static inline int blk_mig_active(void)
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int blk_mig_bulk_active(void)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static inline uint64_t blk_mig_bytes_transferred(void)
|
static inline uint64_t blk_mig_bytes_transferred(void)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -34,11 +34,13 @@ COLOMode get_colo_mode(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void colo_info_pre_save(void *opaque)
|
static int colo_info_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
COLOInfo *s = opaque;
|
COLOInfo *s = opaque;
|
||||||
|
|
||||||
s->colo_requested = migrate_colo_enabled();
|
s->colo_requested = migrate_colo_enabled();
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool colo_info_need(void *opaque)
|
static bool colo_info_need(void *opaque)
|
||||||
|
@ -101,12 +101,14 @@ static int global_state_post_load(void *opaque, int version_id)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void global_state_pre_save(void *opaque)
|
static int global_state_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
GlobalState *s = opaque;
|
GlobalState *s = opaque;
|
||||||
|
|
||||||
trace_migrate_global_state_pre_save((char *)s->runstate);
|
trace_migrate_global_state_pre_save((char *)s->runstate);
|
||||||
s->size = strlen((char *)s->runstate) + 1;
|
s->size = strlen((char *)s->runstate) + 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const VMStateDescription vmstate_globalstate = {
|
static const VMStateDescription vmstate_globalstate = {
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
#include "exec/ram_addr.h"
|
#include "exec/ram_addr.h"
|
||||||
#include "qemu/rcu_queue.h"
|
#include "qemu/rcu_queue.h"
|
||||||
#include "migration/colo.h"
|
#include "migration/colo.h"
|
||||||
|
#include "migration/block.h"
|
||||||
|
|
||||||
/***********************************************************/
|
/***********************************************************/
|
||||||
/* ram save/restore */
|
/* ram save/restore */
|
||||||
@ -825,7 +826,10 @@ static void migration_bitmap_sync(RAMState *rs)
|
|||||||
/ (end_time - rs->time_last_bitmap_sync);
|
/ (end_time - rs->time_last_bitmap_sync);
|
||||||
bytes_xfer_now = ram_counters.transferred;
|
bytes_xfer_now = ram_counters.transferred;
|
||||||
|
|
||||||
if (migrate_auto_converge()) {
|
/* During block migration the auto-converge logic incorrectly detects
|
||||||
|
* that ram migration makes no progress. Avoid this by disabling the
|
||||||
|
* throttling logic during the bulk phase of block migration. */
|
||||||
|
if (migrate_auto_converge() && !blk_mig_bulk_active()) {
|
||||||
/* The following detection logic can be refined later. For now:
|
/* The following detection logic can be refined later. For now:
|
||||||
Check to see if the dirtied bytes is 50% more than the approx.
|
Check to see if the dirtied bytes is 50% more than the approx.
|
||||||
amount of bytes that just got transferred since the last time we
|
amount of bytes that just got transferred since the last time we
|
||||||
|
@ -312,7 +312,7 @@ static SaveState savevm_state = {
|
|||||||
.global_section_id = 0,
|
.global_section_id = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void configuration_pre_save(void *opaque)
|
static int configuration_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
SaveState *state = opaque;
|
SaveState *state = opaque;
|
||||||
const char *current_name = MACHINE_GET_CLASS(current_machine)->name;
|
const char *current_name = MACHINE_GET_CLASS(current_machine)->name;
|
||||||
@ -320,6 +320,8 @@ static void configuration_pre_save(void *opaque)
|
|||||||
state->len = strlen(current_name);
|
state->len = strlen(current_name);
|
||||||
state->name = current_name;
|
state->name = current_name;
|
||||||
state->target_page_bits = qemu_target_page_bits();
|
state->target_page_bits = qemu_target_page_bits();
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int configuration_pre_load(void *opaque)
|
static int configuration_pre_load(void *opaque)
|
||||||
@ -766,14 +768,14 @@ static void vmstate_save_old_style(QEMUFile *f, SaveStateEntry *se, QJSON *vmdes
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vmstate_save(QEMUFile *f, SaveStateEntry *se, QJSON *vmdesc)
|
static int vmstate_save(QEMUFile *f, SaveStateEntry *se, QJSON *vmdesc)
|
||||||
{
|
{
|
||||||
trace_vmstate_save(se->idstr, se->vmsd ? se->vmsd->name : "(old)");
|
trace_vmstate_save(se->idstr, se->vmsd ? se->vmsd->name : "(old)");
|
||||||
if (!se->vmsd) {
|
if (!se->vmsd) {
|
||||||
vmstate_save_old_style(f, se, vmdesc);
|
vmstate_save_old_style(f, se, vmdesc);
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
vmstate_save_state(f, se->vmsd, se->opaque, vmdesc);
|
return vmstate_save_state(f, se->vmsd, se->opaque, vmdesc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1169,7 +1171,11 @@ int qemu_savevm_state_complete_precopy(QEMUFile *f, bool iterable_only,
|
|||||||
json_prop_int(vmdesc, "instance_id", se->instance_id);
|
json_prop_int(vmdesc, "instance_id", se->instance_id);
|
||||||
|
|
||||||
save_section_header(f, se, QEMU_VM_SECTION_FULL);
|
save_section_header(f, se, QEMU_VM_SECTION_FULL);
|
||||||
vmstate_save(f, se, vmdesc);
|
ret = vmstate_save(f, se, vmdesc);
|
||||||
|
if (ret) {
|
||||||
|
qemu_file_set_error(f, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
trace_savevm_section_end(se->idstr, se->section_id, 0);
|
trace_savevm_section_end(se->idstr, se->section_id, 0);
|
||||||
save_section_footer(f, se);
|
save_section_footer(f, se);
|
||||||
|
|
||||||
@ -1311,6 +1317,8 @@ static int qemu_save_device_state(QEMUFile *f)
|
|||||||
cpu_synchronize_all_states();
|
cpu_synchronize_all_states();
|
||||||
|
|
||||||
QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
|
QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (se->is_ram) {
|
if (se->is_ram) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1323,7 +1331,10 @@ static int qemu_save_device_state(QEMUFile *f)
|
|||||||
|
|
||||||
save_section_header(f, se, QEMU_VM_SECTION_FULL);
|
save_section_header(f, se, QEMU_VM_SECTION_FULL);
|
||||||
|
|
||||||
vmstate_save(f, se, NULL);
|
ret = vmstate_save(f, se, NULL);
|
||||||
|
if (ret) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
save_section_footer(f, se);
|
save_section_footer(f, se);
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,7 @@ savevm_state_iterate(void) ""
|
|||||||
savevm_state_cleanup(void) ""
|
savevm_state_cleanup(void) ""
|
||||||
savevm_state_complete_precopy(void) ""
|
savevm_state_complete_precopy(void) ""
|
||||||
vmstate_save(const char *idstr, const char *vmsd_name) "%s, %s"
|
vmstate_save(const char *idstr, const char *vmsd_name) "%s, %s"
|
||||||
|
vmstate_save_state_pre_save_res(const char *name, int res) "%s/%d"
|
||||||
vmstate_save_state_loop(const char *name, const char *field, int n_elems) "%s/%s[%d]"
|
vmstate_save_state_loop(const char *name, const char *field, int n_elems) "%s/%s[%d]"
|
||||||
vmstate_save_state_top(const char *idstr) "%s"
|
vmstate_save_state_top(const char *idstr) "%s"
|
||||||
vmstate_subsection_save_loop(const char *name, const char *sub) "%s/%s"
|
vmstate_subsection_save_loop(const char *name, const char *sub) "%s/%s"
|
||||||
|
@ -550,13 +550,14 @@ static int put_tmp(QEMUFile *f, void *pv, size_t size, VMStateField *field,
|
|||||||
{
|
{
|
||||||
const VMStateDescription *vmsd = field->vmsd;
|
const VMStateDescription *vmsd = field->vmsd;
|
||||||
void *tmp = g_malloc(size);
|
void *tmp = g_malloc(size);
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Writes the parent field which is at the start of the tmp */
|
/* Writes the parent field which is at the start of the tmp */
|
||||||
*(void **)tmp = pv;
|
*(void **)tmp = pv;
|
||||||
vmstate_save_state(f, vmsd, tmp, vmdesc);
|
ret = vmstate_save_state(f, vmsd, tmp, vmdesc);
|
||||||
g_free(tmp);
|
g_free(tmp);
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
const VMStateInfo vmstate_info_tmp = {
|
const VMStateInfo vmstate_info_tmp = {
|
||||||
@ -657,12 +658,16 @@ static int put_qtailq(QEMUFile *f, void *pv, size_t unused_size,
|
|||||||
/* offset of the QTAILQ entry in a QTAILQ element*/
|
/* offset of the QTAILQ entry in a QTAILQ element*/
|
||||||
size_t entry_offset = field->start;
|
size_t entry_offset = field->start;
|
||||||
void *elm;
|
void *elm;
|
||||||
|
int ret;
|
||||||
|
|
||||||
trace_put_qtailq(vmsd->name, vmsd->version_id);
|
trace_put_qtailq(vmsd->name, vmsd->version_id);
|
||||||
|
|
||||||
QTAILQ_RAW_FOREACH(elm, pv, entry_offset) {
|
QTAILQ_RAW_FOREACH(elm, pv, entry_offset) {
|
||||||
qemu_put_byte(f, true);
|
qemu_put_byte(f, true);
|
||||||
vmstate_save_state(f, vmsd, elm, vmdesc);
|
ret = vmstate_save_state(f, vmsd, elm, vmdesc);
|
||||||
|
if (ret) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
qemu_put_byte(f, false);
|
qemu_put_byte(f, false);
|
||||||
|
|
||||||
|
@ -21,8 +21,8 @@
|
|||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
#include "qjson.h"
|
#include "qjson.h"
|
||||||
|
|
||||||
static void vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
|
static int vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
|
||||||
void *opaque, QJSON *vmdesc);
|
void *opaque, QJSON *vmdesc);
|
||||||
static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
|
static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
|
||||||
void *opaque);
|
void *opaque);
|
||||||
|
|
||||||
@ -308,15 +308,21 @@ bool vmstate_save_needed(const VMStateDescription *vmsd, void *opaque)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
|
int vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
|
||||||
void *opaque, QJSON *vmdesc)
|
void *opaque, QJSON *vmdesc)
|
||||||
{
|
{
|
||||||
|
int ret = 0;
|
||||||
VMStateField *field = vmsd->fields;
|
VMStateField *field = vmsd->fields;
|
||||||
|
|
||||||
trace_vmstate_save_state_top(vmsd->name);
|
trace_vmstate_save_state_top(vmsd->name);
|
||||||
|
|
||||||
if (vmsd->pre_save) {
|
if (vmsd->pre_save) {
|
||||||
vmsd->pre_save(opaque);
|
ret = vmsd->pre_save(opaque);
|
||||||
|
trace_vmstate_save_state_pre_save_res(vmsd->name, ret);
|
||||||
|
if (ret) {
|
||||||
|
error_report("pre-save failed: %s", vmsd->name);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vmdesc) {
|
if (vmdesc) {
|
||||||
@ -341,6 +347,7 @@ void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
|
|||||||
}
|
}
|
||||||
for (i = 0; i < n_elems; i++) {
|
for (i = 0; i < n_elems; i++) {
|
||||||
void *curr_elem = first_elem + size * i;
|
void *curr_elem = first_elem + size * i;
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
vmsd_desc_field_start(vmsd, vmdesc_loop, field, i, n_elems);
|
vmsd_desc_field_start(vmsd, vmdesc_loop, field, i, n_elems);
|
||||||
old_offset = qemu_ftell_fast(f);
|
old_offset = qemu_ftell_fast(f);
|
||||||
@ -351,11 +358,19 @@ void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
|
|||||||
if (!curr_elem && size) {
|
if (!curr_elem && size) {
|
||||||
/* if null pointer write placeholder and do not follow */
|
/* if null pointer write placeholder and do not follow */
|
||||||
assert(field->flags & VMS_ARRAY_OF_POINTER);
|
assert(field->flags & VMS_ARRAY_OF_POINTER);
|
||||||
vmstate_info_nullptr.put(f, curr_elem, size, NULL, NULL);
|
ret = vmstate_info_nullptr.put(f, curr_elem, size, NULL,
|
||||||
|
NULL);
|
||||||
} else if (field->flags & VMS_STRUCT) {
|
} else if (field->flags & VMS_STRUCT) {
|
||||||
vmstate_save_state(f, field->vmsd, curr_elem, vmdesc_loop);
|
ret = vmstate_save_state(f, field->vmsd, curr_elem,
|
||||||
|
vmdesc_loop);
|
||||||
} else {
|
} else {
|
||||||
field->info->put(f, curr_elem, size, field, vmdesc_loop);
|
ret = field->info->put(f, curr_elem, size, field,
|
||||||
|
vmdesc_loop);
|
||||||
|
}
|
||||||
|
if (ret) {
|
||||||
|
error_report("Save of field %s/%s failed",
|
||||||
|
vmsd->name, field->name);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
written_bytes = qemu_ftell_fast(f) - old_offset;
|
written_bytes = qemu_ftell_fast(f) - old_offset;
|
||||||
@ -380,7 +395,7 @@ void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
|
|||||||
json_end_array(vmdesc);
|
json_end_array(vmdesc);
|
||||||
}
|
}
|
||||||
|
|
||||||
vmstate_subsection_save(f, vmsd, opaque, vmdesc);
|
return vmstate_subsection_save(f, vmsd, opaque, vmdesc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const VMStateDescription *
|
static const VMStateDescription *
|
||||||
@ -446,11 +461,12 @@ static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
|
static int vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
|
||||||
void *opaque, QJSON *vmdesc)
|
void *opaque, QJSON *vmdesc)
|
||||||
{
|
{
|
||||||
const VMStateDescription **sub = vmsd->subsections;
|
const VMStateDescription **sub = vmsd->subsections;
|
||||||
bool subsection_found = false;
|
bool subsection_found = false;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
trace_vmstate_subsection_save_top(vmsd->name);
|
trace_vmstate_subsection_save_top(vmsd->name);
|
||||||
while (sub && *sub && (*sub)->needed) {
|
while (sub && *sub && (*sub)->needed) {
|
||||||
@ -474,7 +490,10 @@ static void vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
|
|||||||
qemu_put_byte(f, len);
|
qemu_put_byte(f, len);
|
||||||
qemu_put_buffer(f, (uint8_t *)vmsdsub->name, len);
|
qemu_put_buffer(f, (uint8_t *)vmsdsub->name, len);
|
||||||
qemu_put_be32(f, vmsdsub->version_id);
|
qemu_put_be32(f, vmsdsub->version_id);
|
||||||
vmstate_save_state(f, vmsdsub, opaque, vmdesc);
|
ret = vmstate_save_state(f, vmsdsub, opaque, vmdesc);
|
||||||
|
if (ret) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if (vmdesc) {
|
if (vmdesc) {
|
||||||
json_end_object(vmdesc);
|
json_end_object(vmdesc);
|
||||||
@ -486,4 +505,6 @@ static void vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
|
|||||||
if (vmdesc && subsection_found) {
|
if (vmdesc && subsection_found) {
|
||||||
json_end_array(vmdesc);
|
json_end_array(vmdesc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -21,10 +21,12 @@
|
|||||||
#include "migration/vmstate.h"
|
#include "migration/vmstate.h"
|
||||||
#include "migration/snapshot.h"
|
#include "migration/snapshot.h"
|
||||||
|
|
||||||
static void replay_pre_save(void *opaque)
|
static int replay_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
ReplayState *state = opaque;
|
ReplayState *state = opaque;
|
||||||
state->file_offset = ftell(replay_file);
|
state->file_offset = ftell(replay_file);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int replay_post_load(void *opaque, int version_id)
|
static int replay_post_load(void *opaque, int version_id)
|
||||||
|
@ -1203,11 +1203,13 @@ struct sbuf_tmp {
|
|||||||
uint32_t roff, woff;
|
uint32_t roff, woff;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void sbuf_tmp_pre_save(void *opaque)
|
static int sbuf_tmp_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
struct sbuf_tmp *tmp = opaque;
|
struct sbuf_tmp *tmp = opaque;
|
||||||
tmp->woff = tmp->parent->sb_wptr - tmp->parent->sb_data;
|
tmp->woff = tmp->parent->sb_wptr - tmp->parent->sb_data;
|
||||||
tmp->roff = tmp->parent->sb_rptr - tmp->parent->sb_data;
|
tmp->roff = tmp->parent->sb_rptr - tmp->parent->sb_data;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sbuf_tmp_post_load(void *opaque, int version)
|
static int sbuf_tmp_post_load(void *opaque, int version)
|
||||||
@ -1303,7 +1305,7 @@ typedef struct SS_FamilyTmpStruct {
|
|||||||
#define SS_FAMILY_MIG_IPV6 10 /* Linux */
|
#define SS_FAMILY_MIG_IPV6 10 /* Linux */
|
||||||
#define SS_FAMILY_MIG_OTHER 0xffff
|
#define SS_FAMILY_MIG_OTHER 0xffff
|
||||||
|
|
||||||
static void ss_family_pre_save(void *opaque)
|
static int ss_family_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
SS_FamilyTmpStruct *tss = opaque;
|
SS_FamilyTmpStruct *tss = opaque;
|
||||||
|
|
||||||
@ -1314,6 +1316,8 @@ static void ss_family_pre_save(void *opaque)
|
|||||||
} else if (tss->parent->ss.ss_family == AF_INET6) {
|
} else if (tss->parent->ss.ss_family == AF_INET6) {
|
||||||
tss->portable_family = SS_FAMILY_MIG_IPV6;
|
tss->portable_family = SS_FAMILY_MIG_IPV6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ss_family_post_load(void *opaque, int version_id)
|
static int ss_family_post_load(void *opaque, int version_id)
|
||||||
|
@ -394,7 +394,7 @@ static const VMStateInfo vmstate_powered_off = {
|
|||||||
.put = put_power,
|
.put = put_power,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void cpu_pre_save(void *opaque)
|
static int cpu_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
ARMCPU *cpu = opaque;
|
ARMCPU *cpu = opaque;
|
||||||
|
|
||||||
@ -415,6 +415,8 @@ static void cpu_pre_save(void *opaque)
|
|||||||
cpu->cpreg_array_len * sizeof(uint64_t));
|
cpu->cpreg_array_len * sizeof(uint64_t));
|
||||||
memcpy(cpu->cpreg_vmstate_values, cpu->cpreg_values,
|
memcpy(cpu->cpreg_vmstate_values, cpu->cpreg_values,
|
||||||
cpu->cpreg_array_len * sizeof(uint64_t));
|
cpu->cpreg_array_len * sizeof(uint64_t));
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cpu_post_load(void *opaque, int version_id)
|
static int cpu_post_load(void *opaque, int version_id)
|
||||||
|
@ -160,13 +160,15 @@ static floatx80 cpu_set_fp80(uint64_t mant, uint16_t upper)
|
|||||||
return temp.d;
|
return temp.d;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fpreg_pre_save(void *opaque)
|
static int fpreg_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
x86_FPReg_tmp *tmp = opaque;
|
x86_FPReg_tmp *tmp = opaque;
|
||||||
|
|
||||||
/* we save the real CPU data (in case of MMX usage only 'mant'
|
/* we save the real CPU data (in case of MMX usage only 'mant'
|
||||||
contains the MMX register */
|
contains the MMX register */
|
||||||
cpu_get_fp80(&tmp->tmp_mant, &tmp->tmp_exp, tmp->parent->d);
|
cpu_get_fp80(&tmp->tmp_mant, &tmp->tmp_exp, tmp->parent->d);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fpreg_post_load(void *opaque, int version)
|
static int fpreg_post_load(void *opaque, int version)
|
||||||
@ -196,7 +198,7 @@ static const VMStateDescription vmstate_fpreg = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static void cpu_pre_save(void *opaque)
|
static int cpu_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
X86CPU *cpu = opaque;
|
X86CPU *cpu = opaque;
|
||||||
CPUX86State *env = &cpu->env;
|
CPUX86State *env = &cpu->env;
|
||||||
@ -228,6 +230,7 @@ static void cpu_pre_save(void *opaque)
|
|||||||
env->segs[R_SS].flags &= ~(env->segs[R_SS].flags & DESC_DPL_MASK);
|
env->segs[R_SS].flags &= ~(env->segs[R_SS].flags & DESC_DPL_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cpu_post_load(void *opaque, int version_id)
|
static int cpu_post_load(void *opaque, int version_id)
|
||||||
|
@ -146,7 +146,7 @@ static bool cpu_pre_2_8_migration(void *opaque, int version_id)
|
|||||||
return cpu->pre_2_8_migration;
|
return cpu->pre_2_8_migration;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cpu_pre_save(void *opaque)
|
static int cpu_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
PowerPCCPU *cpu = opaque;
|
PowerPCCPU *cpu = opaque;
|
||||||
CPUPPCState *env = &cpu->env;
|
CPUPPCState *env = &cpu->env;
|
||||||
@ -195,6 +195,8 @@ static void cpu_pre_save(void *opaque)
|
|||||||
cpu->mig_insns_flags2 = env->insns_flags2 & insns_compat_mask2;
|
cpu->mig_insns_flags2 = env->insns_flags2 & insns_compat_mask2;
|
||||||
cpu->mig_nb_BATs = env->nb_BATs;
|
cpu->mig_nb_BATs = env->nb_BATs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -37,13 +37,15 @@ static int cpu_post_load(void *opaque, int version_id)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cpu_pre_save(void *opaque)
|
static int cpu_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
S390CPU *cpu = opaque;
|
S390CPU *cpu = opaque;
|
||||||
|
|
||||||
if (kvm_enabled()) {
|
if (kvm_enabled()) {
|
||||||
kvm_s390_vcpu_interrupt_pre_save(cpu);
|
kvm_s390_vcpu_interrupt_pre_save(cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool fpu_needed(void *opaque)
|
static inline bool fpu_needed(void *opaque)
|
||||||
|
@ -88,7 +88,7 @@ static const VMStateInfo vmstate_psr = {
|
|||||||
.put = put_psr,
|
.put = put_psr,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void cpu_pre_save(void *opaque)
|
static int cpu_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
SPARCCPU *cpu = opaque;
|
SPARCCPU *cpu = opaque;
|
||||||
CPUSPARCState *env = &cpu->env;
|
CPUSPARCState *env = &cpu->env;
|
||||||
@ -97,6 +97,8 @@ static void cpu_pre_save(void *opaque)
|
|||||||
* window as the outs of the first window
|
* window as the outs of the first window
|
||||||
*/
|
*/
|
||||||
cpu_set_cwp(env, env->cwp);
|
cpu_set_cwp(env, env->cwp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 32-bit SPARC retains migration compatibility with older versions
|
/* 32-bit SPARC retains migration compatibility with older versions
|
||||||
|
@ -70,7 +70,8 @@ static void save_vmstate(const VMStateDescription *desc, void *obj)
|
|||||||
QEMUFile *f = open_test_file(true);
|
QEMUFile *f = open_test_file(true);
|
||||||
|
|
||||||
/* Save file with vmstate */
|
/* Save file with vmstate */
|
||||||
vmstate_save_state(f, desc, obj, NULL);
|
int ret = vmstate_save_state(f, desc, obj, NULL);
|
||||||
|
g_assert(!ret);
|
||||||
qemu_put_byte(f, QEMU_VM_EOF);
|
qemu_put_byte(f, QEMU_VM_EOF);
|
||||||
g_assert(!qemu_file_get_error(f));
|
g_assert(!qemu_file_get_error(f));
|
||||||
qemu_fclose(f);
|
qemu_fclose(f);
|
||||||
@ -381,7 +382,8 @@ static void test_save_noskip(void)
|
|||||||
QEMUFile *fsave = open_test_file(true);
|
QEMUFile *fsave = open_test_file(true);
|
||||||
TestStruct obj = { .a = 1, .b = 2, .c = 3, .d = 4, .e = 5, .f = 6,
|
TestStruct obj = { .a = 1, .b = 2, .c = 3, .d = 4, .e = 5, .f = 6,
|
||||||
.skip_c_e = false };
|
.skip_c_e = false };
|
||||||
vmstate_save_state(fsave, &vmstate_skipping, &obj, NULL);
|
int ret = vmstate_save_state(fsave, &vmstate_skipping, &obj, NULL);
|
||||||
|
g_assert(!ret);
|
||||||
g_assert(!qemu_file_get_error(fsave));
|
g_assert(!qemu_file_get_error(fsave));
|
||||||
|
|
||||||
uint8_t expected[] = {
|
uint8_t expected[] = {
|
||||||
@ -402,7 +404,8 @@ static void test_save_skip(void)
|
|||||||
QEMUFile *fsave = open_test_file(true);
|
QEMUFile *fsave = open_test_file(true);
|
||||||
TestStruct obj = { .a = 1, .b = 2, .c = 3, .d = 4, .e = 5, .f = 6,
|
TestStruct obj = { .a = 1, .b = 2, .c = 3, .d = 4, .e = 5, .f = 6,
|
||||||
.skip_c_e = true };
|
.skip_c_e = true };
|
||||||
vmstate_save_state(fsave, &vmstate_skipping, &obj, NULL);
|
int ret = vmstate_save_state(fsave, &vmstate_skipping, &obj, NULL);
|
||||||
|
g_assert(!ret);
|
||||||
g_assert(!qemu_file_get_error(fsave));
|
g_assert(!qemu_file_get_error(fsave));
|
||||||
|
|
||||||
uint8_t expected[] = {
|
uint8_t expected[] = {
|
||||||
@ -765,11 +768,13 @@ typedef struct TmpTestStruct {
|
|||||||
int64_t diff;
|
int64_t diff;
|
||||||
} TmpTestStruct;
|
} TmpTestStruct;
|
||||||
|
|
||||||
static void tmp_child_pre_save(void *opaque)
|
static int tmp_child_pre_save(void *opaque)
|
||||||
{
|
{
|
||||||
struct TmpTestStruct *tts = opaque;
|
struct TmpTestStruct *tts = opaque;
|
||||||
|
|
||||||
tts->diff = tts->parent->b - tts->parent->a;
|
tts->diff = tts->parent->b - tts->parent->a;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tmp_child_post_load(void *opaque, int version_id)
|
static int tmp_child_post_load(void *opaque, int version_id)
|
||||||
|
Loading…
Reference in New Issue
Block a user