mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
PCI: Fix pci_mmap_fits() for HAVE_PCI_RESOURCE_TO_USER platforms
In the PCI_MMAP_PROCFS case when the address being passed by the user is a 'user visible' resource address based on the bus window, and not the actual contents of the resource, that's what we need to be checking it against. Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Cc: stable@vger.kernel.org
This commit is contained in:
committed by
Bjorn Helgaas
parent
c1ae3cfa0e
commit
6bccc7f426
@@ -985,15 +985,19 @@ void pci_remove_legacy_files(struct pci_bus *b)
|
|||||||
int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma,
|
int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma,
|
||||||
enum pci_mmap_api mmap_api)
|
enum pci_mmap_api mmap_api)
|
||||||
{
|
{
|
||||||
unsigned long nr, start, size, pci_start;
|
unsigned long nr, start, size;
|
||||||
|
resource_size_t pci_start = 0, pci_end;
|
||||||
|
|
||||||
if (pci_resource_len(pdev, resno) == 0)
|
if (pci_resource_len(pdev, resno) == 0)
|
||||||
return 0;
|
return 0;
|
||||||
nr = vma_pages(vma);
|
nr = vma_pages(vma);
|
||||||
start = vma->vm_pgoff;
|
start = vma->vm_pgoff;
|
||||||
size = ((pci_resource_len(pdev, resno) - 1) >> PAGE_SHIFT) + 1;
|
size = ((pci_resource_len(pdev, resno) - 1) >> PAGE_SHIFT) + 1;
|
||||||
pci_start = (mmap_api == PCI_MMAP_PROCFS) ?
|
if (mmap_api == PCI_MMAP_PROCFS) {
|
||||||
pci_resource_start(pdev, resno) >> PAGE_SHIFT : 0;
|
pci_resource_to_user(pdev, resno, &pdev->resource[resno],
|
||||||
|
&pci_start, &pci_end);
|
||||||
|
pci_start >>= PAGE_SHIFT;
|
||||||
|
}
|
||||||
if (start >= pci_start && start < pci_start + size &&
|
if (start >= pci_start && start < pci_start + size &&
|
||||||
start + nr <= pci_start + size)
|
start + nr <= pci_start + size)
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user