| /* |
| * VFIO migration |
| * |
| * Copyright Red Hat, Inc. 2025 |
| * |
| * SPDX-License-Identifier: GPL-2.0-or-later |
| */ |
| |
| #ifndef HW_VFIO_VFIO_MIGRATION_INTERNAL_H |
| #define HW_VFIO_VFIO_MIGRATION_INTERNAL_H |
| |
| #ifdef CONFIG_LINUX |
| #include <linux/vfio.h> |
| #endif |
| |
| #include "qemu/notify.h" |
| |
| /* |
| * Flags to be used as unique delimiters for VFIO devices in the migration |
| * stream. These flags are composed as: |
| * 0xffffffff => MSB 32-bit all 1s |
| * 0xef10 => Magic ID, represents emulated (virtual) function IO |
| * 0x0000 => 16-bits reserved for flags |
| * |
| * The beginning of state information is marked by _DEV_CONFIG_STATE, |
| * _DEV_SETUP_STATE, or _DEV_DATA_STATE, respectively. The end of a |
| * certain state information is marked by _END_OF_STATE. |
| */ |
| #define VFIO_MIG_FLAG_END_OF_STATE (0xffffffffef100001ULL) |
| #define VFIO_MIG_FLAG_DEV_CONFIG_STATE (0xffffffffef100002ULL) |
| #define VFIO_MIG_FLAG_DEV_SETUP_STATE (0xffffffffef100003ULL) |
| #define VFIO_MIG_FLAG_DEV_DATA_STATE (0xffffffffef100004ULL) |
| #define VFIO_MIG_FLAG_DEV_INIT_DATA_SENT (0xffffffffef100005ULL) |
| #define VFIO_MIG_FLAG_DEV_CONFIG_LOAD_READY (0xffffffffef100006ULL) |
| |
| typedef struct VFIODevice VFIODevice; |
| typedef struct VFIOMultifd VFIOMultifd; |
| |
| typedef struct VFIOMigration { |
| struct VFIODevice *vbasedev; |
| VMChangeStateEntry *vm_state; |
| NotifierWithReturn migration_state; |
| uint32_t device_state; |
| int data_fd; |
| void *data_buffer; |
| size_t data_buffer_size; |
| uint64_t mig_flags; |
| uint64_t precopy_init_size; |
| uint64_t precopy_dirty_size; |
| bool multifd_transfer; |
| VFIOMultifd *multifd; |
| bool initial_data_sent; |
| |
| bool event_save_iterate_started; |
| bool event_precopy_empty_hit; |
| } VFIOMigration; |
| |
| bool vfio_migration_realize(VFIODevice *vbasedev, Error **errp); |
| void vfio_migration_exit(VFIODevice *vbasedev); |
| bool vfio_device_state_is_running(VFIODevice *vbasedev); |
| bool vfio_device_state_is_precopy(VFIODevice *vbasedev); |
| int vfio_save_device_config_state(QEMUFile *f, void *opaque, Error **errp); |
| int vfio_load_device_config_state(QEMUFile *f, void *opaque); |
| |
| #ifdef CONFIG_LINUX |
| int vfio_migration_set_state(VFIODevice *vbasedev, |
| enum vfio_device_mig_state new_state, |
| enum vfio_device_mig_state recover_state, |
| Error **errp); |
| #endif |
| |
| void vfio_migration_add_bytes_transferred(unsigned long val); |
| |
| #endif /* HW_VFIO_VFIO_MIGRATION_INTERNAL_H */ |