From: dmkhn@proton.me
To: Grygorii Strashko <grygorii_strashko@epam.com>,
xen-devel@lists.xenproject.org
Subject: Re: [PATCH v4 3/8] x86/domain: allocate d->{iomem,irq}_caps before arch-specific initialization
Date: Fri, 01 Aug 2025 02:57:01 +0000 [thread overview]
Message-ID: <aIws+i2V3UIkzXR3@kraken> (raw)
In-Reply-To: <aIvQQX6IqHfyHsyW@kraken>
On Thu, Jul 31, 2025 at 08:21:24PM +0000, dmkhn@proton.me wrote:
> On Thu, Jul 31, 2025 at 10:52:08PM +0300, Grygorii Strashko wrote:
> > Hi Denis,
> >
> > On 31.07.25 22:21, dmkhn@proton.me wrote:
> > > From: Denis Mukhin <dmukhin@ford.com>
> > >
> > > 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@ford.com>
> > > ---
> > > 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!
So addressing it will require some code movement, like
dom0_setup_permissions() outside of arch/x86/dom0_build.c...
>
> >
> > [...]
> >
> >
> > --
> > Best regards,
> > -grygorii
> >
>
>
next prev parent reply other threads:[~2025-08-01 2:57 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-31 19:21 [PATCH v4 0/8] x86: introduce NS16550-compatible UART emulator dmkhn
2025-07-31 19:21 ` [PATCH v4 1/8] xen/domain: introduce common emulation flags dmkhn
2025-08-04 9:46 ` Jan Beulich
2025-08-05 0:54 ` dmkhn
2025-08-06 13:56 ` Roger Pau Monné
2025-08-07 17:54 ` dmkhn
2025-08-07 14:28 ` Oleksii Kurochko
2025-08-07 17:43 ` dmkhn
2025-07-31 19:21 ` [PATCH v4 2/8] emul/vuart: introduce framework for UART emulators dmkhn
2025-08-01 0:08 ` Stefano Stabellini
2025-08-01 2:54 ` dmkhn
2025-08-04 10:11 ` Jan Beulich
2025-08-09 18:55 ` dmkhn
2025-08-11 7:34 ` Jan Beulich
2025-08-11 23:55 ` dmkhn
2025-08-12 6:52 ` Jan Beulich
2025-08-14 6:32 ` dmkhn
2025-08-06 14:24 ` Roger Pau Monné
2025-08-07 19:12 ` dmkhn
2025-07-31 19:21 ` [PATCH v4 3/8] x86/domain: allocate d->{iomem,irq}_caps before arch-specific initialization dmkhn
2025-07-31 19:52 ` Grygorii Strashko
2025-07-31 20:21 ` dmkhn
2025-08-01 2:57 ` dmkhn [this message]
2025-07-31 23:20 ` Stefano Stabellini
2025-08-04 10:20 ` Jan Beulich
2025-08-07 18:59 ` dmkhn
2025-08-06 14:37 ` Roger Pau Monné
2025-08-07 18:57 ` dmkhn
2025-07-31 19:22 ` [PATCH v4 4/8] xen/8250-uart: update definitions dmkhn
2025-07-31 23:23 ` Stefano Stabellini
2025-08-04 10:23 ` Jan Beulich
2025-08-07 19:41 ` dmkhn
2025-07-31 19:22 ` [PATCH v4 5/8] emul/vuart-ns16550: introduce NS16550-compatible UART emulator (x86) dmkhn
2025-07-31 23:57 ` Stefano Stabellini
2025-08-01 3:28 ` dmkhn
2025-08-04 10:53 ` Jan Beulich
2025-08-09 18:37 ` dmkhn
2025-08-11 7:39 ` Jan Beulich
2025-08-12 0:06 ` dmkhn
2025-08-06 15:06 ` Roger Pau Monné
2025-08-06 17:24 ` Roger Pau Monné
2025-08-07 18:49 ` dmkhn
2025-07-31 19:22 ` [PATCH v4 6/8] tools/xl: enable NS16550-compatible UART emulator for HVM (x86) dmkhn
2025-08-04 10:54 ` Jan Beulich
2025-08-06 15:21 ` Roger Pau Monné
2025-08-25 14:49 ` Anthony PERARD
2025-08-25 15:03 ` Jan Beulich
2025-08-25 15:13 ` Anthony PERARD
2025-08-25 15:27 ` Jan Beulich
2025-08-25 15:39 ` Anthony PERARD
2025-08-25 15:45 ` Jan Beulich
2025-08-26 9:26 ` dmkhn
2025-07-31 19:22 ` [PATCH v4 7/8] tools/xl: enable NS16550-compatible UART emulator for PVH (x86) dmkhn
2025-08-01 0:46 ` Stefano Stabellini
2025-08-01 1:53 ` dmkhn
2025-08-04 11:06 ` Jan Beulich
2025-08-07 19:38 ` dmkhn
2025-07-31 19:22 ` [PATCH v4 8/8] emul/vuart: introduce console forwarding enforcement via vUART dmkhn
2025-08-01 0:10 ` Stefano Stabellini
2025-08-01 1:51 ` dmkhn
2025-08-06 13:48 ` [PATCH v4 0/8] x86: introduce NS16550-compatible UART emulator Roger Pau Monné
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aIws+i2V3UIkzXR3@kraken \
--to=dmkhn@proton.me \
--cc=grygorii_strashko@epam.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.