From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id 9A5122C39; Sun, 7 May 2017 15:34:59 +0200 (CEST) Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 07 May 2017 06:34:58 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.38,304,1491289200"; d="scan'208";a="98386354" Received: from unknown (HELO localhost.localdomain) ([10.239.129.160]) by fmsmga005.fm.intel.com with ESMTP; 07 May 2017 06:34:57 -0700 From: Tiwei Bie To: dev@dpdk.org Cc: bruce.richardson@intel.com, stable@dpdk.org Date: Sun, 7 May 2017 13:33:34 +0000 Message-Id: <20170507133334.16219-3-tiwei.bie@intel.com> X-Mailer: git-send-email 2.12.1 In-Reply-To: <20170507133334.16219-1-tiwei.bie@intel.com> References: <20170507133334.16219-1-tiwei.bie@intel.com> Subject: [dpdk-stable] [PATCH 2/2] eal/bsd: fix the read operation on PCI configuration space X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 07 May 2017 13:35:00 -0000 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 --- 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 59ceb7665..e321461d8 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.12.1