Changeset View
Changeset View
Standalone View
Standalone View
usr.sbin/bhyve/virtio.c
Show First 20 Lines • Show All 879 Lines • ▼ Show 20 Lines | vi_pci_snapshot_queues(struct virtio_softc *vs, struct vm_snapshot_meta *meta) | ||||
uint64_t addr_size; | uint64_t addr_size; | ||||
vc = vs->vs_vc; | vc = vs->vs_vc; | ||||
/* Save virtio queue info */ | /* Save virtio queue info */ | ||||
for (i = 0; i < vc->vc_nvq; i++) { | for (i = 0; i < vc->vc_nvq; i++) { | ||||
vq = &vs->vs_queues[i]; | vq = &vs->vs_queues[i]; | ||||
/* Set index */ | |||||
SNAPSHOT_SET_INTERN_ARR_INDEX(meta, i); | |||||
SNAPSHOT_VAR_CMP_OR_LEAVE(vq->vq_qsize, meta, ret, done); | SNAPSHOT_VAR_CMP_OR_LEAVE(vq->vq_qsize, meta, ret, done); | ||||
SNAPSHOT_VAR_CMP_OR_LEAVE(vq->vq_num, meta, ret, done); | SNAPSHOT_VAR_CMP_OR_LEAVE(vq->vq_num, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(vq->vq_flags, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(vq->vq_flags, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(vq->vq_last_avail, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(vq->vq_last_avail, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(vq->vq_next_used, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(vq->vq_next_used, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(vq->vq_save_used, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(vq->vq_save_used, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(vq->vq_msix_idx, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(vq->vq_msix_idx, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(vq->vq_pfn, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(vq->vq_pfn, meta, ret, done); | ||||
SNAPSHOT_ADD_INTERN_ARR(h2g_addrs, meta); | |||||
SNAPSHOT_ACTIVATE_AUTO_INDEXING(meta, 0); | |||||
addr_size = vq->vq_qsize * sizeof(struct virtio_desc); | addr_size = vq->vq_qsize * sizeof(struct virtio_desc); | ||||
SNAPSHOT_GUEST2HOST_ADDR_OR_LEAVE(vq->vq_desc, addr_size, | SNAPSHOT_GUEST2HOST_ADDR_OR_LEAVE(vq->vq_desc, addr_size, | ||||
false, meta, ret, done); | false, meta, ret, done); | ||||
addr_size = (2 + vq->vq_qsize + 1) * sizeof(uint16_t); | addr_size = (2 + vq->vq_qsize + 1) * sizeof(uint16_t); | ||||
SNAPSHOT_GUEST2HOST_ADDR_OR_LEAVE(vq->vq_avail, addr_size, | SNAPSHOT_GUEST2HOST_ADDR_OR_LEAVE(vq->vq_avail, addr_size, | ||||
false, meta, ret, done); | false, meta, ret, done); | ||||
addr_size = (2 + 2 * vq->vq_qsize + 1) * sizeof(uint16_t); | addr_size = (2 + 2 * vq->vq_qsize + 1) * sizeof(uint16_t); | ||||
SNAPSHOT_GUEST2HOST_ADDR_OR_LEAVE(vq->vq_used, addr_size, | SNAPSHOT_GUEST2HOST_ADDR_OR_LEAVE(vq->vq_used, addr_size, | ||||
false, meta, ret, done); | false, meta, ret, done); | ||||
SNAPSHOT_DEACTIVATE_AUTO_INDEXING(meta); | |||||
SNAPSHOT_REMOVE_INTERN_ARR(h2g_addrs, meta); | |||||
SNAPSHOT_BUF_OR_LEAVE(vq->vq_desc, vring_size(vq->vq_qsize), | SNAPSHOT_BUF_OR_LEAVE(vq->vq_desc, vring_size(vq->vq_qsize), | ||||
meta, ret, done); | meta, ret, done); | ||||
} | } | ||||
/* Reset index */ | |||||
SNAPSHOT_CLEAR_INTERN_ARR_INDEX(meta); | |||||
done: | done: | ||||
return (ret); | return (ret); | ||||
} | } | ||||
int | int | ||||
vi_pci_snapshot(struct vm_snapshot_meta *meta) | vi_pci_snapshot(struct vm_snapshot_meta *meta) | ||||
{ | { | ||||
int ret; | int ret; | ||||
struct pci_devinst *pi; | struct pci_devinst *pi; | ||||
struct virtio_softc *vs; | struct virtio_softc *vs; | ||||
struct virtio_consts *vc; | struct virtio_consts *vc; | ||||
pi = meta->dev_data; | pi = meta->dev_data; | ||||
vs = pi->pi_arg; | vs = pi->pi_arg; | ||||
vc = vs->vs_vc; | vc = vs->vs_vc; | ||||
/* Save virtio softc */ | /* Save virtio softc */ | ||||
SNAPSHOT_ADD_INTERN_ARR(softc, meta); | |||||
ret = vi_pci_snapshot_softc(vs, meta); | ret = vi_pci_snapshot_softc(vs, meta); | ||||
if (ret != 0) | if (ret != 0) | ||||
goto done; | goto done; | ||||
SNAPSHOT_REMOVE_INTERN_ARR(softc, meta); | |||||
/* Save virtio consts */ | /* Save virtio consts */ | ||||
SNAPSHOT_ADD_INTERN_ARR(consts, meta); | |||||
ret = vi_pci_snapshot_consts(vc, meta); | ret = vi_pci_snapshot_consts(vc, meta); | ||||
if (ret != 0) | if (ret != 0) | ||||
goto done; | goto done; | ||||
SNAPSHOT_REMOVE_INTERN_ARR(consts, meta); | |||||
/* Save virtio queue info */ | /* Save virtio queue info */ | ||||
SNAPSHOT_ADD_INTERN_ARR(queues, meta); | |||||
ret = vi_pci_snapshot_queues(vs, meta); | ret = vi_pci_snapshot_queues(vs, meta); | ||||
if (ret != 0) | if (ret != 0) | ||||
goto done; | goto done; | ||||
SNAPSHOT_REMOVE_INTERN_ARR(queues, meta); | |||||
/* Save device softc, if needed */ | /* Save device softc, if needed */ | ||||
if (vc->vc_snapshot != NULL) { | if (vc->vc_snapshot != NULL) { | ||||
ret = (*vc->vc_snapshot)(DEV_SOFTC(vs), meta); | ret = (*vc->vc_snapshot)(DEV_SOFTC(vs), meta); | ||||
if (ret != 0) | if (ret != 0) | ||||
goto done; | goto done; | ||||
} | } | ||||
done: | done: | ||||
return (ret); | return (ret); | ||||
} | } | ||||
#endif | #endif |