[RFC PATCH] x86/xen: Consider Xen PVH support in CONFIG_XEN_PVHVM

Teddy Astie
2026-02-24T10:51:36Z

It's currently possible to build Linux with CONFIG_PVH|CONFIG_XEN_PVHVM
and no CONFIG_XEN_PVH. That leads to inconsistent kernels that fails with
"Missing xen PVH initialization" when booting using PVH boot method or
display various errors and fail to initialize Xen PV drivers when booting
with PVH-GRUB.

platform_pci_unplug: Xen Platform PCI: unrecognised magic value
...
# modprobe xen-blkfront
modprobe: ERROR: could not insert 'xen_blkfront': No such device
# modprobe xen-netfront
modprobe: ERROR: could not insert 'xen_netfront': No such device

When built without CONFIG_XEN_PVH, PVH-specific logic is disabled, hence when
booting with e.g PVH-OVMF, Linux assumes we are a HVM guest, even when we aren't
actually one (in the "with HVM emulated devices" sense).

As it is actually possible to boot Xen PVH without CONFIG_PVH; and that most
Xen-related logic exist within CONFIG_XEN_PVHVM; consider PVH guests support
within CONFIG_XEN_PVHVM instead of CONFIG_XEN_PVH.

Keep CONFIG_XEN_PVH as a shortcut to enable PVH boot, ACPI support and PVHVM.

Signed-off-by: Teddy Astie <teddy.astie@vates.tech>
---
Cc: Juergen Gross <jgross@suse.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>

A tentative patch, I'm not sure of the way of dealing with the KConfig part,
keeping CONFIG_XEN_PVH as a shortcut is interesting, but there may be other
options.

There are widespreadly used Linux distributions that have a similar configuration
to this one, thus exhibit this issue i.e fail to boot.

I'm not sure which commit to target for a Fixes: note.

arch/x86/xen/Makefile | 2 +-
arch/x86/xen/enlighten_hvm.c | 2 --
arch/x86/xen/grant-table.c | 2 +-
arch/x86/xen/xen-head.S | 8 ++++----
include/xen/xen.h | 2 +-
5 files changed, 7 insertions(+), 9 deletions(-)

diff --git a/arch/x86/xen/Makefile b/arch/x86/xen/Makefile
index a9ec8c9f5c5d..7fbe17c8ba89 100644
--- a/arch/x86/xen/Makefile
+++ b/arch/x86/xen/Makefile
@@ -33,7 +33,7 @@ obj-$(CONFIG_XEN_PV) += irq.o
obj-$(CONFIG_XEN_PV) += multicalls.o
obj-$(CONFIG_XEN_PV) += xen-asm.o

-obj-$(CONFIG_XEN_PVH) += enlighten_pvh.o
+obj-$(CONFIG_XEN_PVHVM) += enlighten_pvh.o

obj-$(CONFIG_EVENT_TRACING) += trace.o

diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c
index fe57ff85d004..38c2cdfdcc44 100644
--- a/arch/x86/xen/enlighten_hvm.c
+++ b/arch/x86/xen/enlighten_hvm.c
@@ -264,7 +264,6 @@ static bool __init msi_ext_dest_id(void)

static __init void xen_hvm_guest_late_init(void)
{
-#ifdef CONFIG_XEN_PVH
/* Test for PVH domain (PVH boot path taken overrides ACPI flags). */
if (!xen_pvh &&
(x86_platform.legacy.rtc || !x86_platform.legacy.no_vga))
@@ -282,7 +281,6 @@ static __init void xen_hvm_guest_late_init(void)

machine_ops.emergency_restart = xen_emergency_restart;
pv_info.name = "Xen PVH";
-#endif
}

static uint32_t __init xen_platform_hvm(void)
diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c
index 5f4060b5a40d..4d717c92b624 100644
--- a/arch/x86/xen/grant-table.c
+++ b/arch/x86/xen/grant-table.c
@@ -149,7 +149,7 @@ int arch_gnttab_init(unsigned long nr_shared, unsigned long nr_status)
return -ENOMEM;
}

-#ifdef CONFIG_XEN_PVH
+#ifdef CONFIG_XEN_PVHVM
#include <xen/events.h>
#include <xen/xen-ops.h>
static int __init xen_pvh_gnttab_setup(void)
diff --git a/arch/x86/xen/xen-head.S b/arch/x86/xen/xen-head.S
index 5dad6c51cdc3..e262caac3ca9 100644
--- a/arch/x86/xen/xen-head.S
+++ b/arch/x86/xen/xen-head.S
@@ -162,10 +162,10 @@ SYM_FUNC_END(xen_hypercall_intel)
#else
# define FEATURES_PV 0
#endif
-#ifdef CONFIG_XEN_PVH
-# define FEATURES_PVH (1 << XENFEAT_linux_rsdp_unrestricted)
+#ifdef CONFIG_XEN_PVHVM
+# define FEATURES_PVHVM (1 << XENFEAT_linux_rsdp_unrestricted)
#else
-# define FEATURES_PVH 0
+# define FEATURES_PVHVM 0
#endif
#ifdef CONFIG_XEN_DOM0
# define FEATURES_DOM0 (1 << XENFEAT_dom0)
@@ -173,7 +173,7 @@ SYM_FUNC_END(xen_hypercall_intel)
# define FEATURES_DOM0 0
#endif
ELFNOTE(Xen, XEN_ELFNOTE_SUPPORTED_FEATURES,
- .long FEATURES_PV | FEATURES_PVH | FEATURES_DOM0)
+ .long FEATURES_PV | FEATURES_PVHVM | FEATURES_DOM0)
ELFNOTE(Xen, XEN_ELFNOTE_LOADER, .asciz "generic")
ELFNOTE(Xen, XEN_ELFNOTE_SUSPEND_CANCEL, .long 1)

diff --git a/include/xen/xen.h b/include/xen/xen.h
index f280c5dcf923..4d066fbf9714 100644
--- a/include/xen/xen.h
+++ b/include/xen/xen.h
@@ -16,7 +16,7 @@ extern enum xen_domain_type xen_domain_type;
#define xen_domain_type XEN_NATIVE
#endif

-#ifdef CONFIG_XEN_PVH
+#ifdef CONFIG_XEN_PVHVM
extern bool xen_pvh;
#else
#define xen_pvh 0
--
2.53.0

--
Teddy Astie | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech