Lines Matching refs:d
264 #define bad_driver(d, fmt, ...) \ argument
265 errx(1, "%s: bad driver: " fmt, (d)->name, ## __VA_ARGS__)
282 static void iov_consume(struct device *d, in iov_consume() argument
301 bad_driver(d, "iovec too short!"); in iov_consume()
637 static void *_check_pointer(struct device *d, in _check_pointer() argument
646 bad_driver(d, "%s:%i: Invalid address %#lx", in _check_pointer()
655 #define check_pointer(d,addr,size) _check_pointer(d, addr, size, __LINE__) argument
662 static unsigned next_desc(struct device *d, struct vring_desc *desc, in next_desc() argument
677 bad_driver(d, "Desc next is %u", next); in next_desc()
1195 struct device *d = devices.pci[i]; in cleanup_devices() local
1196 if (!d) in cleanup_devices()
1198 reset_device(d); in cleanup_devices()
1297 static bool valid_bar_access(struct device *d, in valid_bar_access() argument
1305 if (cfg_access->cap.offset >= d->mmio_size in valid_bar_access()
1306 || cfg_access->cap.offset + cfg_access->cap.length > d->mmio_size) in valid_bar_access()
1359 static void emulate_mmio_write(struct device *d, u32 off, u32 val, u32 mask);
1364 struct device *d = dev_and_reg(®); in pci_data_iowrite() local
1367 if (!d) in pci_data_iowrite()
1377 if (&d->config_words[reg] == &d->config.bar[0]) { in pci_data_iowrite()
1380 iowrite(portoff, val, mask, &d->config.bar[0]); in pci_data_iowrite()
1381 for (i = 0; (1 << i) < d->mmio_size; i++) in pci_data_iowrite()
1382 d->config.bar[0] &= ~(1 << i); in pci_data_iowrite()
1384 } else if ((&d->config_words[reg] > &d->config.bar[0] in pci_data_iowrite()
1385 && &d->config_words[reg] <= &d->config.bar[6]) in pci_data_iowrite()
1386 || &d->config_words[reg] == &d->config.expansion_rom_addr) { in pci_data_iowrite()
1388 iowrite(portoff, val, mask, &d->config_words[reg]); in pci_data_iowrite()
1391 } else if (&d->config_words[reg] == (void *)&d->config.cacheline_size) { in pci_data_iowrite()
1395 iowrite(portoff, val, mask, &d->config_words[reg]); in pci_data_iowrite()
1397 } else if (&d->config_words[reg] == (void *)&d->config.command in pci_data_iowrite()
1401 } else if (&d->config_words[reg] in pci_data_iowrite()
1402 == (void *)&d->config.cfg_access.cap.bar in pci_data_iowrite()
1403 || &d->config_words[reg] in pci_data_iowrite()
1404 == &d->config.cfg_access.cap.length in pci_data_iowrite()
1405 || &d->config_words[reg] in pci_data_iowrite()
1406 == &d->config.cfg_access.cap.offset) { in pci_data_iowrite()
1414 iowrite(portoff, val, mask, &d->config_words[reg]); in pci_data_iowrite()
1416 } else if (&d->config_words[reg] == &d->config.cfg_access.pci_cfg_data) { in pci_data_iowrite()
1429 if (!valid_bar_access(d, &d->config.cfg_access)) in pci_data_iowrite()
1432 iowrite(portoff, val, mask, &d->config.cfg_access.pci_cfg_data); in pci_data_iowrite()
1438 write_mask = (1ULL<<(8*d->config.cfg_access.cap.length)) - 1; in pci_data_iowrite()
1440 d->config.cfg_access.pci_cfg_data, write_mask, in pci_data_iowrite()
1441 d->config.cfg_access.cap.bar, in pci_data_iowrite()
1442 d->config.cfg_access.cap.offset, in pci_data_iowrite()
1443 d->config.cfg_access.cap.length); in pci_data_iowrite()
1445 emulate_mmio_write(d, d->config.cfg_access.cap.offset, in pci_data_iowrite()
1446 d->config.cfg_access.pci_cfg_data, in pci_data_iowrite()
1461 static u32 emulate_mmio_read(struct device *d, u32 off, u32 mask);
1466 struct device *d = dev_and_reg(®); in pci_data_ioread() local
1468 if (!d) in pci_data_ioread()
1472 if (&d->config_words[reg] == &d->config.cfg_access.pci_cfg_data) { in pci_data_ioread()
1484 if (!valid_bar_access(d, &d->config.cfg_access)) in pci_data_ioread()
1485 bad_driver(d, in pci_data_ioread()
1487 d->config.cfg_access.cap.bar, in pci_data_ioread()
1488 d->config.cfg_access.cap.offset, in pci_data_ioread()
1489 d->config.cfg_access.cap.length); in pci_data_ioread()
1495 read_mask = (1ULL<<(8*d->config.cfg_access.cap.length))-1; in pci_data_ioread()
1496 d->config.cfg_access.pci_cfg_data in pci_data_ioread()
1497 = emulate_mmio_read(d, in pci_data_ioread()
1498 d->config.cfg_access.cap.offset, in pci_data_ioread()
1501 d->config.cfg_access.pci_cfg_data, read_mask, in pci_data_ioread()
1502 d->config.cfg_access.cap.bar, in pci_data_ioread()
1503 d->config.cfg_access.cap.offset, in pci_data_ioread()
1504 d->config.cfg_access.cap.length); in pci_data_ioread()
1506 ioread(port - PCI_CONFIG_DATA, d->config_words[reg], mask, val); in pci_data_ioread()
1750 struct device *d = devices.pci[i]; in find_mmio_region() local
1752 if (!d) in find_mmio_region()
1754 if (paddr < d->mmio_addr) in find_mmio_region()
1756 if (paddr >= d->mmio_addr + d->mmio_size) in find_mmio_region()
1758 *off = paddr - d->mmio_addr; in find_mmio_region()
1759 return d; in find_mmio_region()
1765 static struct virtqueue *vq_by_num(struct device *d, u32 num) in vq_by_num() argument
1767 struct virtqueue *vq = d->vq; in vq_by_num()
1799 static void check_virtqueue(struct device *d, struct virtqueue *vq) in check_virtqueue() argument
1868 static void start_virtqueues(struct device *d) in start_virtqueues() argument
1872 for (vq = d->vq; vq; vq = vq->next) { in start_virtqueues()
1878 static void emulate_mmio_write(struct device *d, u32 off, u32 val, u32 mask) in emulate_mmio_write() argument
1892 d->mmio->cfg.device_feature = d->features; in emulate_mmio_write()
1894 d->mmio->cfg.device_feature = (d->features >> 32); in emulate_mmio_write()
1896 d->mmio->cfg.device_feature = 0; in emulate_mmio_write()
1900 bad_driver(d, "Unexpected driver select %u", val); in emulate_mmio_write()
1903 if (d->mmio->cfg.guest_feature_select == 0) { in emulate_mmio_write()
1904 d->features_accepted &= ~((u64)0xFFFFFFFF); in emulate_mmio_write()
1905 d->features_accepted |= val; in emulate_mmio_write()
1907 assert(d->mmio->cfg.guest_feature_select == 1); in emulate_mmio_write()
1908 d->features_accepted &= 0xFFFFFFFF; in emulate_mmio_write()
1909 d->features_accepted |= ((u64)val) << 32; in emulate_mmio_write()
1917 if (d->features_accepted & ~d->features) in emulate_mmio_write()
1918 bad_driver(d, "over-accepted features %#llx of %#llx", in emulate_mmio_write()
1919 d->features_accepted, d->features); in emulate_mmio_write()
1924 verbose("%s: device status -> %#x\n", d->name, val); in emulate_mmio_write()
1932 reset_device(d); in emulate_mmio_write()
1937 if (d->mmio->cfg.device_status & ~val) in emulate_mmio_write()
1938 bad_driver(d, "unset of device status bit %#x -> %#x", in emulate_mmio_write()
1939 d->mmio->cfg.device_status, val); in emulate_mmio_write()
1948 && !(d->mmio->cfg.device_status & VIRTIO_CONFIG_S_DRIVER_OK)) in emulate_mmio_write()
1949 start_virtqueues(d); in emulate_mmio_write()
1982 switch (val & ~d->mmio->cfg.device_status) { in emulate_mmio_write()
1992 bad_driver(d, "unknown device status bit %#x -> %#x", in emulate_mmio_write()
1993 d->mmio->cfg.device_status, val); in emulate_mmio_write()
1995 if (d->mmio->cfg.device_status != prev) in emulate_mmio_write()
1996 bad_driver(d, "unexpected status transition %#x -> %#x", in emulate_mmio_write()
1997 d->mmio->cfg.device_status, val); in emulate_mmio_write()
2000 switch (val & ~d->mmio->cfg.device_status) { in emulate_mmio_write()
2002 d->wrote_features_ok = true; in emulate_mmio_write()
2005 if (d->wrote_features_ok) in emulate_mmio_write()
2006 bad_driver(d, "did not re-read FEATURES_OK"); in emulate_mmio_write()
2012 vq = vq_by_num(d, val); in emulate_mmio_write()
2020 d->mmio->cfg.queue_size = 0; in emulate_mmio_write()
2024 if (d->mmio->cfg.queue_size) in emulate_mmio_write()
2025 save_vq_config(&d->mmio->cfg, in emulate_mmio_write()
2026 vq_by_num(d, d->mmio->cfg.queue_select)); in emulate_mmio_write()
2028 restore_vq_config(&d->mmio->cfg, vq); in emulate_mmio_write()
2038 bad_driver(d, "invalid queue size %u", val); in emulate_mmio_write()
2039 if (d->mmio->cfg.queue_enable) in emulate_mmio_write()
2040 bad_driver(d, "changing queue size on live device"); in emulate_mmio_write()
2043 bad_driver(d, "attempt to set MSIX vector to %u", val); in emulate_mmio_write()
2045 struct virtqueue *vq = vq_by_num(d, d->mmio->cfg.queue_select); in emulate_mmio_write()
2053 bad_driver(d, "setting queue_enable to %u", val); in emulate_mmio_write()
2067 if (d->mmio->cfg.device_status & VIRTIO_CONFIG_S_DRIVER_OK) in emulate_mmio_write()
2068 bad_driver(d, "enabling vq after DRIVER_OK"); in emulate_mmio_write()
2070 d->mmio->cfg.queue_enable = val; in emulate_mmio_write()
2071 save_vq_config(&d->mmio->cfg, vq); in emulate_mmio_write()
2072 check_virtqueue(d, vq); in emulate_mmio_write()
2076 bad_driver(d, "attempt to write to queue_notify_off"); in emulate_mmio_write()
2089 if (d->mmio->cfg.queue_enable) in emulate_mmio_write()
2090 bad_driver(d, "changing queue on live device"); in emulate_mmio_write()
2100 if (!(d->mmio->cfg.device_status & VIRTIO_CONFIG_S_FEATURES_OK)) in emulate_mmio_write()
2101 bad_driver(d, "setting up vq before FEATURES_OK"); in emulate_mmio_write()
2107 if (d->wrote_features_ok) in emulate_mmio_write()
2108 bad_driver(d, "didn't re-read FEATURES_OK before setup"); in emulate_mmio_write()
2112 vq = vq_by_num(d, val); in emulate_mmio_write()
2114 bad_driver(d, "Invalid vq notification on %u", val); in emulate_mmio_write()
2119 bad_driver(d, "Unexpected write to isr"); in emulate_mmio_write()
2123 if (strcmp(d->name, "console") == 0) { in emulate_mmio_write()
2136 bad_driver(d, "Unexpected write to offset %u", off); in emulate_mmio_write()
2154 if (!(d->mmio->cfg.device_status & VIRTIO_CONFIG_S_DRIVER)) in emulate_mmio_write()
2155 bad_driver(d, "feature write before VIRTIO_CONFIG_S_DRIVER"); in emulate_mmio_write()
2156 if (d->mmio->cfg.device_status & VIRTIO_CONFIG_S_FEATURES_OK) in emulate_mmio_write()
2157 bad_driver(d, "feature write after VIRTIO_CONFIG_S_FEATURES_OK"); in emulate_mmio_write()
2168 bad_driver(d, "non-32-bit write to offset %u (%#x)", in emulate_mmio_write()
2172 memcpy((char *)d->mmio + off, &val, 4); in emulate_mmio_write()
2177 bad_driver(d, "non-16-bit write to offset %u (%#x)", in emulate_mmio_write()
2179 memcpy((char *)d->mmio + off, &val, 2); in emulate_mmio_write()
2184 bad_driver(d, "non-8-bit write to offset %u (%#x)", in emulate_mmio_write()
2186 memcpy((char *)d->mmio + off, &val, 1); in emulate_mmio_write()
2190 static u32 emulate_mmio_read(struct device *d, u32 off, u32 mask) in emulate_mmio_read() argument
2211 if (!(d->mmio->cfg.device_status & VIRTIO_CONFIG_S_DRIVER)) in emulate_mmio_read()
2212 bad_driver(d, in emulate_mmio_read()
2216 bad_driver(d, "read of msix_config"); in emulate_mmio_read()
2221 d->wrote_features_ok = false; in emulate_mmio_read()
2243 if (!(d->mmio->cfg.device_status & VIRTIO_CONFIG_S_DRIVER_OK)) in emulate_mmio_read()
2244 bad_driver(d, "notify before VIRTIO_CONFIG_S_DRIVER_OK"); in emulate_mmio_read()
2248 bad_driver(d, "non-8-bit read from offset %u (%#x)", in emulate_mmio_read()
2250 isr = d->mmio->isr; in emulate_mmio_read()
2256 d->mmio->isr = 0; in emulate_mmio_read()
2259 bad_driver(d, "read from padding (%#x)", getreg(eip)); in emulate_mmio_read()
2262 if (off > d->mmio_size - 4) in emulate_mmio_read()
2263 bad_driver(d, "read past end (%#x)", getreg(eip)); in emulate_mmio_read()
2277 if (!(d->mmio->cfg.device_status & VIRTIO_CONFIG_S_DRIVER)) in emulate_mmio_read()
2278 bad_driver(d, in emulate_mmio_read()
2298 bad_driver(d, "non-32-bit read to offset %u (%#x)", in emulate_mmio_read()
2300 memcpy(&val, (char *)d->mmio + off, 4); in emulate_mmio_read()
2305 bad_driver(d, "non-16-bit read to offset %u (%#x)", in emulate_mmio_read()
2307 memcpy(&val, (char *)d->mmio + off, 2); in emulate_mmio_read()
2312 bad_driver(d, "non-8-bit read to offset %u (%#x)", in emulate_mmio_read()
2314 memcpy(&val, (char *)d->mmio + off, 1); in emulate_mmio_read()
2321 struct device *d = find_mmio_region(paddr, &off); in emulate_mmio() local
2324 if (!d) { in emulate_mmio()
2339 emulate_mmio_write(d, off, val, mask); in emulate_mmio()
2343 val = emulate_mmio_read(d, off, mask); in emulate_mmio()
2350 emulate_mmio_write(d, off, val, mask); in emulate_mmio()
2354 val = emulate_mmio_read(d, off, mask); in emulate_mmio()