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

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



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


 


Rackspace

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