[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 01 of 25] libxc: some xc_gnttab_* functions are not Linux specific
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |