1*f2a8f0a6SJuan Quintela /* 2*f2a8f0a6SJuan Quintela * QEMU migration vmstate registration 3*f2a8f0a6SJuan Quintela * 4*f2a8f0a6SJuan Quintela * Copyright IBM, Corp. 2008 5*f2a8f0a6SJuan Quintela * 6*f2a8f0a6SJuan Quintela * Authors: 7*f2a8f0a6SJuan Quintela * Anthony Liguori <aliguori@us.ibm.com> 8*f2a8f0a6SJuan Quintela * 9*f2a8f0a6SJuan Quintela * This work is licensed under the terms of the GNU GPL, version 2. See 10*f2a8f0a6SJuan Quintela * the COPYING file in the top-level directory. 11*f2a8f0a6SJuan Quintela * 12*f2a8f0a6SJuan Quintela */ 13*f2a8f0a6SJuan Quintela 14*f2a8f0a6SJuan Quintela #ifndef MIGRATION_REGISTER_H 15*f2a8f0a6SJuan Quintela #define MIGRATION_REGISTER_H 16*f2a8f0a6SJuan Quintela 17*f2a8f0a6SJuan Quintela typedef void SaveStateHandler(QEMUFile *f, void *opaque); 18*f2a8f0a6SJuan Quintela typedef int LoadStateHandler(QEMUFile *f, void *opaque, int version_id); 19*f2a8f0a6SJuan Quintela 20*f2a8f0a6SJuan Quintela typedef struct SaveVMHandlers { 21*f2a8f0a6SJuan Quintela /* This runs inside the iothread lock. */ 22*f2a8f0a6SJuan Quintela SaveStateHandler *save_state; 23*f2a8f0a6SJuan Quintela 24*f2a8f0a6SJuan Quintela void (*cleanup)(void *opaque); 25*f2a8f0a6SJuan Quintela int (*save_live_complete_postcopy)(QEMUFile *f, void *opaque); 26*f2a8f0a6SJuan Quintela int (*save_live_complete_precopy)(QEMUFile *f, void *opaque); 27*f2a8f0a6SJuan Quintela 28*f2a8f0a6SJuan Quintela /* This runs both outside and inside the iothread lock. */ 29*f2a8f0a6SJuan Quintela bool (*is_active)(void *opaque); 30*f2a8f0a6SJuan Quintela 31*f2a8f0a6SJuan Quintela /* This runs outside the iothread lock in the migration case, and 32*f2a8f0a6SJuan Quintela * within the lock in the savevm case. The callback had better only 33*f2a8f0a6SJuan Quintela * use data that is local to the migration thread or protected 34*f2a8f0a6SJuan Quintela * by other locks. 35*f2a8f0a6SJuan Quintela */ 36*f2a8f0a6SJuan Quintela int (*save_live_iterate)(QEMUFile *f, void *opaque); 37*f2a8f0a6SJuan Quintela 38*f2a8f0a6SJuan Quintela /* This runs outside the iothread lock! */ 39*f2a8f0a6SJuan Quintela int (*save_live_setup)(QEMUFile *f, void *opaque); 40*f2a8f0a6SJuan Quintela void (*save_live_pending)(QEMUFile *f, void *opaque, 41*f2a8f0a6SJuan Quintela uint64_t threshold_size, 42*f2a8f0a6SJuan Quintela uint64_t *non_postcopiable_pending, 43*f2a8f0a6SJuan Quintela uint64_t *postcopiable_pending); 44*f2a8f0a6SJuan Quintela LoadStateHandler *load_state; 45*f2a8f0a6SJuan Quintela } SaveVMHandlers; 46*f2a8f0a6SJuan Quintela 47*f2a8f0a6SJuan Quintela int register_savevm_live(DeviceState *dev, 48*f2a8f0a6SJuan Quintela const char *idstr, 49*f2a8f0a6SJuan Quintela int instance_id, 50*f2a8f0a6SJuan Quintela int version_id, 51*f2a8f0a6SJuan Quintela SaveVMHandlers *ops, 52*f2a8f0a6SJuan Quintela void *opaque); 53*f2a8f0a6SJuan Quintela 54*f2a8f0a6SJuan Quintela void unregister_savevm(DeviceState *dev, const char *idstr, void *opaque); 55*f2a8f0a6SJuan Quintela 56*f2a8f0a6SJuan Quintela #endif 57