VMstate send buffers in bytes ammonts, not bits or MSIX_ENTRY_SIZE multiples
Signed-off-by: Juan Quintela <quint...@redhat.com> --- hw/msix.c | 13 +++++++++---- hw/pci.h | 2 ++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/hw/msix.c b/hw/msix.c index 8dca9fd..62865d0 100644 --- a/hw/msix.c +++ b/hw/msix.c @@ -294,9 +294,11 @@ int msix_uninit(PCIDevice *dev) void msix_save(PCIDevice *dev, QEMUFile *f) { unsigned n = dev->msix_entries_nr; + dev->msix_entries_size = n * MSIX_ENTRY_SIZE; + dev->msix_pending_size = (n + 7) / 8; - qemu_put_buffer(f, dev->msix_table_page, n * MSIX_ENTRY_SIZE); - qemu_put_buffer(f, dev->msix_table_page + MSIX_PAGE_PENDING, (n + 7) / 8); + qemu_put_buffer(f, dev->msix_table_page, dev->msix_entries_size); + qemu_put_buffer(f, dev->msix_table_page + MSIX_PAGE_PENDING, dev->msix_pending_size); } /* Should be called after restoring the config space. */ @@ -304,9 +306,12 @@ void msix_load(PCIDevice *dev, QEMUFile *f) { unsigned n = dev->msix_entries_nr; + dev->msix_entries_size = n * MSIX_ENTRY_SIZE; + dev->msix_pending_size = (n + 7) / 8; + msix_free_irq_entries(dev); - qemu_get_buffer(f, dev->msix_table_page, n * MSIX_ENTRY_SIZE); - qemu_get_buffer(f, dev->msix_table_page + MSIX_PAGE_PENDING, (n + 7) / 8); + qemu_get_buffer(f, dev->msix_table_page, dev->msix_entries_size); + qemu_get_buffer(f, dev->msix_table_page + MSIX_PAGE_PENDING, dev->msix_pending_size); } /* Does device support MSI-X? */ diff --git a/hw/pci.h b/hw/pci.h index 0baf69b..c67cc70 100644 --- a/hw/pci.h +++ b/hw/pci.h @@ -241,6 +241,8 @@ struct PCIDevice { uint32_t msix_bar_size; /* Version id needed for VMState */ int32_t version_id; + int32_t msix_entries_size; + int32_t msix_pending_size; }; PCIDevice *pci_register_device(PCIBus *bus, const char *name, -- 1.6.5.2