[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v6 5/7] init-dom0less: allocate xenstore page is not already allocated


  • To: <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Stefano Stabellini <stefano.stabellini@xxxxxxx>
  • Date: Thu, 6 Feb 2025 17:53:39 -0800
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0)
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1YraUCzpyaHUtOgiiBuxVZ3aTJyofgwv2U7kMIKg8sQ=; b=qxQ6Qi3fPrSbsYgjc+I/5Rlygmua0kipS2Z+zM980TYZR8uNHJDgi3WG5GNiuCDkrghxUXhXVECRnfVXVmG5EMXkr5UAh51rcv77MexPw0gk0Bs8U+3xSvBs0pY7eKvlAHMLGm0n0UPdPndaCwOTecPDU0Bvh1GMOERbam0OQ/uXB6TdOUHFPYBPTAyMfwFaBFMenmj2OVrHrWh+2OAAcr23L36AdFykp+BPDvWUXE+Pzi2WELtJFiRZ1MXKRF7nGG335XnuXV/MaG+KZX7Ay8ZQEsxNX3SI9ulAj4L7fdO54mhj+rRyHZm4mGx8JytiAL28YkFBkfsrL+WG7t/XfQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=loReiXQFvbnrEuDRZj7LRuZ11cw9JNvVPmKNtKFDSut1j0QnLF3lIhS1znbvfeDFBq13bs1G/koanw9vxfS/uutQ8mw9/J04DcoW9A01tozgE9vpDagMZ/+H0zGiEY9c0iCT70ds44DM9JCH62jew1tdBuA7q155D6PK4BRcBvxnoWbo+dcU4xtikv1TCD7TLAh27+NvWKTvCTDIX5QshErBGSZySq2k3Vmpr4yUsGv3KMSSiPxHbtolgw5Doj1f7KocijPyrPiu4SBtRA9CS87bi/h7IRws8yHO3m6xRDdVGuDKFqYvY/qyK2hgpBghsKas2NJx4+Qh8hOr+y1V5g==
  • Cc: <sstabellini@xxxxxxxxxx>, <bertrand.marquis@xxxxxxx>, <julien@xxxxxxx>, <michal.orzel@xxxxxxx>, <Volodymyr_Babchuk@xxxxxxxx>, Stefano Stabellini <stefano.stabellini@xxxxxxx>
  • Delivery-date: Fri, 07 Feb 2025 01:53:56 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

We check if the xenstore page is already allocated. If yes, there is
nothing to do. If no, we proceed allocating it.

Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxx>
---
Changes in v6:
- remove double blank lines

 tools/helpers/init-dom0less.c | 53 +++++++++++++++++++++++++++++++++--
 1 file changed, 50 insertions(+), 3 deletions(-)

diff --git a/tools/helpers/init-dom0less.c b/tools/helpers/init-dom0less.c
index 2b51965fa7..78c59ec5e7 100644
--- a/tools/helpers/init-dom0less.c
+++ b/tools/helpers/init-dom0less.c
@@ -16,8 +16,34 @@
 
 #include "init-dom-json.h"
 
+#define XENSTORE_PFN_OFFSET 1
 #define STR_MAX_LENGTH 128
 
+static int alloc_xs_page(struct xc_interface_core *xch,
+                         libxl_dominfo *info,
+                         uint64_t *xenstore_pfn)
+{
+    int rc;
+    const xen_pfn_t base = GUEST_MAGIC_BASE >> XC_PAGE_SHIFT;
+    xen_pfn_t p2m = (GUEST_MAGIC_BASE >> XC_PAGE_SHIFT) + XENSTORE_PFN_OFFSET;
+
+    rc = xc_domain_setmaxmem(xch, info->domid,
+                             info->max_memkb + (XC_PAGE_SIZE/1024));
+    if (rc < 0)
+        return rc;
+
+    rc = xc_domain_populate_physmap_exact(xch, info->domid, 1, 0, 0, &p2m);
+    if (rc < 0)
+        return rc;
+
+    *xenstore_pfn = base + XENSTORE_PFN_OFFSET;
+    rc = xc_clear_domain_page(xch, info->domid, *xenstore_pfn);
+    if (rc < 0)
+        return rc;
+
+    return 0;
+}
+
 static int get_xs_page(struct xc_interface_core *xch, libxl_dominfo *info,
                        uint64_t *xenstore_pfn)
 {
@@ -233,9 +259,30 @@ static int init_domain(struct xs_handle *xsh,
         return 0;
 
     /* Get xenstore page */
-    if (get_xs_page(xch, info, &xenstore_pfn) != 0) {
-        printf("Error on getting xenstore page\n");
-        return 1;
+    if (get_xs_page(xch, info, &xenstore_pfn) != 0 || xenstore_pfn == ~0ULL) {
+        struct xenstore_domain_interface *intf;
+
+        rc = alloc_xs_page(xch, info, &xenstore_pfn);
+        if (rc != 0) {
+            printf("Error on getting xenstore page\n");
+            return 1;
+        }
+
+        intf = xenforeignmemory_map(xfh, info->domid, PROT_READ | PROT_WRITE, 
1,
+                                    &xenstore_pfn, NULL);
+        if (!intf) {
+            printf("Error mapping xenstore page\n");
+            return 1;
+        }
+
+        intf->connection = XENSTORE_RECONNECT;
+        xenforeignmemory_unmap(xfh, intf, 1);
+
+        /* Now everything is ready: set HVM_PARAM_STORE_PFN */
+        rc = xc_hvm_param_set(xch, info->domid, HVM_PARAM_STORE_PFN,
+                xenstore_pfn);
+        if (rc < 0)
+            return rc;
     }
 
     rc = xc_dom_gnttab_seed(xch, info->domid, true,
-- 
2.25.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.