|
@@ -252,11 +252,20 @@ static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma)
|
|
const struct proc_dir_entry *dp = PDE(inode);
|
|
const struct proc_dir_entry *dp = PDE(inode);
|
|
struct pci_dev *dev = dp->data;
|
|
struct pci_dev *dev = dp->data;
|
|
struct pci_filp_private *fpriv = file->private_data;
|
|
struct pci_filp_private *fpriv = file->private_data;
|
|
- int ret;
|
|
|
|
|
|
+ int i, ret;
|
|
|
|
|
|
if (!capable(CAP_SYS_RAWIO))
|
|
if (!capable(CAP_SYS_RAWIO))
|
|
return -EPERM;
|
|
return -EPERM;
|
|
|
|
|
|
|
|
+ /* Make sure the caller is mapping a real resource for this device */
|
|
|
|
+ for (i = 0; i < PCI_ROM_RESOURCE; i++) {
|
|
|
|
+ if (pci_mmap_fits(dev, i, vma))
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (i >= PCI_ROM_RESOURCE)
|
|
|
|
+ return -ENODEV;
|
|
|
|
+
|
|
ret = pci_mmap_page_range(dev, vma,
|
|
ret = pci_mmap_page_range(dev, vma,
|
|
fpriv->mmap_state,
|
|
fpriv->mmap_state,
|
|
fpriv->write_combine);
|
|
fpriv->write_combine);
|