| 
    
 [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [RFC PATCH v2 2/2] xen/vpci: header: avoid cast for value passed to vpci_read_val
 The only purpose of this is to give an idea of what it might look like to
introduce a new memory allocation in order to get rid of the casts for the value
passed to vpci_read_val. If this is deemed preferable vs the casts, I will
squash it for the next version of the series.
Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
---
v1->v2:
* new patch
---
 xen/drivers/vpci/header.c | 13 ++++++++++---
 xen/drivers/vpci/vpci.c   |  8 +++++++-
 xen/include/xen/vpci.h    |  3 +++
 3 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c
index ec5947300198..ae269a0b4bbc 100644
--- a/xen/drivers/vpci/header.c
+++ b/xen/drivers/vpci/header.c
@@ -571,14 +571,19 @@ static int cf_check init_bars(struct pci_dev *pdev)
         {
             /* Only expose capabilities to the guest that vPCI can handle. */
             uint8_t next;
-            int ttl = 48;
+            int ttl = 48, i = 0;
+
+            header->caps_list = xzalloc_array(uint8_t, ttl);
+            if ( !header->caps_list )
+                return -ENOMEM;
 
             next = pci_find_next_cap(pdev->sbdf, PCI_CAPABILITY_LIST,
                                      vpci_cap_supported, &ttl);
 
+            header->caps_list[i] = next;
             rc = vpci_add_register(pdev->vpci, vpci_read_val, NULL,
                                    PCI_CAPABILITY_LIST, 1,
-                                   (void *)(uintptr_t)next);
+                                   &header->caps_list[i]);
             if ( rc )
                 return rc;
 
@@ -594,9 +599,11 @@ static int cf_check init_bars(struct pci_dev *pdev)
                 if ( rc )
                     return rc;
 
+                i++;
+                header->caps_list[i] = next;
                 rc = vpci_add_register(pdev->vpci, vpci_read_val, NULL,
                                        pos + PCI_CAP_LIST_NEXT, 1,
-                                       (void *)(uintptr_t)next);
+                                       &header->caps_list[i]);
                 if ( rc )
                     return rc;
 
diff --git a/xen/drivers/vpci/vpci.c b/xen/drivers/vpci/vpci.c
index 4a96aa50494d..717340b8fbe8 100644
--- a/xen/drivers/vpci/vpci.c
+++ b/xen/drivers/vpci/vpci.c
@@ -61,6 +61,7 @@ void vpci_remove_device(struct pci_dev *pdev)
             if ( pdev->vpci->msix->table[i] )
                 iounmap(pdev->vpci->msix->table[i]);
     }
+    xfree(pdev->vpci->header.caps_list);
     xfree(pdev->vpci->msix);
     xfree(pdev->vpci->msi);
     xfree(pdev->vpci);
@@ -136,7 +137,12 @@ static void cf_check vpci_ignored_write(
 uint32_t cf_check vpci_read_val(
     const struct pci_dev *pdev, unsigned int reg, void *data)
 {
-    return (uintptr_t)data;
+    uint8_t *val = data;
+
+    if ( val )
+        return *val;
+
+    return 0;
 }
 
 uint32_t cf_check vpci_hw_read8(
diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h
index 17fd252746ec..7cdee84b5123 100644
--- a/xen/include/xen/vpci.h
+++ b/xen/include/xen/vpci.h
@@ -88,6 +88,9 @@ struct vpci {
         } bars[PCI_HEADER_NORMAL_NR_BARS + 1];
         /* At most 6 BARS + 1 expansion ROM BAR. */
 
+        /* Guest view of capabilities next pointers. */
+        uint8_t *caps_list;
+
         /*
          * Store whether the ROM enable bit is set (doesn't imply ROM BAR
          * is mapped into guest p2m) if there's a ROM BAR on the device.
-- 
2.41.0
 
 
  | 
  
![]()  | 
            
         Lists.xenproject.org is hosted with RackSpace, monitoring our  |