# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1291369006 0
# Node ID 7c6e87f167d47b2c0b850806d0e9fa298018ebd4
# Parent 9a40ab7a4347e4c49785d079a598a1bc22477739
libxc: some xc_gnttab_* functions are not Linux specific
They simply make hypercalls and perform other operations via the
abstract interface. Create xc_gnttab.c and move those functions there.
Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
diff -r 9a40ab7a4347 -r 7c6e87f167d4 tools/libxc/Makefile
--- a/tools/libxc/Makefile Fri Dec 03 09:36:46 2010 +0000
+++ b/tools/libxc/Makefile Fri Dec 03 09:36:46 2010 +0000
@@ -11,6 +11,7 @@ CTRL_SRCS-y += xc_cpupool.c
CTRL_SRCS-y += xc_cpupool.c
CTRL_SRCS-y += xc_domain.c
CTRL_SRCS-y += xc_evtchn.c
+CTRL_SRCS-y += xc_gnttab.c
CTRL_SRCS-y += xc_misc.c
CTRL_SRCS-y += xc_acm.c
CTRL_SRCS-y += xc_flask.c
diff -r 9a40ab7a4347 -r 7c6e87f167d4 tools/libxc/xc_gnttab.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxc/xc_gnttab.c Fri Dec 03 09:36:46 2010 +0000
@@ -0,0 +1,147 @@
+/******************************************************************************
+ *
+ * Copyright (c) 2007-2008, D G Murray <Derek.Murray@xxxxxxxxxxxx>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
+ */
+
+#include "xc_private.h"
+
+int xc_gnttab_op(xc_interface *xch, int cmd, void * op, int op_size, int count)
+{
+ int ret = 0;
+ DECLARE_HYPERCALL;
+ DECLARE_HYPERCALL_BOUNCE(op, count * op_size,
XC_HYPERCALL_BUFFER_BOUNCE_BOTH);
+
+ if ( xc_hypercall_bounce_pre(xch, op) )
+ {
+ PERROR("Could not bounce buffer for grant table op hypercall");
+ goto out1;
+ }
+
+ hypercall.op = __HYPERVISOR_grant_table_op;
+ hypercall.arg[0] = cmd;
+ hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(op);
+ hypercall.arg[2] = count;
+
+ ret = do_xen_hypercall(xch, &hypercall);
+
+ xc_hypercall_bounce_post(xch, op);
+
+ out1:
+ return ret;
+}
+
+int xc_gnttab_get_version(xc_interface *xch, int domid)
+{
+ struct gnttab_get_version query;
+ int rc;
+
+ query.dom = domid;
+ rc = xc_gnttab_op(xch, GNTTABOP_get_version, &query, sizeof(query),
+ 1);
+ if ( rc < 0 )
+ return rc;
+ else
+ return query.version;
+}
+
+static void *_gnttab_map_table(xc_interface *xch, int domid, int *gnt_num)
+{
+ int rc, i;
+ struct gnttab_query_size query;
+ struct gnttab_setup_table setup;
+ DECLARE_HYPERCALL_BUFFER(unsigned long, frame_list);
+ xen_pfn_t *pfn_list = NULL;
+ grant_entry_v1_t *gnt = NULL;
+
+ if ( !gnt_num )
+ return NULL;
+
+ query.dom = domid;
+ rc = xc_gnttab_op(xch, 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(grant_entry_v1_t) );
+
+ frame_list = xc_hypercall_buffer_alloc(xch, frame_list, query.nr_frames *
sizeof(unsigned long));
+ if ( !frame_list )
+ {
+ ERROR("Could not allocate frame_list in xc_gnttab_map_table\n");
+ return NULL;
+ }
+
+ pfn_list = malloc(query.nr_frames * sizeof(xen_pfn_t));
+ if ( !pfn_list )
+ {
+ ERROR("Could not allocate 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(xch, 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(xch, domid, PROT_READ, pfn_list,
+ setup.nr_frames);
+ if ( !gnt )
+ {
+ ERROR("Could not map grant table\n");
+ goto err;
+ }
+
+err:
+ if ( frame_list )
+ xc_hypercall_buffer_free(xch, frame_list);
+ if ( pfn_list )
+ free(pfn_list);
+
+ return gnt;
+}
+
+grant_entry_v1_t *xc_gnttab_map_table_v1(xc_interface *xch, int domid,
+ int *gnt_num)
+{
+ if (xc_gnttab_get_version(xch, domid) == 2)
+ return NULL;
+ return _gnttab_map_table(xch, domid, gnt_num);
+}
+
+grant_entry_v2_t *xc_gnttab_map_table_v2(xc_interface *xch, int domid,
+ int *gnt_num)
+{
+ if (xc_gnttab_get_version(xch, domid) != 2)
+ return NULL;
+ return _gnttab_map_table(xch, domid, gnt_num);
+}
+
diff -r 9a40ab7a4347 -r 7c6e87f167d4 tools/libxc/xc_linux.c
--- a/tools/libxc/xc_linux.c Fri Dec 03 09:36:46 2010 +0000
+++ b/tools/libxc/xc_linux.c Fri Dec 03 09:36:46 2010 +0000
@@ -608,132 +608,6 @@ int xc_gnttab_set_max_grants(xc_interfac
return 0;
}
-int xc_gnttab_op(xc_interface *xch, int cmd, void * op, int op_size, int count)
-{
- int ret = 0;
- DECLARE_HYPERCALL;
- DECLARE_HYPERCALL_BOUNCE(op, count * op_size,
XC_HYPERCALL_BUFFER_BOUNCE_BOTH);
-
- if ( xc_hypercall_bounce_pre(xch, op) )
- {
- PERROR("Could not bounce buffer for grant table op hypercall");
- goto out1;
- }
-
- hypercall.op = __HYPERVISOR_grant_table_op;
- hypercall.arg[0] = cmd;
- hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(op);
- hypercall.arg[2] = count;
-
- ret = do_xen_hypercall(xch, &hypercall);
-
- xc_hypercall_bounce_post(xch, op);
-
- out1:
- return ret;
-}
-
-int xc_gnttab_get_version(xc_interface *xch, int domid)
-{
- struct gnttab_get_version query;
- int rc;
-
- query.dom = domid;
- rc = xc_gnttab_op(xch, GNTTABOP_get_version, &query, sizeof(query),
- 1);
- if ( rc < 0 )
- return rc;
- else
- return query.version;
-}
-
-static void *_gnttab_map_table(xc_interface *xch, int domid, int *gnt_num)
-{
- int rc, i;
- struct gnttab_query_size query;
- struct gnttab_setup_table setup;
- DECLARE_HYPERCALL_BUFFER(unsigned long, frame_list);
- xen_pfn_t *pfn_list = NULL;
- grant_entry_v1_t *gnt = NULL;
-
- if ( !gnt_num )
- return NULL;
-
- query.dom = domid;
- rc = xc_gnttab_op(xch, 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(grant_entry_v1_t) );
-
- frame_list = xc_hypercall_buffer_alloc(xch, frame_list, query.nr_frames *
sizeof(unsigned long));
- if ( !frame_list )
- {
- ERROR("Could not allocate frame_list in xc_gnttab_map_table\n");
- return NULL;
- }
-
- pfn_list = malloc(query.nr_frames * sizeof(xen_pfn_t));
- if ( !pfn_list )
- {
- ERROR("Could not allocate 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(xch, 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(xch, domid, PROT_READ, pfn_list,
- setup.nr_frames);
- if ( !gnt )
- {
- ERROR("Could not map grant table\n");
- goto err;
- }
-
-err:
- if ( frame_list )
- xc_hypercall_buffer_free(xch, frame_list);
- if ( pfn_list )
- free(pfn_list);
-
- return gnt;
-}
-
-grant_entry_v1_t *xc_gnttab_map_table_v1(xc_interface *xch, int domid,
- int *gnt_num)
-{
- if (xc_gnttab_get_version(xch, domid) == 2)
- return NULL;
- return _gnttab_map_table(xch, domid, gnt_num);
-}
-
-grant_entry_v2_t *xc_gnttab_map_table_v2(xc_interface *xch, int domid,
- int *gnt_num)
-{
- if (xc_gnttab_get_version(xch, domid) != 2)
- return NULL;
- return _gnttab_map_table(xch, domid, gnt_num);
-}
-
/*
* Local variables:
* mode: C
diff -r 9a40ab7a4347 -r 7c6e87f167d4 tools/libxc/xc_minios.c
--- a/tools/libxc/xc_minios.c Fri Dec 03 09:36:46 2010 +0000
+++ b/tools/libxc/xc_minios.c Fri Dec 03 09:36:46 2010 +0000
@@ -457,18 +457,6 @@ int xc_gnttab_set_max_grants(xc_interfac
return ret;
}
-grant_entry_v1_t *xc_gnttab_map_table_v1(
- xc_interface *xch, int domid, int *gnt_num)
-{
- return NULL;
-}
-
-grant_entry_v2_t *xc_gnttab_map_table_v2(
- xc_interface *xch, int domid, int *gnt_num)
-{
- return NULL;
-}
-
/*
* Local variables:
* mode: C
diff -r 9a40ab7a4347 -r 7c6e87f167d4 tools/libxc/xc_netbsd.c
--- a/tools/libxc/xc_netbsd.c Fri Dec 03 09:36:46 2010 +0000
+++ b/tools/libxc/xc_netbsd.c Fri Dec 03 09:36:46 2010 +0000
@@ -287,18 +287,6 @@ void discard_file_cache(xc_interface *xc
}
}
-grant_entry_v1_t *xc_gnttab_map_table_v1(
- xc_interface *xch, int domid, int *gnt_num)
-{
- return NULL;
-}
-
-grant_entry_v2_t *xc_gnttab_map_table_v2(
- xc_interface *xch, int domid, int *gnt_num)
-{
- return NULL;
-}
-
/*
* Local variables:
* mode: C
diff -r 9a40ab7a4347 -r 7c6e87f167d4 tools/libxc/xc_solaris.c
--- a/tools/libxc/xc_solaris.c Fri Dec 03 09:36:46 2010 +0000
+++ b/tools/libxc/xc_solaris.c Fri Dec 03 09:36:46 2010 +0000
@@ -261,15 +261,3 @@ void discard_file_cache(xc_interface *xc
{
// TODO: Implement for Solaris!
}
-
-grant_entry_v1_t *xc_gnttab_map_table_v1(
- xc_interface *xch, int domid, int *gnt_num)
-{
- return NULL;
-}
-
-grant_entry_v2_t *xc_gnttab_map_table_v2(
- xc_interface *xch, int domid, int *gnt_num)
-{
- return NULL;
-}
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|