Changeset View
Changeset View
Standalone View
Standalone View
usr.sbin/bhyve/pci_emul.c
Show First 20 Lines • Show All 459 Lines • ▼ Show 20 Lines | |||||
/* | /* | ||||
* Register (or unregister) the MMIO or I/O region associated with the BAR | * Register (or unregister) the MMIO or I/O region associated with the BAR | ||||
* register 'idx' of an emulated pci device. | * register 'idx' of an emulated pci device. | ||||
*/ | */ | ||||
static void | static void | ||||
modify_bar_registration(struct pci_devinst *pi, int idx, int registration) | modify_bar_registration(struct pci_devinst *pi, int idx, int registration) | ||||
{ | { | ||||
struct pci_devemu *pe; | |||||
int error; | int error; | ||||
struct inout_port iop; | struct inout_port iop; | ||||
struct mem_range mr; | struct mem_range mr; | ||||
pe = pi->pi_d; | |||||
switch (pi->pi_bar[idx].type) { | switch (pi->pi_bar[idx].type) { | ||||
case PCIBAR_IO: | case PCIBAR_IO: | ||||
bzero(&iop, sizeof(struct inout_port)); | bzero(&iop, sizeof(struct inout_port)); | ||||
iop.name = pi->pi_name; | iop.name = pi->pi_name; | ||||
iop.port = pi->pi_bar[idx].addr; | iop.port = pi->pi_bar[idx].addr; | ||||
iop.size = pi->pi_bar[idx].size; | iop.size = pi->pi_bar[idx].size; | ||||
if (registration) { | if (registration) { | ||||
iop.flags = IOPORT_F_INOUT; | iop.flags = IOPORT_F_INOUT; | ||||
iop.handler = pci_emul_io_handler; | iop.handler = pci_emul_io_handler; | ||||
iop.arg = pi; | iop.arg = pi; | ||||
error = register_inout(&iop); | error = register_inout(&iop); | ||||
} else | } else | ||||
error = unregister_inout(&iop); | error = unregister_inout(&iop); | ||||
if (pe->pe_baraddr != NULL) | |||||
bz: Can someone explain to me what happens here in case register/unregister_inout have returned an… | |||||
(*pe->pe_baraddr)(pi->pi_vmctx, pi, idx, registration, | |||||
pi->pi_bar[idx].addr); | |||||
break; | break; | ||||
case PCIBAR_MEM32: | case PCIBAR_MEM32: | ||||
case PCIBAR_MEM64: | case PCIBAR_MEM64: | ||||
bzero(&mr, sizeof(struct mem_range)); | bzero(&mr, sizeof(struct mem_range)); | ||||
mr.name = pi->pi_name; | mr.name = pi->pi_name; | ||||
mr.base = pi->pi_bar[idx].addr; | mr.base = pi->pi_bar[idx].addr; | ||||
mr.size = pi->pi_bar[idx].size; | mr.size = pi->pi_bar[idx].size; | ||||
if (registration) { | if (registration) { | ||||
mr.flags = MEM_F_RW; | mr.flags = MEM_F_RW; | ||||
mr.handler = pci_emul_mem_handler; | mr.handler = pci_emul_mem_handler; | ||||
mr.arg1 = pi; | mr.arg1 = pi; | ||||
mr.arg2 = idx; | mr.arg2 = idx; | ||||
error = register_mem(&mr); | error = register_mem(&mr); | ||||
} else | } else | ||||
error = unregister_mem(&mr); | error = unregister_mem(&mr); | ||||
if (pe->pe_baraddr != NULL) | |||||
(*pe->pe_baraddr)(pi->pi_vmctx, pi, idx, registration, | |||||
pi->pi_bar[idx].addr); | |||||
break; | break; | ||||
default: | default: | ||||
error = EINVAL; | error = EINVAL; | ||||
break; | break; | ||||
} | } | ||||
assert(error == 0); | assert(error == 0); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 1,635 Lines • Show Last 20 Lines |
Can someone explain to me what happens here in case register/unregister_inout have returned an error?
(same below for _mem).