From: Yinghai Lu <yinghai@kernel.org>
To: Bjorn Helgaas <bhelgaas@google.com>,
David Miller <davem@davemloft.net>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Wei Yang <weiyang@linux.vnet.ibm.com>,
Khalid Aziz <khalid.aziz@oracle.com>,
linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
Yinghai Lu <yinghai@kernel.org>
Subject: [PATCH v14 01/17] PCI: Fix proc mmap on sparc
Date: Fri, 16 Sep 2016 13:01:51 -0700 [thread overview]
Message-ID: <20160916200207.21439-2-yinghai@kernel.org> (raw)
In-Reply-To: <20160916200207.21439-1-yinghai@kernel.org>
In 8c05cd08a7 ("PCI: fix offset check for sysfs mmapped files"), try
to check exposed value with resource start/end in proc mmap path.
| start = vma->vm_pgoff;
| size = ((pci_resource_len(pdev, resno) - 1) >> PAGE_SHIFT) + 1;
| pci_start = (mmap_api == PCI_MMAP_PROCFS) ?
| pci_resource_start(pdev, resno) >> PAGE_SHIFT : 0;
| if (start >= pci_start && start < pci_start + size &&
| start + nr <= pci_start + size)
vma->vm_pgoff is above code segment is user/BAR value >> PAGE_SHIFT.
pci_start is resource->start >> PAGE_SHIFT.
For sparc, resource start is different from BAR start aka pci bus address.
pci bus address need to add offset to be the resource start.
So that commit breaks all arch that exposed value is BAR/user value,
and need to be offseted to resource address.
test code using: ./test_mmap_proc /proc/bus/pci/0000:00/04.0 0x2000000
test code segment:
fd = open(argv[1], O_RDONLY);
...
sscanf(argv[2], "0x%lx", &offset);
left = offset & (PAGE_SIZE - 1);
offset &= PAGE_MASK;
ioctl(fd, PCIIOC_MMAP_IS_MEM);
addr = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, fd, offset);
for (i = 0; i < 8; i++)
printf("%x ", addr[i + left]);
munmap(addr, PAGE_SIZE);
close(fd);
Fixes: 8c05cd08a7 ("PCI: fix offset check for sysfs mmapped files")
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
drivers/pci/pci-sysfs.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c
index bcd10c7..e907154 100644
--- a/drivers/pci/pci-sysfs.c
+++ b/drivers/pci/pci-sysfs.c
@@ -974,15 +974,20 @@ void pci_remove_legacy_files(struct pci_bus *b)
int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma,
enum pci_mmap_api mmap_api)
{
- unsigned long nr, start, size, pci_start;
+ unsigned long nr, start, size, pci_start = 0;
if (pci_resource_len(pdev, resno) == 0)
return 0;
nr = vma_pages(vma);
start = vma->vm_pgoff;
size = ((pci_resource_len(pdev, resno) - 1) >> PAGE_SHIFT) + 1;
- pci_start = (mmap_api == PCI_MMAP_PROCFS) ?
- pci_resource_start(pdev, resno) >> PAGE_SHIFT : 0;
+ if (mmap_api == PCI_MMAP_PROCFS) {
+ resource_size_t user_start, user_end;
+
+ pci_resource_to_user(pdev, resno, &pdev->resource[resno],
+ &user_start, &user_end);
+ pci_start = user_start >> PAGE_SHIFT;
+ }
if (start >= pci_start && start < pci_start + size &&
start + nr <= pci_start + size)
return 1;
--
2.8.3
next prev parent reply other threads:[~2016-09-16 20:01 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-16 20:01 [PATCH v14 00/17] PCI: Fixup for 64bit resource with sparc Yinghai Lu
2016-09-16 20:01 ` Yinghai Lu [this message]
2016-09-16 20:01 ` [PATCH v14 02/17] PCI: Let pci_mmap_page_range() take resource address Yinghai Lu
2016-09-16 20:01 ` [PATCH v14 03/17] PCI: Remove __pci_mmap_make_offset() Yinghai Lu
2016-09-16 20:01 ` [PATCH v14 04/17] PCI: Check resource alignment for /sys pci_mmap_resource path Yinghai Lu
2016-09-16 20:01 ` [PATCH v14 05/17] sparc/PCI: Use correct offset for bus address to resource Yinghai Lu
2016-09-16 20:01 ` [PATCH v14 06/17] PCI: Add pci_find_bus_resource() Yinghai Lu
2016-09-16 20:01 ` [PATCH v14 07/17] sparc/PCI: Reserve legacy mmio after PCI mmio Yinghai Lu
2016-09-16 20:01 ` [PATCH v14 08/17] sparc/PCI: Add IORESOURCE_MEM_64 for 64-bit resource in OF parsing Yinghai Lu
2016-09-16 20:01 ` [PATCH v14 09/17] sparc/PCI: Keep resource idx order with bridge register number Yinghai Lu
2016-09-16 20:02 ` [PATCH v14 10/17] powerpc/PCI: " Yinghai Lu
2016-09-16 20:02 ` [PATCH v14 11/17] powerpc/PCI: Add IORESOURCE_MEM_64 for 64-bit resource in OF parsing Yinghai Lu
2016-09-16 20:02 ` [PATCH v14 12/17] OF/PCI: Add IORESOURCE_MEM_64 for 64-bit resource Yinghai Lu
2016-09-16 20:02 ` [PATCH v14 13/17] PCI: Check pref compatible bit for mem64 resource of PCIe device Yinghai Lu
2016-09-16 20:02 ` [PATCH v14 14/17] PCI: Only treat non-pref mmio64 as pref if all bridges have MEM_64 Yinghai Lu
2016-09-16 20:02 ` [PATCH v14 15/17] PCI: Add has_mem64 for struct host_bridge Yinghai Lu
2016-09-16 20:02 ` [PATCH v14 16/17] PCI: Only treat non-pref mmio64 as pref if host bridge has mmio64 Yinghai Lu
2016-09-16 20:02 ` [PATCH v14 17/17] PCI: Restore pref MMIO allocation logic for host bridge without mmio64 Yinghai Lu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160916200207.21439-2-yinghai@kernel.org \
--to=yinghai@kernel.org \
--cc=benh@kernel.crashing.org \
--cc=bhelgaas@google.com \
--cc=davem@davemloft.net \
--cc=khalid.aziz@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=weiyang@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).