[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] xen/x86: Check supported features even for PHV dom0


  • To: Frediano Ziglio <freddy77@xxxxxxxxx>
  • From: Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Date: Thu, 26 Mar 2026 20:53:16 +0100
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=2amyyJKzVNrwfOjO9KDSBbBLdfcMa3o2+yjMt/+W8lw=; b=lpArVPrZKzxWnD3BJ7papyXdjvGXVLFO6v17KsEHVpUxitNDcprC1HS3QWHsPtToU5USe+IoKhkyk0fxj9ljNLHUa/4vLvSBfRak+H+V+0rqEirmHbV+1N+2D7YSQNnlqhAqAZ5VGzRSoKKAqVGMmLT9zr/UcAX4n+XesyVv+QFzbvVrx2Fl8PlosaNX7P9MnXv1/PLP8A+Q1O1NedRJUNOr6GIZXAtlD5NWFXgNLwSMQ71L9LVlvCOIAgpxOzT8vX+/e+ziCh+Gmf3pYOY3TWybeHzwM0j1fuVANLcM7E0I8Qu8oAT5y8xp4dRzKMTxLR9y5hysgY6jJzdAL1tcIw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=myWduz52BppqMCZw+byz23OGtj91oWzOwE1HmwLKOnl29Eabcl1SHQWCoYX+sQY3jGF88kjBGAdiA3BvMY8si2ywRPerpAt8dRg2QnBmnktSGeHGiDqjqmyhNY3UkXvEjNEIWBP/q2nsnWOz9AUOJecZBq0XatPgYFYpWAivVHTaGc1bRoLxvpkRTjprmt0uekQtRPU6wNsKSs9JrQafp1YtEiM9jYcZ6Lud/4gDkD2MIWt7iYda2pbkuktKAGT7UGJrpsuOm7t6mDB6arura+7ON0Hil3JLWlDdRZvHOFYYeF7FiFSIM9e1LBFLYQ7j3I+CuG1g0vAcWFqeoNfdNQ==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=citrix.com header.i="@citrix.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Cc: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Jan Beulich <jbeulich@xxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
  • Delivery-date: Thu, 26 Mar 2026 19:53:31 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On Thu, Mar 26, 2026 at 07:14:45PM +0000, Frediano Ziglio wrote:
