From patchwork Fri Oct 24 16:28:05 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Pieralisi X-Patchwork-Id: 39485 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ee0-f71.google.com (mail-ee0-f71.google.com [74.125.83.71]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id CF57120341 for ; Fri, 24 Oct 2014 16:28:34 +0000 (UTC) Received: by mail-ee0-f71.google.com with SMTP id e51sf373153eek.6 for ; Fri, 24 Oct 2014 09:28:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe; bh=lGseDUGKeROZ9MSjXVQM86W1EmTqR1qeYDkOmlBYDpU=; b=ZA+c7aY+rxSKPj/1u0C0gtciLdxQNA9SshKNF6kYh/CKDN9aUBA/hQIq2ryfjKyhky NLi/vOUCWrokeoEoAVPmFrYDmfqjqyUQszlp3AcSnXtQ08mCWdX2nxdWAfWfAGhWqd1l T6DRDzwRdV2LfpoVqvbB8r6Hgk5e10/HYs6yi8sJVNN0Jl/Bw6uV2GerUgjRDYHcN9CT IQtgKqbpyQ2eAeOvgf1tpll0MYSskWRhujpPosLb3BAZc7kWuC4U8rdIDFw3u+jBM7oo A8DOnDNHY5FhZotrXZqp54mgZ3oH1VDRV9Z8dyR0lc4K+wiJ2pdTeZKw/ATaFqJUboLi 8MOQ== X-Gm-Message-State: ALoCoQlrHMt6P70EIe+y7leZo2NNuD/BRUTC2QLoRu+Jp2qh1T9utI5EJloe6XEO8HxaHHv2AdJJ X-Received: by 10.180.36.176 with SMTP id r16mr1025370wij.7.1414168113951; Fri, 24 Oct 2014 09:28:33 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.10.2 with SMTP id e2ls414312lab.88.gmail; Fri, 24 Oct 2014 09:28:33 -0700 (PDT) X-Received: by 10.152.115.131 with SMTP id jo3mr5708757lab.20.1414168113757; Fri, 24 Oct 2014 09:28:33 -0700 (PDT) Received: from mail-lb0-f180.google.com (mail-lb0-f180.google.com. [209.85.217.180]) by mx.google.com with ESMTPS id lv8si7816833lac.4.2014.10.24.09.28.33 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 24 Oct 2014 09:28:33 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.180 as permitted sender) client-ip=209.85.217.180; Received: by mail-lb0-f180.google.com with SMTP id n15so2886429lbi.11 for ; Fri, 24 Oct 2014 09:28:33 -0700 (PDT) X-Received: by 10.152.5.38 with SMTP id p6mr5646938lap.44.1414168113525; Fri, 24 Oct 2014 09:28:33 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.84.229 with SMTP id c5csp463224lbz; Fri, 24 Oct 2014 09:28:32 -0700 (PDT) X-Received: by 10.70.51.195 with SMTP id m3mr5616225pdo.27.1414168111773; Fri, 24 Oct 2014 09:28:31 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id kj11si4460584pbd.5.2014.10.24.09.28.31 for ; Fri, 24 Oct 2014 09:28:31 -0700 (PDT) Received-SPF: none (google.com: linux-kernel-owner@vger.kernel.org does not designate permitted sender hosts) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756804AbaJXQ22 (ORCPT + 26 others); Fri, 24 Oct 2014 12:28:28 -0400 Received: from foss-mx-na.foss.arm.com ([217.140.108.86]:48378 "EHLO foss-mx-na.foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752680AbaJXQ20 (ORCPT ); Fri, 24 Oct 2014 12:28:26 -0400 Received: from foss-smtp-na-1.foss.arm.com (unknown [10.80.61.8]) by foss-mx-na.foss.arm.com (Postfix) with ESMTP id E4F16F5; Fri, 24 Oct 2014 11:28:22 -0500 (CDT) Received: from collaborate-mta1.arm.com (highbank-bc01-b06.austin.arm.com [10.112.81.134]) by foss-smtp-na-1.foss.arm.com (Postfix) with ESMTP id 9F2525FAD8; Fri, 24 Oct 2014 11:28:20 -0500 (CDT) Received: from red-moon.cambridge.arm.com (red-moon.cambridge.arm.com [10.1.203.32]) by collaborate-mta1.arm.com (Postfix) with ESMTP id 2123413F61D; Fri, 24 Oct 2014 11:28:19 -0500 (CDT) From: Lorenzo Pieralisi To: linux-kernel@vger.kernel.org Cc: Lorenzo Pieralisi , Arnd Bergmann , Bjorn Helgaas , Benjamin Herrenschmidt , Russell King , "David S. Miller" , Michal Simek , Martin Wilck , Linux PCI Subject: [PATCH RFC v2 1/2] drivers: pci: fix pci_mmap_fits() implementation for procfs mmap Date: Fri, 24 Oct 2014 17:28:05 +0100 Message-Id: <1414168089-8130-2-git-send-email-lorenzo.pieralisi@arm.com> X-Mailer: git-send-email 2.1.2 In-Reply-To: <1414168089-8130-1-git-send-email-lorenzo.pieralisi@arm.com> References: <1414168089-8130-1-git-send-email-lorenzo.pieralisi@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: lorenzo.pieralisi@arm.com X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.180 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , The addresses stored in PCI device resources for memory spaces correspond to CPU physical addresses, which do not necessarily map 1:1 to PCI bus addresses as programmed in PCI devices configuration spaces. Therefore, the changes applied by commits: 8c05cd08a7504b855c26526 3b519e4ea618b6943a82931 imply that the sanity checks carried out in pci_mmap_fits() to ensure that the user executes an mmap of a "real" pci resource are erroneous when executed through procfs. Some platforms (ie SPARC) expect the offset value to be passed in (procfs mapping) to be the PCI BAR configuration value as read from the PCI device configuration space, not the fixed-up CPU physical address that is present in PCI device resources. The required pgoff (offset in mmap syscall) value passed from userspace is supposed to represent the resource value exported through /proc/bus/pci/devices when the resource is mmapped though procfs (and 0 when the mapping is carried out through sysfs resource files), which corresponds to the PCI resource filtered through the pci_resource_to_user() API. This patch converts the PCI resource to the expected "user visible" value through pci_resource_to_user() before carrying out sanity checks in pci_mmap_fits() so that the check is carried out on the resource values as expected from the userspace mmap API. Cc: Arnd Bergmann Cc: Bjorn Helgaas Cc: Benjamin Herrenschmidt Cc: Russell King Cc: David S. Miller Cc: Michal Simek Cc: Martin Wilck Signed-off-by: Lorenzo Pieralisi --- drivers/pci/pci-sysfs.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 92b6d9a..777d8bc 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -963,17 +963,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_offset; + resource_size_t pci_start, pci_end; if (pci_resource_len(pdev, resno) == 0) return 0; nr = vma_pages(vma); start = vma->vm_pgoff; + pci_resource_to_user(pdev, resno, &pdev->resource[resno], + &pci_start, &pci_end); 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) + pci_offset = (mmap_api == PCI_MMAP_PROCFS) ? + pci_start >> PAGE_SHIFT : 0; + if (start >= pci_offset && start < pci_offset + size && + start + nr <= pci_offset + size) return 1; return 0; }