[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 01 of 25] libxc: some xc_gnttab_* functions are not Linux specific
Successfully tested with NetBSD. Acked-by: Christoph Egger <Christoph.Egger@xxxxxxx> On Friday 03 December 2010 10:57:05 Ian Campbell wrote: > # 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 -- ---to satisfy European Law for business letters: Advanced Micro Devices GmbH Einsteinring 24, 85609 Dornach b. Muenchen Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen Registergericht Muenchen, HRB Nr. 43632 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |