[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v2] xen/arm: pci: fix check in pci_check_bar()


  • To: <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
  • Date: Tue, 11 Jul 2023 15:28:28 -0400
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=G4fZ5AYV++e461XBJf/ibPXTzm5SJu83StErzueTYbM=; b=DYu4Xajj7NjdjE0DqUZl3Rx8oke0H3d4kT2isYQ9ixgBKe1mcz4n61l1h5o9D0JUTL3Gdz7/xO3p/hkOgrbgOwywxLMUZhwQ3fhyqoAI+qMyMZyFH+qJQFryxCb3kxflEtTF2OsJNvJ0KeHODsx6fVju90ORueg3Rdy12FuAy41IEIVZlwRwGF34Cv40jfJXWAY4EPLqPIJs+GydS3LVnYaiYGrLOADsFwied/rUganhLmebxbNycOVuyLEKuIsZcEhwHIuG3YlEpGUrKou5yygntbbLfwK6hFe8rGGKoeUSkKj0x6Y4aQcxVYNd3GRz9UcMnaglPT9aX3i2/ILU3A==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=SkYnv/mXBIjl1mroWrqDwgdcI8y7DFzhHNuQC7eacmDiXiwCJeawdqGC4dwlmK7DQDawG74a8T+/8V0We6KdYCzgtXQG0sMZZSrHVUAFKdrwoSr7ry2JqucHg1CGCp5aBkUgWQm4fO8E1sTiZU7UUnEvEYH9l0AxaSRW0v/uvTpa2wRBR6CJ+rI+/zSRmu46PreLzEOBVig/jvwBOJu+kHMJgH0eO4P+0B/M0w5TkcjHCfN+Mps8xS33ELLr6hr7O7Fss9oHFDwhg8x0cdgZ5obSyktCiOH0OXAwGFgFcfiF/+002Jv41wRmC/y1vEpRvC7KaL3GjSPl2FGMNNRLuw==
  • Cc: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>, Rahul Singh <rahul.singh@xxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Delivery-date: Tue, 11 Jul 2023 19:29:40 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

When mapping BARs for vPCI, it's valid for a BAR start address to equal the BAR
end address (i.e. s == e) since e is inclusive. However, pci_check_bar()
currently returns false in this case, which results in Xen not mapping the BAR.
In this example boot log, Linux has mapped the BARs, but since Xen did not map
them, Linux encounters a data abort and panics:

[    2.593300] pci 0000:00:00.0: BAR 0: assigned [mem 0x50008000-0x50008fff]
[    2.593682] pci 0000:00:00.0: BAR 2: assigned [mem 0x50009000-0x50009fff]
[    2.594066] pci 0000:00:00.0: BAR 4: assigned [mem 0x5000a000-0x5000afff]
...
[    2.810502] virtio-pci 0000:00:00.0: enabling device (0000 -> 0002)
(XEN) 0000:00:00.0: not mapping BAR [50008, 50008] invalid position
(XEN) 0000:00:00.0: not mapping BAR [50009, 50009] invalid position
(XEN) 0000:00:00.0: not mapping BAR [5000a, 5000a] invalid position
[    2.817502] virtio-pci 0000:00:00.0: virtio_pci: leaving for legacy driver
[    2.817853] virtio-pci 0000:00:00.0: enabling bus mastering
(XEN) arch/arm/traps.c:1992:d0v0 HSR=0x00000093010045 pc=0xffff8000089507d4 
gva=0xffff80000c46d012 gpa=0x00000050008012
[    2.818397] Unable to handle kernel ttbr address size fault at virtual 
address ffff80000c46d012
...

Since e is inclusive, drop the equality check.

Also, adjust e to include the whole page. This increases the accuracy of the
subsequent is_bar_valid check.

Fixes: cc80e2bab0d0 ("xen/pci: replace call to is_memory_hole to pci_check_bar")
Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
---
v1->v2:
* adjust e to include full page (e is still inclusive)
* add comment at the top of the function to document that end is inclusive
---
 xen/arch/arm/pci/pci-host-common.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/xen/arch/arm/pci/pci-host-common.c 
b/xen/arch/arm/pci/pci-host-common.c
index 7cdfc89e5211..c0faf0f43675 100644
--- a/xen/arch/arm/pci/pci-host-common.c
+++ b/xen/arch/arm/pci/pci-host-common.c
@@ -393,20 +393,24 @@ static int is_bar_valid(const struct dt_device_node *dev,
     return 0;
 }
 
-/* TODO: Revisit this function when ACPI PCI passthrough support is added. */
+/*
+ * The MFN range [start, end] is inclusive.
+ *
+ * TODO: Revisit this function when ACPI PCI passthrough support is added.
+ */
 bool pci_check_bar(const struct pci_dev *pdev, mfn_t start, mfn_t end)
 {
     int ret;
     const struct dt_device_node *dt_node;
     paddr_t s = mfn_to_maddr(start);
-    paddr_t e = mfn_to_maddr(end);
+    paddr_t e = mfn_to_maddr(mfn_add(end, 1)) - 1; /* inclusive */
     struct pdev_bar_check bar_data =  {
         .start = s,
         .end = e,
         .is_valid = false
     };
 
-    if ( s >= e )
+    if ( s > e )
         return false;
 
     dt_node = pci_find_host_bridge_node(pdev);

base-commit: b831326ee2f9ed94523b3d8b0fb2da2a82113e9e
-- 
2.41.0




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.