[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 |