From: Grygorii Strashko <grygorii_strashko@epam.com>
As was indicated in [1][2], performing guest kernel probe after creating
domain is not robust.
Hence, rework dom0less domain creation sequence to probe guest kernels
first, before creating domains, so guest type (32/64bit) can be properly
identified and domain type configured correctly from very beginning.
[1] https://lists.xen.org/archives/html/xen-devel/2025-07/msg01647.html
[2] https://lists.xen.org/archives/html/xen-devel/2025-07/msg01648.html
Signed-off-by: Grygorii Strashko <grygorii_strashko@epam.com>
---
xen/arch/arm/domain_build.c | 4 ----
xen/common/device-tree/dom0less-build.c | 20 +++++++++++---------
2 files changed, 11 insertions(+), 13 deletions(-)
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index 59966f1bcd49..bcd642477d1d 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -1986,10 +1986,6 @@ int __init construct_hwdom(struct kernel_info *kinfo,
iommu_hwdom_init(d);
-#ifdef CONFIG_ARM_64
- /* type must be set before allocate_memory */
- d->arch.type = kinfo->is_32bit_type ? DOMAIN_32BIT : DOMAIN_64BIT;
-#endif
find_gnttab_region(d, kinfo);
if ( is_domain_direct_mapped(d) )
allocate_memory_11(d, kinfo);
diff --git a/xen/common/device-tree/dom0less-build.c b/xen/common/device-tree/dom0less-build.c
index 8906e35e6978..14829ec465d1 100644
--- a/xen/common/device-tree/dom0less-build.c
+++ b/xen/common/device-tree/dom0less-build.c
@@ -746,9 +746,6 @@ static int __init construct_domU(struct kernel_info *kinfo,
if ( rc != 0 )
return rc;
- printk("*** LOADING DOMU cpus=%u memory=%#"PRIx64"KB ***\n",
- d->max_vcpus, mem);
-
rc = dt_property_read_string(node, "xen,enhanced", &dom0less_enhanced);
if ( rc == -EILSEQ ||
rc == -ENODATA ||
@@ -770,12 +767,6 @@ static int __init construct_domU(struct kernel_info *kinfo,
d->max_pages = ((paddr_t)mem * SZ_1K) >> PAGE_SHIFT;
- rc = kernel_probe(kinfo, node);
- if ( rc < 0 )
- return rc;
-
- set_domain_type(d, kinfo);
-
if ( is_hardware_domain(d) )
{
rc = construct_hwdom(kinfo, node);
@@ -836,6 +827,17 @@ void __init create_domUs(void)
if ( (max_init_domid + 1) >= DOMID_FIRST_RESERVED )
panic("No more domain IDs available\n");
+ printk("*** LOADING DOMU cpus=%u memory=%#" PRIx64 "KB ***\n",
+ ki.bd.create_cfg.max_vcpus, ki.bd.memory);
+
+ rc = kernel_probe(&ki, node);
+ if ( rc < 0 )
+ panic("Error probing domain %s guest kernel (rc = %d)\n",
+ dt_node_name(node), rc);
+
+ if ( ki.is_32bit_type )
+ ki.bd.create_cfg.flags |= XEN_DOMCTL_CDF_is_32bits;
+
/*
* The variable max_init_domid is initialized with zero, so here it's
* very important to use the pre-increment operator to call
--
2.34.1