Message ID | 20231012220854.2736994-17-volodymyr_babchuk@epam.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | PCI devices passthrough on Arm, part 3 | expand |
On 13.10.2023 00:09, Volodymyr Babchuk wrote: > --- a/xen/common/domain.c > +++ b/xen/common/domain.c > @@ -695,6 +695,9 @@ struct domain *domain_create(domid_t domid, > radix_tree_init(&d->pirq_tree); > } > > + if ( !is_idle_domain(d) ) > + d->iomem_caps = rangeset_new(d, "I/O Memory", RANGESETF_prettyprint_hex); > + > if ( (err = arch_domain_create(d, config, flags)) != 0 ) > goto fail; > init_status |= INIT_arch; > @@ -704,7 +707,6 @@ struct domain *domain_create(domid_t domid, > watchdog_domain_init(d); > init_status |= INIT_watchdog; > > - d->iomem_caps = rangeset_new(d, "I/O Memory", RANGESETF_prettyprint_hex); > d->irq_caps = rangeset_new(d, "Interrupts", 0); > if ( !d->iomem_caps || !d->irq_caps ) > goto fail; It's not really logical to move one, not both. Plus you didn't move the error check, so if the earlier initialization is really needed, you set things up for a NULL deref. Jan
On 10/16/23 07:00, Jan Beulich wrote: > On 13.10.2023 00:09, Volodymyr Babchuk wrote: >> --- a/xen/common/domain.c >> +++ b/xen/common/domain.c >> @@ -695,6 +695,9 @@ struct domain *domain_create(domid_t domid, >> radix_tree_init(&d->pirq_tree); >> } >> >> + if ( !is_idle_domain(d) ) >> + d->iomem_caps = rangeset_new(d, "I/O Memory", RANGESETF_prettyprint_hex); >> + >> if ( (err = arch_domain_create(d, config, flags)) != 0 ) >> goto fail; >> init_status |= INIT_arch; >> @@ -704,7 +707,6 @@ struct domain *domain_create(domid_t domid, >> watchdog_domain_init(d); >> init_status |= INIT_watchdog; >> >> - d->iomem_caps = rangeset_new(d, "I/O Memory", RANGESETF_prettyprint_hex); >> d->irq_caps = rangeset_new(d, "Interrupts", 0); >> if ( !d->iomem_caps || !d->irq_caps ) >> goto fail; > > It's not really logical to move one, not both. Plus you didn't move the > error check, so if the earlier initialization is really needed, you set > things up for a NULL deref. > > Jan Good catch, I'll move both along with the error check (and I'll coordinate the update with Volodymyr). Thanks.
diff --git a/xen/arch/arm/vpci.c b/xen/arch/arm/vpci.c index 01b50d435e..3521d5bc2f 100644 --- a/xen/arch/arm/vpci.c +++ b/xen/arch/arm/vpci.c @@ -2,6 +2,7 @@ /* * xen/arch/arm/vpci.c */ +#include <xen/iocap.h> #include <xen/sched.h> #include <xen/vpci.h> @@ -119,8 +120,16 @@ int domain_vpci_init(struct domain *d) return ret; } else + { register_mmio_handler(d, &vpci_mmio_handler, GUEST_VPCI_ECAM_BASE, GUEST_VPCI_ECAM_SIZE, NULL); + iomem_permit_access(d, paddr_to_pfn(GUEST_VPCI_MEM_ADDR), + paddr_to_pfn(GUEST_VPCI_MEM_ADDR + + GUEST_VPCI_MEM_SIZE - 1)); + iomem_permit_access(d, paddr_to_pfn(GUEST_VPCI_PREFETCH_MEM_ADDR), + paddr_to_pfn(GUEST_VPCI_PREFETCH_MEM_ADDR + + GUEST_VPCI_PREFETCH_MEM_SIZE - 1)); + } return 0; } diff --git a/xen/common/domain.c b/xen/common/domain.c index 785c69e48b..bf63fab29b 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -695,6 +695,9 @@ struct domain *domain_create(domid_t domid, radix_tree_init(&d->pirq_tree); } + if ( !is_idle_domain(d) ) + d->iomem_caps = rangeset_new(d, "I/O Memory", RANGESETF_prettyprint_hex); + if ( (err = arch_domain_create(d, config, flags)) != 0 ) goto fail; init_status |= INIT_arch; @@ -704,7 +707,6 @@ struct domain *domain_create(domid_t domid, watchdog_domain_init(d); init_status |= INIT_watchdog; - d->iomem_caps = rangeset_new(d, "I/O Memory", RANGESETF_prettyprint_hex); d->irq_caps = rangeset_new(d, "Interrupts", 0); if ( !d->iomem_caps || !d->irq_caps ) goto fail;