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
|