|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 3/8] x86/domain: allocate d->{iomem,irq}_caps before arch-specific initialization
On Thu, Jul 31, 2025 at 10:52:08PM +0300, Grygorii Strashko wrote:
> Hi Denis,
>
> On 31.07.25 22:21, dmkhn@xxxxxxxxx wrote:
> > From: Denis Mukhin <dmukhin@xxxxxxxx>
> >
> > Move IRQ/IOMEM rangesets allocation before arch_domain_create().
> >
> > That guarantees that arch-specific code could access those rangesets to
> > register traps for emulation.
> >
> > It is necessary for those emulators registering trap handlers and ensuring
> > that emulated IRQs are not shared with the physical IRQs.
> >
> > Move dom0_setup_permissions() call right after I/O rangesets are allocated.
> >
> > Move pvh_setup_mmcfg() inside dom0_setup_permissions() close to the place
> > where MMCFG ranges are initialized.
> >
> > Not a functional change.
> >
> > Signed-off-by: Denis Mukhin <dmukhin@xxxxxxxx>
> > ---
> > Chanhes since v3:
> > - new patch
> > ---
> > xen/arch/x86/dom0_build.c | 26 +++++++++++++++++++++++
> > xen/arch/x86/hvm/dom0_build.c | 39 -----------------------------------
> > xen/arch/x86/hvm/hvm.c | 16 ++++++++++++++
> > xen/common/domain.c | 12 +++++------
> > 4 files changed, 48 insertions(+), 45 deletions(-)
> >
> > diff --git a/xen/arch/x86/dom0_build.c b/xen/arch/x86/dom0_build.c
> > index 0b467fd4a4fc..e965f506a3c8 100644
> > --- a/xen/arch/x86/dom0_build.c
> > +++ b/xen/arch/x86/dom0_build.c
> > @@ -471,6 +471,24 @@ static void __init process_dom0_ioports_disable(struct
> > domain *dom0)
> > }
> > }
> >
> > +static void __hwdom_init setup_mmcfg(struct domain *d)
> > +{
> > + unsigned int i;
> > + int rc;
> > +
> > + for ( i = 0; i < pci_mmcfg_config_num; i++ )
> > + {
> > + rc = register_vpci_mmcfg_handler(d, pci_mmcfg_config[i].address,
> > +
> > pci_mmcfg_config[i].start_bus_number,
> > +
> > pci_mmcfg_config[i].end_bus_number,
> > + pci_mmcfg_config[i].pci_segment);
> > + if ( rc )
> > + printk("Unable to setup MMCFG handler at %#lx for segment
> > %u\n",
> > + pci_mmcfg_config[i].address,
> > + pci_mmcfg_config[i].pci_segment);
> > + }
> > +}
> > +
> > int __init dom0_setup_permissions(struct domain *d)
>
> It could be i'm missing smth, but ^ function is __init while ...
>
> > {
> > unsigned long mfn;
> > @@ -480,6 +498,14 @@ int __init dom0_setup_permissions(struct domain *d)
> > if ( pv_shim )
> > return 0;
> >
> > + /*
> > + * MMCFG initialization must be performed before setting domain
> > + * permissions, as the MCFG areas must not be part of the domain IOMEM
> > + * accessible regions.
> > + */
> > + if ( is_hvm_domain(d) )
> > + setup_mmcfg(d);
> > +
> > /* The hardware domain is initially permitted full I/O capabilities.
> > */
> > rc = ioports_permit_access(d, 0, 0xFFFF);
> > rc |= iomem_permit_access(d, 0UL,
> > diff --git a/xen/arch/x86/hvm/dom0_build.c b/xen/arch/x86/hvm/dom0_build.c
> > index 5551f9044836..6f47c9eeeaa6 100644
> > --- a/xen/arch/x86/hvm/dom0_build.c
> > +++ b/xen/arch/x86/hvm/dom0_build.c
> > @@ -1310,24 +1310,6 @@ static int __init pvh_setup_acpi(struct domain *d,
> > paddr_t start_info)
> > return 0;
> > }
> >
> > -static void __hwdom_init pvh_setup_mmcfg(struct domain *d)
> > -{
> > - unsigned int i;
> > - int rc;
> > -
> > - for ( i = 0; i < pci_mmcfg_config_num; i++ )
> > - {
> > - rc = register_vpci_mmcfg_handler(d, pci_mmcfg_config[i].address,
> > -
> > pci_mmcfg_config[i].start_bus_number,
> > -
> > pci_mmcfg_config[i].end_bus_number,
> > - pci_mmcfg_config[i].pci_segment);
> > - if ( rc )
> > - printk("Unable to setup MMCFG handler at %#lx for segment
> > %u\n",
> > - pci_mmcfg_config[i].address,
> > - pci_mmcfg_config[i].pci_segment);
> > - }
> > -}
> > -
> > int __init dom0_construct_pvh(const struct boot_domain *bd)
> > {
> > paddr_t entry, start_info;
> > @@ -1339,27 +1321,6 @@ int __init dom0_construct_pvh(const struct
> > boot_domain *bd)
> > if ( bd->kernel == NULL )
> > panic("Missing kernel boot module for %pd construction\n", d);
> >
> > - if ( is_hardware_domain(d) )
> > - {
> > - /*
> > - * MMCFG initialization must be performed before setting domain
> > - * permissions, as the MCFG areas must not be part of the domain
> > IOMEM
> > - * accessible regions.
> > - */
> > - pvh_setup_mmcfg(d);
> > -
> > - /*
> > - * Setup permissions early so that calls to add MMIO regions to the
> > - * p2m as part of vPCI setup don't fail due to permission checks.
> > - */
> > - rc = dom0_setup_permissions(d);
> > - if ( rc )
> > - {
> > - printk("%pd unable to setup permissions: %d\n", d, rc);
> > - return rc;
> > - }
> > - }
> > -
> > /*
> > * Craft dom0 physical memory map and set the paging allocation. This
> > must
> > * be done before the iommu initializion, since iommu initialization
> > code
> > diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
> > index cb8ecd050d41..b7edb1d6555d 100644
> > --- a/xen/arch/x86/hvm/hvm.c
> > +++ b/xen/arch/x86/hvm/hvm.c
> > @@ -35,6 +35,7 @@
> > #include <asm/hap.h>
> > #include <asm/current.h>
> > #include <asm/debugreg.h>
> > +#include <asm/dom0_build.h>
> > #include <asm/e820.h>
> > #include <asm/regs.h>
> > #include <asm/cpufeature.h>
> > @@ -651,6 +652,17 @@ int hvm_domain_initialise(struct domain *d,
> > goto fail1;
> > }
> > memset(d->arch.hvm.io_bitmap, ~0, HVM_IOBITMAP_SIZE);
> > +
> > + /*
> > + * Setup permissions early so that calls to add MMIO regions to the
> > + * p2m as part of vPCI setup don't fail due to permission checks.
> > + */
> > + rc = dom0_setup_permissions(d);
>
> ... here hvm_domain_initialise() is not __init?
No, you're right, I missed this, thanks!
Good catch!
>
> [...]
>
>
> --
> Best regards,
> -grygorii
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |