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-changelog

[Xen-changelog] [xen-unstable] libxc: Add a function to map a domain's g

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] libxc: Add a function to map a domain's grant table.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 02 Jun 2009 10:45:16 -0700
Delivery-date: Tue, 02 Jun 2009 10:45:59 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1243862000 -3600
# Node ID 4b2172c60a8ca8d201fae7a211af506bb91e95d6
# Parent  bd39df93a29e015e93b708639756661c3419b602
libxc: Add a function to map a domain's grant table.

Signed-off-by: Jiang, Yunhong <yunhong.jiang@xxxxxxxxx>
---
 tools/libxc/xc_linux.c |  105 +++++++++++++++++++++++++++++++++++++++++++++++++
 tools/libxc/xenctrl.h  |    6 ++
 2 files changed, 111 insertions(+)

diff -r bd39df93a29e -r 4b2172c60a8c tools/libxc/xc_linux.c
--- a/tools/libxc/xc_linux.c    Mon Jun 01 14:12:53 2009 +0100
+++ b/tools/libxc/xc_linux.c    Mon Jun 01 14:13:20 2009 +0100
@@ -562,6 +562,111 @@ int xc_gnttab_set_max_grants(int xcg_han
     return 0;
 }
 
+int xc_gnttab_op(int xc_handle, int cmd,
+                 void * op, int op_size, int count)
+{
+    int ret = 0;
+    DECLARE_HYPERCALL;
+
+    hypercall.op     = __HYPERVISOR_grant_table_op;
+    hypercall.arg[0] = cmd;
+    hypercall.arg[1] = (unsigned long)op;
+    hypercall.arg[2] = count;
+
+    if ( lock_pages(op, count* op_size) != 0 )
+    {
+        PERROR("Could not lock memory for Xen hypercall");
+        goto out1;
+    }
+
+    ret = do_xen_hypercall(xc_handle, &hypercall);
+
+    unlock_pages(op, count * op_size);
+
+ out1:
+    return ret;
+}
+
+struct grant_entry *xc_gnttab_map_table(int xc_handle, int domid, int *gnt_num)
+{
+    int rc, i;
+    struct gnttab_query_size query;
+    struct gnttab_setup_table setup;
+    unsigned long *frame_list = NULL;
+    xen_pfn_t *pfn_list = NULL;
+    struct grant_entry *gnt = NULL;
+
+    if (!gnt_num)
+        return NULL;
+
+    query.dom = domid;
+    rc = xc_gnttab_op(xc_handle, GNTTABOP_query_size,
+                     &query, sizeof(query), 1);
+
+    if (rc || (query.status != GNTST_okay) )
+    {
+        ERROR("Could not query dom's grant size\n", domid);
+        return NULL;
+    }
+
+    *gnt_num = query.nr_frames *
+            (PAGE_SIZE / sizeof(struct grant_entry) );
+
+    frame_list = malloc(query.nr_frames * sizeof(unsigned long));
+    if (!frame_list || lock_pages(frame_list, query.nr_frames *
+                                              sizeof(unsigned long)))
+    {
+        ERROR("Alloc/lock frame_list in xc_gnttab_map_table\n");
+        if (frame_list)
+            free(frame_list);
+        return NULL;
+    }
+
+    pfn_list = malloc(query.nr_frames * sizeof(xen_pfn_t));
+
+    if (!pfn_list)
+    {
+        ERROR("Could not lock pfn_list in xc_gnttab_map_table\n");
+        goto err;
+    }
+
+    setup.dom = domid;
+    setup.nr_frames = query.nr_frames;
+    set_xen_guest_handle(setup.frame_list, frame_list);
+
+    /* XXX Any race with other setup_table hypercall? */
+    rc = xc_gnttab_op(xc_handle, GNTTABOP_setup_table,
+                      &setup, sizeof(setup), 1);
+
+    if (rc ||( setup.status != GNTST_okay) )
+    {
+        ERROR("Could not get grant table frame list\n");
+        goto err;
+    }
+
+    for (i = 0; i < setup.nr_frames; i++)
+        pfn_list[i] = frame_list[i];
+
+    gnt = xc_map_foreign_pages(xc_handle, domid, PROT_READ,
+                               pfn_list, setup.nr_frames);
+    if (!gnt)
+    {
+        ERROR("Could not map grant table\n");
+        goto err;
+    }
+
+err:
+    if (frame_list)
+    {
+        unlock_pages(frame_list, query.nr_frames *  sizeof(unsigned long));
+        free(frame_list);
+    }
+    if (pfn_list)
+        free(pfn_list);
+
+    return gnt;
+}
+
 /*
  * Local variables:
  * mode: C
diff -r bd39df93a29e -r 4b2172c60a8c tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h     Mon Jun 01 14:12:53 2009 +0100
+++ b/tools/libxc/xenctrl.h     Mon Jun 01 14:13:20 2009 +0100
@@ -27,6 +27,7 @@
 #include <xen/event_channel.h>
 #include <xen/sched.h>
 #include <xen/memory.h>
+#include <xen/grant_table.h>
 #include <xen/hvm/params.h>
 #include <xen/xsm/acm.h>
 #include <xen/xsm/acm_ops.h>
@@ -937,6 +938,11 @@ int xc_gnttab_set_max_grants(int xcg_han
 int xc_gnttab_set_max_grants(int xcg_handle,
                             uint32_t count);
 
+int xc_gnttab_op(int xc_handle, int cmd,
+                 void * op, int op_size, int count);
+
+struct grant_entry *xc_gnttab_map_table(int xc_handle, int domid, int 
*gnt_num);
+
 int xc_physdev_map_pirq(int xc_handle,
                         int domid,
                         int index,

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] libxc: Add a function to map a domain's grant table., Xen patchbot-unstable <=