From: Grygorii Strashko <grygorii_stras...@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_stras...@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

Reply via email to