Hi Stefano,

On 28/01/2022 21:33, Stefano Stabellini wrote:
From: Luca Miccio <lucmic...@gmail.com>

If "xen,enhanced" is enabled, then add to dom0less domains:

- the hypervisor node in device tree
- the xenstore event channel

The xenstore event channel is also used for the first notification to
let the guest know that xenstore has become available.

Signed-off-by: Luca Miccio <lucmic...@gmail.com>
Signed-off-by: Stefano Stabellini <stefano.stabell...@xilinx.com>
Reviewed-by: Bertrand Marquis <bertrand.marq...@arm.com>
CC: Julien Grall <jul...@xen.org>
CC: Volodymyr Babchuk <volodymyr_babc...@epam.com>
CC: Bertrand Marquis <bertrand.marq...@arm.com>

---
Changes in v3:
- use evtchn_alloc_unbound

Changes in v2:
- set HVM_PARAM_STORE_PFN to ~0ULL at domain creation
- in alloc_xenstore_evtchn do not call _evtchn_alloc_unbound
---
  xen/arch/arm/domain_build.c | 41 +++++++++++++++++++++++++++++++++++++
  1 file changed, 41 insertions(+)

diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index 9144d6c0b6..8e030a7f05 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -27,6 +27,7 @@
  #include <asm/setup.h>
  #include <asm/cpufeature.h>
  #include <asm/domain_build.h>
+#include <xen/event.h>
#include <xen/irq.h>
  #include <xen/grant_table.h>
@@ -2619,6 +2620,8 @@ static int __init prepare_dtb_domU(struct domain *d, 
struct kernel_info *kinfo)
      int ret;
kinfo->phandle_gic = GUEST_PHANDLE_GIC;
+    kinfo->gnttab_start = GUEST_GNTTAB_BASE;
+    kinfo->gnttab_size = GUEST_GNTTAB_SIZE;
addrcells = GUEST_ROOT_ADDRESS_CELLS;
      sizecells = GUEST_ROOT_SIZE_CELLS;
@@ -2693,6 +2696,13 @@ static int __init prepare_dtb_domU(struct domain *d, 
struct kernel_info *kinfo)
              goto err;
      }
+ if ( kinfo->dom0less_enhanced )
+    {
+        ret = make_hypervisor_node(d, kinfo, addrcells, sizecells);

Looking at the code, I think the extended regions will not work properly because we are looking at the host memory layout. In the case of domU, we want to use the guest layout. Please have a look how it was done in libxl.

+        if ( ret )
+            goto err;
+    }
+
      ret = fdt_end_node(kinfo->fdt);
      if ( ret < 0 )
          goto err;
@@ -2959,6 +2969,25 @@ static int __init construct_domain(struct domain *d, 
struct kernel_info *kinfo)
      return 0;
  }
+static int __init alloc_xenstore_evtchn(struct domain *d)
+{
+    evtchn_alloc_unbound_t alloc;
+    int rc;
+
+    alloc.dom = d->domain_id;
+    alloc.remote_dom = hardware_domain->domain_id;

The first thing evtchn_alloc_unbound() will do is looking up the domain. This seems a bit pointless given that we have the domain in hand. Shouldn't we extend evtchn_alloc_unbound() to pass the domain?

+    rc = evtchn_alloc_unbound(&alloc, true);
+    if ( rc )
+    {
+        printk("Failed allocating event channel for domain\n");
+        return rc;
+    }
+
+    d->arch.hvm.params[HVM_PARAM_STORE_EVTCHN] = alloc.port;
+
+    return 0;
+}
+
  static int __init construct_domU(struct domain *d,
                                   const struct dt_device_node *node)
  {
@@ -3014,7 +3043,19 @@ static int __init construct_domU(struct domain *d,
          return rc;
if ( kinfo.vpl011 )
+    {
          rc = domain_vpl011_init(d, NULL);
+        if ( rc < 0 )
+            return rc;
+    }
+
+    if ( kinfo.dom0less_enhanced )
+    {
+        rc = alloc_xenstore_evtchn(d);
+        if ( rc < 0 )
+            return rc;
+        d->arch.hvm.params[HVM_PARAM_STORE_PFN] = ~0ULL;

I think it would be easy to allocate the page right now. So what prevent us to do it right now?

Cheers,

--
Julien Grall

Reply via email to