From f94c5c9648cd32a90448afa87ef81ab07fb26a42 Mon Sep 17 00:00:00 2001 From: Tiwei Bie Date: Sun, 7 May 2017 13:33:34 +0000 Subject: [PATCH] eal/bsd: fix read on PCI configuration space Some drivers (such as virtio) may need to read more than 4 bytes data from PCI configuration space via rte_eal_pci_read_config(). But it will return with an error on FreeBSD when the expected data length is bigger than the size of pi.pi_data whose type is u_int32_t. This patch removes this limitation. Fixes: 632b2d1deeed ("eal: provide functions to access PCI config") Cc: stable@dpdk.org Signed-off-by: Tiwei Bie Acked-by: Bruce Richardson --- lib/librte_eal/bsdapp/eal/eal_pci.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c b/lib/librte_eal/bsdapp/eal/eal_pci.c index 59ceb76650..e321461d82 100644 --- a/lib/librte_eal/bsdapp/eal/eal_pci.c +++ b/lib/librte_eal/bsdapp/eal/eal_pci.c @@ -459,6 +459,7 @@ int rte_pci_read_config(const struct rte_pci_device *dev, void *buf, size_t len, off_t offset) { int fd = -1; + int size; struct pci_io pi = { .pi_sel = { .pc_domain = dev->addr.domain, @@ -467,25 +468,28 @@ int rte_pci_read_config(const struct rte_pci_device *dev, .pc_func = dev->addr.function, }, .pi_reg = offset, - .pi_width = len, }; - if (len == 3 || len > sizeof(pi.pi_data)) { - RTE_LOG(ERR, EAL, "%s(): invalid pci read length\n", __func__); - goto error; - } - fd = open("/dev/pci", O_RDWR); if (fd < 0) { RTE_LOG(ERR, EAL, "%s(): error opening /dev/pci\n", __func__); goto error; } - if (ioctl(fd, PCIOCREAD, &pi) < 0) - goto error; + while (len > 0) { + size = (len >= 4) ? 4 : ((len >= 2) ? 2 : 1); + pi.pi_width = size; + + if (ioctl(fd, PCIOCREAD, &pi) < 0) + goto error; + memcpy(buf, &pi.pi_data, size); + + buf = (char *)buf + size; + pi.pi_reg += size; + len -= size; + } close(fd); - memcpy(buf, &pi.pi_data, len); return 0; error: -- 2.20.1