Changeset View
Changeset View
Standalone View
Standalone View
usr.sbin/bhyve/pci_emul.c
Show First 20 Lines • Show All 1,970 Lines • ▼ Show 20 Lines | |||||
#ifdef BHYVE_SNAPSHOT | #ifdef BHYVE_SNAPSHOT | ||||
/* | /* | ||||
* Saves/restores PCI device emulated state. Returns 0 on success. | * Saves/restores PCI device emulated state. Returns 0 on success. | ||||
*/ | */ | ||||
static int | static int | ||||
pci_snapshot_pci_dev(struct vm_snapshot_meta *meta) | pci_snapshot_pci_dev(struct vm_snapshot_meta *meta) | ||||
{ | { | ||||
struct pci_devinst *pi; | struct pci_devinst *pi; | ||||
struct pcibar *pb; | |||||
struct msix_table_entry *mte; | |||||
int i; | int i; | ||||
int ret; | int ret; | ||||
pi = meta->dev_data; | pi = meta->dev_data; | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_msi.enabled, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(pi->pi_msi.enabled, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_msi.addr, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(pi->pi_msi.addr, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_msi.msg_data, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(pi->pi_msi.msg_data, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_msi.maxmsgnum, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(pi->pi_msi.maxmsgnum, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.enabled, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.enabled, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.table_bar, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.table_bar, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.pba_bar, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.pba_bar, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.table_offset, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.table_offset, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.table_count, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.table_count, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.pba_offset, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.pba_offset, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.pba_size, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.pba_size, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.function_mask, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.function_mask, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.pba_page_offset, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.pba_page_offset, meta, ret, done); | ||||
SNAPSHOT_BUF_OR_LEAVE(pi->pi_cfgdata, sizeof(pi->pi_cfgdata), | SNAPSHOT_BUF_OR_LEAVE(pi->pi_cfgdata, sizeof(pi->pi_cfgdata), | ||||
meta, ret, done); | meta, ret, done); | ||||
SNAPSHOT_ADD_INTERN_ARR(pi_bars, meta); | |||||
for (i = 0; i < nitems(pi->pi_bar); i++) { | for (i = 0; i < nitems(pi->pi_bar); i++) { | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_bar[i].type, meta, ret, done); | pb = &(pi->pi_bar[i]); | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_bar[i].size, meta, ret, done); | SNAPSHOT_SET_INTERN_ARR_INDEX(meta, i); | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_bar[i].addr, meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(pb->type, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(pb->size, meta, ret, done); | |||||
SNAPSHOT_VAR_OR_LEAVE(pb->addr, meta, ret, done); | |||||
} | } | ||||
SNAPSHOT_CLEAR_INTERN_ARR_INDEX(meta); | |||||
SNAPSHOT_REMOVE_INTERN_ARR(pi_bars, meta); | |||||
/* Restore MSI-X table. */ | /* Restore MSI-X table. */ | ||||
SNAPSHOT_ADD_INTERN_ARR(pi_msix_table, meta); | |||||
for (i = 0; i < pi->pi_msix.table_count; i++) { | for (i = 0; i < pi->pi_msix.table_count; i++) { | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.table[i].addr, | mte = &(pi->pi_msix.table[i]); | ||||
meta, ret, done); | SNAPSHOT_SET_INTERN_ARR_INDEX(meta, i); | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.table[i].msg_data, | SNAPSHOT_VAR_OR_LEAVE(mte->addr, meta, ret, done); | ||||
meta, ret, done); | SNAPSHOT_VAR_OR_LEAVE(mte->msg_data, meta, ret, done); | ||||
SNAPSHOT_VAR_OR_LEAVE(pi->pi_msix.table[i].vector_control, | SNAPSHOT_VAR_OR_LEAVE(mte->vector_control, meta, ret, done); | ||||
meta, ret, done); | |||||
} | } | ||||
SNAPSHOT_CLEAR_INTERN_ARR_INDEX(meta); | |||||
SNAPSHOT_REMOVE_INTERN_ARR(pi_msix_table, meta); | |||||
done: | done: | ||||
return (ret); | return (ret); | ||||
} | } | ||||
static int | static int | ||||
pci_find_slotted_dev(const char *dev_name, struct pci_devemu **pde, | pci_find_slotted_dev(const char *dev_name, struct pci_devemu **pde, | ||||
struct pci_devinst **pdi) | struct pci_devinst **pdi) | ||||
▲ Show 20 Lines • Show All 321 Lines • Show Last 20 Lines |