> On Thu, 26 Mar 2026 at 09:59, Roger Pau Monné <roger.pau@xxxxxxxxxx> wrote:
> >
> > Typo on the subject s/PHV/PVH/.
> >
> 
> Fixed.
> 
> > On Wed, Mar 25, 2026 at 03:55:28PM +0000, Frediano Ziglio wrote:
> > > The supported features ELF note was tested only if the dom0 was
> > > PV. Factor out a function to check ELF notes and reuse it even
> > > for PVH.
> > >
> > > Signed-off-by: Frediano Ziglio <frediano.ziglio@xxxxxxxxxx>
> > > ---
> > >  xen/arch/x86/dom0_build.c             | 16 ++++++++++++++++
> > >  xen/arch/x86/hvm/dom0_build.c         |  3 +++
> > >  xen/arch/x86/include/asm/dom0_build.h |  2 ++
> > >  xen/arch/x86/pv/dom0_build.c          | 10 ++--------
> > >  4 files changed, 23 insertions(+), 8 deletions(-)
> > >
> > > diff --git a/xen/arch/x86/dom0_build.c b/xen/arch/x86/dom0_build.c
> > > index 864dd9e53e..c6bb2f8067 100644
> > > --- a/xen/arch/x86/dom0_build.c
> > > +++ b/xen/arch/x86/dom0_build.c
> > > @@ -321,6 +321,22 @@ unsigned long __init dom0_paging_pages(const
> > > struct domain *d,
> > >  }
> > >
> > >
> > > +int __init dom0_check_parms(
> > > +    const struct elf_dom_parms *parms, bool is_pv_shim)
> > > +{
> > > +    if ( parms->elf_notes[XEN_ELFNOTE_SUPPORTED_FEATURES].type !=
> > > XEN_ENT_NONE )
> >
> > The patch seems to be mangled here?
> >
> 
> email client, sorry about it.
> 
> > And the line is too long otherwise.  You might want to consider
> > returning early here, to reduce the indentation of the following code
> > block.
> >
> 
> The line is actually exactly 80 characters, so it fits.

Sorry, I didn't count correctly it seems then.

> What about combining the 2 ifs instead ? In this case I would probably
> need to split the line.

I wouldn't combine, in case more XENFEAT_* needs to be tested in the
future (I doubt, but you never know).

> 
> > > +    {
> > > +        if ( !is_pv_shim && !test_bit(XENFEAT_dom0, parms->f_supported) )
> >
> > I think you want to pass the domain being built to this function, so
> > you can do a check like:
> >
> > if ( is_hardware_domain(d) && !test_bit(XENFEAT_dom0, parms->f_supported) )
> > {
> >     printk(...
> >
> > That way you don't need to explicitly check for pv-shim mode, and
> > would more naturally work with things like
> > Hyperlaunch/dom0less/late-hwdom.
> >
> 
> It's not clear why. Are you saying that dom0 could be a no-hardware domain?
> Wouldn't that change introduce a regression?

TBH it's unclear to me what capabilities does XENFEAT_dom0 signal.  I
assume it's the ability of a PV kernel to boot as the hardware domain,
which is slightly different from a normal PV domain.

AFAIK dom0 could be a control domain only, and delegate the
hardware management to a hardware domain.  Whether the current code
can really do so I have no idea, as I've never tested it.

I don't think the proposed change introduces a regression.  It
limits the XENFEAT_dom0 checking to it's intended domain type (if my
understanding of XENFEAT_dom0 is correct).

> > > +        {
> > > +            printk("Kernel does not support Dom0 operation\n");
> > > +            return -EINVAL;
> > > +        }
> > > +    }
> > > +
> > > +    return 0;
> > > +}
> > > +
> > > +
> > >  /*
> > >   * If allocation isn't specified, reserve 1/16th of available memory for
> > >   * things like DMA buffers. This reservation is clamped to a maximum of 
> > > 128MB.
> > > diff --git a/xen/arch/x86/hvm/dom0_build.c b/xen/arch/x86/hvm/dom0_build.c
> > > index d69a83b089..ca96f32acd 100644
> > > --- a/xen/arch/x86/hvm/dom0_build.c
> > > +++ b/xen/arch/x86/hvm/dom0_build.c
> > > @@ -699,6 +699,9 @@ static int __init pvh_load_kernel(
> > >      if ( !check_and_adjust_load_address(d, &elf, &parms) )
> > >          return -ENOSPC;
> > >
> > > +    if ( (rc = dom0_check_parms(&parms, false)) != 0 )
> > > +        return rc;
> > > +
> > >      elf_set_vcpu(&elf, v);
> > >      rc = elf_load_binary(&elf);
> > >      if ( rc < 0 )
> > > diff --git a/xen/arch/x86/include/asm/dom0_build.h
> > > b/xen/arch/x86/include/asm/dom0_build.h
> > > index ff021c24af..a322bf455c 100644
> > > --- a/xen/arch/x86/include/asm/dom0_build.h
> > > +++ b/xen/arch/x86/include/asm/dom0_build.h
> > > @@ -8,6 +8,8 @@
> > >
> > >  extern unsigned int dom0_memflags;
> > >
> > > +int dom0_check_parms(const struct elf_dom_parms *parms,
> > > +                     bool is_pv_shim);
> > >  unsigned long dom0_compute_nr_pages(struct domain *d,
> > >                                      struct elf_dom_parms *parms,
> > >                                      unsigned long initrd_len);
> > > diff --git a/xen/arch/x86/pv/dom0_build.c b/xen/arch/x86/pv/dom0_build.c
> > > index 075a3646c2..9d0310ad91 100644
> > > --- a/xen/arch/x86/pv/dom0_build.c
> > > +++ b/xen/arch/x86/pv/dom0_build.c
> > > @@ -494,14 +494,8 @@ static int __init dom0_construct(const struct
> > > boot_domain *bd)
> > >          return -EINVAL;
> > >      }
> > >
> > > -    if ( parms.elf_notes[XEN_ELFNOTE_SUPPORTED_FEATURES].type != 
> > > XEN_ENT_NONE )
> > > -    {
> > > -        if ( !pv_shim && !test_bit(XENFEAT_dom0, parms.f_supported) )
> > > -        {
> > > -            printk("Kernel does not support Dom0 operation\n");
> > > -            return -EINVAL;
> > > -        }
> > > -    }
> > > +    if ( (rc = dom0_check_parms(&parms, pv_shim)) != 0 )
> >
> > pv_shim is a global variable, you don't need to pass it around.
> >
> 
> Okay, but in the other call I was always passing false. What do you think?

I think just using pv_shim directly in dom0_check_parms() is easier to
follow rather than passing it around.  But with my suggestion above
to use is_hardware_domain() you might not need to check for pv_shim.

Thanks, Roger.



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.