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