WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH RFC 1/5] Grant table for console, xenstore pages

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH RFC 1/5] Grant table for console, xenstore pages
From: Diego Ongaro <diego.ongaro@xxxxxxxxxx>
Date: Fri, 11 Jul 2008 20:14:22 +0100
Delivery-date: Fri, 11 Jul 2008 12:14:27 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <4877B09E.5000909@xxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <4877B09E.5000909@xxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mozilla-Thunderbird 2.0.0.14 (X11/20080509)
This patch claims one grant entry for the console and another for the
xenstore. It modifies the builder to fill in the grant table entries for
the console and the xenstore. At this stage, the grant entries just give
access to domain 0 (addressed in a later patch).

Signed-off-by: Diego Ongaro <diego.ongaro@xxxxxxxxxx>
---
diff -r b61cab9b4213 tools/libxc/xc_dom.h
--- a/tools/libxc/xc_dom.h      Fri Jul 11 19:00:25 2008 +0100
+++ b/tools/libxc/xc_dom.h      Fri Jul 11 19:00:41 2008 +0100
@@ -179,6 +179,7 @@
                            xen_pfn_t count);
 int xc_dom_boot_image(struct xc_dom_image *dom);
 int xc_dom_compat_check(struct xc_dom_image *dom);
+int xc_dom_gnttab_init(struct xc_dom_image *dom);
 
 /* --- debugging bits ---------------------------------------------- */
 
diff -r b61cab9b4213 tools/libxc/xc_dom_boot.c
--- a/tools/libxc/xc_dom_boot.c Fri Jul 11 19:00:25 2008 +0100
+++ b/tools/libxc/xc_dom_boot.c Fri Jul 11 19:00:41 2008 +0100
@@ -20,6 +20,7 @@
 #include "xg_private.h"
 #include "xc_dom.h"
 #include <xen/hvm/params.h>
+#include <xen/grant_table.h>
 
 /* ------------------------------------------------------------------------ */
 
@@ -267,6 +268,88 @@
     return rc;
 }
 
+static unsigned long xc_dom_gnttab_mfn(struct xc_dom_image *dom)
+{
+    DECLARE_HYPERCALL;
+    gnttab_setup_table_t setup_table;
+    unsigned long mfn = -1; /* TODO: is this the correct type? */
+
+    setup_table.dom = dom->guest_domid;
+    setup_table.nr_frames = 1;
+    set_xen_guest_handle(setup_table.frame_list, &mfn);
+    setup_table.status = 0;
+
+    hypercall.op = __HYPERVISOR_grant_table_op;
+    hypercall.arg[0] = GNTTABOP_setup_table;
+    hypercall.arg[1] = (unsigned long) &setup_table;
+    hypercall.arg[2] = 1;
+
+    if ( do_xen_hypercall(dom->guest_xc, &hypercall) == -1 ||
+         setup_table.status != GNTST_okay )
+    {
+        xc_dom_panic(XC_INTERNAL_ERROR,
+                     "%s: failed to setup domU grant table "
+                     "[errno=%d, status=%x]\n",
+                     __FUNCTION__, errno, setup_table.status);
+        return -1;
+    }
+
+    return mfn;
+}
+
+/* TODO: don't hard-code these */
+#define CONSOLE_DOMID 0
+#define XENSTORE_DOMID 0
+
+int xc_dom_gnttab_init(struct xc_dom_image *dom)
+{
+    unsigned long grant_table_mfn;
+    grant_entry_t *grant_table;
+
+    grant_table_mfn = xc_dom_gnttab_mfn(dom);
+    if ( grant_table_mfn == -1 )
+        return -1;
+
+    grant_table = xc_map_foreign_range(dom->guest_xc,
+                                       dom->guest_domid, 
+                                       PAGE_SIZE, 
+                                       PROT_READ | PROT_WRITE,
+                                       grant_table_mfn);
+    if ( grant_table == NULL )
+    {
+        xc_dom_panic(XC_INTERNAL_ERROR,
+                     "%s: failed to map domU grant table "
+                     "[errno=%d]\n",
+                     __FUNCTION__, errno);
+        return -1;
+    }
+
+    if ( dom->guest_domid != CONSOLE_DOMID )
+    {
+        grant_table[GNTTAB_RESERVED_CONSOLE].flags = GTF_permit_access;
+        grant_table[GNTTAB_RESERVED_CONSOLE].domid = CONSOLE_DOMID;
+        grant_table[GNTTAB_RESERVED_CONSOLE].frame = xc_dom_p2m_host(dom, 
dom->console_pfn);
+    }
+
+    if ( dom->guest_domid != XENSTORE_DOMID )
+    {
+        grant_table[GNTTAB_RESERVED_XENSTORE].flags = GTF_permit_access;
+        grant_table[GNTTAB_RESERVED_XENSTORE].domid = XENSTORE_DOMID;
+        grant_table[GNTTAB_RESERVED_XENSTORE].frame = xc_dom_p2m_host(dom, 
dom->xenstore_pfn);
+    }
+
+    if ( munmap(grant_table, PAGE_SIZE) == -1 )
+    {
+        xc_dom_panic(XC_INTERNAL_ERROR,
+                     "%s: failed to umap domU grant table "
+                     "[errno=%d]\n",
+                     __FUNCTION__, errno);
+        return -1;
+    }
+
+    return 0;
+}
+
 /*
  * Local variables:
  * mode: C
diff -r b61cab9b4213 tools/libxc/xc_dom_compat_linux.c
--- a/tools/libxc/xc_dom_compat_linux.c Fri Jul 11 19:00:25 2008 +0100
+++ b/tools/libxc/xc_dom_compat_linux.c Fri Jul 11 19:00:41 2008 +0100
@@ -47,6 +47,8 @@
     if ( (rc = xc_dom_build_image(dom)) != 0 )
         goto out;
     if ( (rc = xc_dom_boot_image(dom)) != 0 )
+        goto out;
+    if ( (rc = xc_dom_gnttab_init(dom)) != 0)
         goto out;
 
     *console_mfn = xc_dom_p2m_host(dom, dom->console_pfn);
diff -r b61cab9b4213 xen/include/public/grant_table.h
--- a/xen/include/public/grant_table.h  Fri Jul 11 19:00:25 2008 +0100
+++ b/xen/include/public/grant_table.h  Fri Jul 11 19:00:41 2008 +0100
@@ -101,6 +101,12 @@
     uint32_t frame;
 };
 typedef struct grant_entry grant_entry_t;
+
+/* External tools reserve first few grant table entries. */
+#define GNTTAB_NR_RESERVED_ENTRIES     8
+#define GNTTAB_RESERVED_CONSOLE        0
+#define GNTTAB_RESERVED_XENSTORE       1
+/* (the next 6 are reserved for future use) */
 
 /*
  * Type of grant entry.

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel