mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-19 21:21:09 +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:
parent
c1ae3cfa0e
commit
6bccc7f426
1 changed files with 7 additions and 3 deletions
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue