From b2352be9415987e1d20281d8a9a8577600b417a4 Mon Sep 17 00:00:00 2001 From: Frediano Ziglio Date: Mon, 20 Apr 2026 12:27:00 +0200 Subject: [PATCH] xen/x86: Check supported features even for PVH dom0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The supported features ELF notes 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 Reviewed-by: Jan Beulich Reviewed-by: Roger Pau Monné Signed-off-by: Andrew Cooper master commit: 44429b69319975f25d3762629b40fecdd4e3e554 master date: 2026-04-09 21:04:58 +0100 --- xen/arch/x86/dom0_build.c | 12 ++++++++++++ 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, 19 insertions(+), 8 deletions(-) diff --git a/xen/arch/x86/dom0_build.c b/xen/arch/x86/dom0_build.c index 0b467fd4a4..a32ad2739f 100644 --- a/xen/arch/x86/dom0_build.c +++ b/xen/arch/x86/dom0_build.c @@ -320,6 +320,18 @@ unsigned long __init dom0_paging_pages(const struct domain *d, return DIV_ROUND_UP(memkb, 1024) << (20 - PAGE_SHIFT); } +int __init initdom_check_parms( + const struct domain *d, const struct elf_dom_parms *parms) +{ + if ( parms->elf_notes[XEN_ELFNOTE_SUPPORTED_FEATURES].type != XEN_ENT_NONE && + is_hardware_domain(d) && !test_bit(XENFEAT_dom0, parms->f_supported) ) + { + printk("Kernel does not support Dom0 operation\n"); + return -EINVAL; + } + + return 0; +} /* * If allocation isn't specified, reserve 1/16th of available memory for diff --git a/xen/arch/x86/hvm/dom0_build.c b/xen/arch/x86/hvm/dom0_build.c index 6849e8c010..66199678e8 100644 --- a/xen/arch/x86/hvm/dom0_build.c +++ b/xen/arch/x86/hvm/dom0_build.c @@ -692,6 +692,9 @@ static int __init pvh_load_kernel( return -EINVAL; } + if ( (rc = initdom_check_parms(d, &parms)) != 0 ) + return rc; + /* Copy the OS image and free temporary buffer. */ elf.dest_base = (void *)(parms.virt_kstart - parms.virt_base); elf.dest_size = parms.virt_kend - parms.virt_kstart; diff --git a/xen/arch/x86/include/asm/dom0_build.h b/xen/arch/x86/include/asm/dom0_build.h index ff021c24af..1332f18cc6 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 initdom_check_parms(const struct domain *d, + const struct elf_dom_parms *parms); 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 f9bbbea2ff..37729091df 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 = initdom_check_parms(d, &parms)) != 0 ) + return rc; nr_pages = dom0_compute_nr_pages(d, &parms, initrd_len);