|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/5] libxc: Split off xc_minios_privcmd.c
On Thu, 2015-02-26 at 11:56 +0000, Wei Liu wrote:
> From: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
>
> We are going to want to use some but not all of the machinery
> previously in xc_minios.c. Split the privcmd and gnttab code into its
> own file.
Does it make sense to put gnttab code in a file called privcmd.c?
I don't think there is much of a link between the two, is there?
I'm not sure which half of this rump libxc is going to want but perhaps
either _common or _standalone would be a better suffix, depending which
way it goes?
> This part is pure code motion.
>
> But we also have to:
>
> - Alter the Makefile to build and link xc_minios_privcmd.c too.
>
> - Rename some of the minios_*_ops symbols to have proper namespaceing
> and make them have external linkage, so that the init code (which
> remains in xc_minios.c) can reference them.
>
> - Call these *_ops symbols xc_*_ops so that we can mix and match in
> the future. This does not impede the existing mechanisms for
> run-time overriding. (But leave a comment next to the new
> declarations in xc_private.h saying not to use these.)
>
> - Change map_frames_ex to minios_map_frames_ex if compiling on rump
> kernel.
>
> Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
>
> [ wei: wrap long lines, use __RUMPRUN__ and define macro for map_frames_ex ]
>
> Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
> ---
> tools/libxc/Makefile | 2 +-
> tools/libxc/xc_minios.c | 243 +--------------------------------
> tools/libxc/xc_minios_privcmd.c | 291
> ++++++++++++++++++++++++++++++++++++++++
> tools/libxc/xc_private.h | 3 +
> 4 files changed, 299 insertions(+), 240 deletions(-)
> create mode 100644 tools/libxc/xc_minios_privcmd.c
>
> diff --git a/tools/libxc/Makefile b/tools/libxc/Makefile
> index 6fa88c7..4ace2b6 100644
> --- a/tools/libxc/Makefile
> +++ b/tools/libxc/Makefile
> @@ -47,7 +47,7 @@ CTRL_SRCS-$(CONFIG_Linux) += xc_linux.c xc_linux_osdep.c
> CTRL_SRCS-$(CONFIG_FreeBSD) += xc_freebsd.c xc_freebsd_osdep.c
> CTRL_SRCS-$(CONFIG_SunOS) += xc_solaris.c
> CTRL_SRCS-$(CONFIG_NetBSD) += xc_netbsd.c
> -CTRL_SRCS-$(CONFIG_MiniOS) += xc_minios.c
> +CTRL_SRCS-$(CONFIG_MiniOS) += xc_minios.c xc_minios_privcmd.c
>
> GUEST_SRCS-y :=
> GUEST_SRCS-y += xg_private.c xc_suspend.c
> diff --git a/tools/libxc/xc_minios.c b/tools/libxc/xc_minios.c
> index e703684..90e3363 100644
> --- a/tools/libxc/xc_minios.c
> +++ b/tools/libxc/xc_minios.c
> @@ -41,164 +41,10 @@
>
> #include "xc_private.h"
>
> -void minios_interface_close_fd(int fd);
> void minios_evtchn_close_fd(int fd);
> -void minios_gnttab_close_fd(int fd);
> -
> -extern void minios_interface_close_fd(int fd);
> -extern void minios_evtchn_close_fd(int fd);
>
> extern struct wait_queue_head event_queue;
>
> -static xc_osdep_handle minios_privcmd_open(xc_interface *xch)
> -{
> - int fd = alloc_fd(FTYPE_XC);
> -
> - if ( fd == -1)
> - return XC_OSDEP_OPEN_ERROR;
> -
> - return (xc_osdep_handle)fd;
> -}
> -
> -static int minios_privcmd_close(xc_interface *xch, xc_osdep_handle h)
> -{
> - int fd = (int)h;
> - return close(fd);
> -}
> -
> -void minios_interface_close_fd(int fd)
> -{
> - files[fd].type = FTYPE_NONE;
> -}
> -
> -static void *minios_privcmd_alloc_hypercall_buffer(xc_interface *xch,
> xc_osdep_handle h, int npages)
> -{
> - return xc_memalign(xch, PAGE_SIZE, npages * PAGE_SIZE);
> -}
> -
> -static void minios_privcmd_free_hypercall_buffer(xc_interface *xch,
> xc_osdep_handle h, void *ptr, int npages)
> -{
> - free(ptr);
> -}
> -
> -static int minios_privcmd_hypercall(xc_interface *xch, xc_osdep_handle h,
> privcmd_hypercall_t *hypercall)
> -{
> - multicall_entry_t call;
> - int i, ret;
> -
> - call.op = hypercall->op;
> - for (i = 0; i < ARRAY_SIZE(hypercall->arg); i++)
> - call.args[i] = hypercall->arg[i];
> -
> - ret = HYPERVISOR_multicall(&call, 1);
> -
> - if (ret < 0) {
> - errno = -ret;
> - return -1;
> - }
> - if ((long) call.result < 0) {
> - errno = - (long) call.result;
> - return -1;
> - }
> - return call.result;
> -}
> -
> -static void *minios_privcmd_map_foreign_bulk(xc_interface *xch,
> xc_osdep_handle h,
> - uint32_t dom, int prot,
> - const xen_pfn_t *arr, int *err,
> unsigned int num)
> -{
> - unsigned long pt_prot = 0;
> - if (prot & PROT_READ)
> - pt_prot = L1_PROT_RO;
> - if (prot & PROT_WRITE)
> - pt_prot = L1_PROT;
> - return map_frames_ex(arr, num, 1, 0, 1, dom, err, pt_prot);
> -}
> -
> -static void *minios_privcmd_map_foreign_batch(xc_interface *xch,
> xc_osdep_handle h,
> - uint32_t dom, int prot,
> - xen_pfn_t *arr, int num)
> -{
> - unsigned long pt_prot = 0;
> - int err[num];
> - int i;
> - unsigned long addr;
> -
> - if (prot & PROT_READ)
> - pt_prot = L1_PROT_RO;
> - if (prot & PROT_WRITE)
> - pt_prot = L1_PROT;
> -
> - addr = (unsigned long) map_frames_ex(arr, num, 1, 0, 1, dom, err,
> pt_prot);
> - for (i = 0; i < num; i++) {
> - if (err[i])
> - arr[i] |= 0xF0000000;
> - }
> - return (void *) addr;
> -}
> -
> -static void *minios_privcmd_map_foreign_range(xc_interface *xch,
> xc_osdep_handle h,
> - uint32_t dom,
> - int size, int prot,
> - unsigned long mfn)
> -{
> - unsigned long pt_prot = 0;
> -
> - if (prot & PROT_READ)
> - pt_prot = L1_PROT_RO;
> - if (prot & PROT_WRITE)
> - pt_prot = L1_PROT;
> -
> - assert(!(size % getpagesize()));
> - return map_frames_ex(&mfn, size / getpagesize(), 0, 1, 1, dom, NULL,
> pt_prot);
> -}
> -
> -static void *minios_privcmd_map_foreign_ranges(xc_interface *xch,
> xc_osdep_handle h,
> - uint32_t dom,
> - size_t size, int prot, size_t
> chunksize,
> - privcmd_mmap_entry_t
> entries[], int nentries)
> -{
> - unsigned long *mfns;
> - int i, j, n;
> - unsigned long pt_prot = 0;
> - void *ret;
> -
> - if (prot & PROT_READ)
> - pt_prot = L1_PROT_RO;
> - if (prot & PROT_WRITE)
> - pt_prot = L1_PROT;
> -
> - mfns = malloc((size / XC_PAGE_SIZE) * sizeof(*mfns));
> -
> - n = 0;
> - for (i = 0; i < nentries; i++)
> - for (j = 0; j < chunksize / XC_PAGE_SIZE; j++)
> - mfns[n++] = entries[i].mfn + j;
> -
> - ret = map_frames_ex(mfns, n, 1, 0, 1, dom, NULL, pt_prot);
> - free(mfns);
> - return ret;
> -}
> -
> -
> -static struct xc_osdep_ops minios_privcmd_ops = {
> - .open = &minios_privcmd_open,
> - .close = &minios_privcmd_close,
> -
> - .u.privcmd = {
> - .alloc_hypercall_buffer = &minios_privcmd_alloc_hypercall_buffer,
> - .free_hypercall_buffer = &minios_privcmd_free_hypercall_buffer,
> -
> - .hypercall = &minios_privcmd_hypercall,
> -
> - .map_foreign_batch = &minios_privcmd_map_foreign_batch,
> - .map_foreign_bulk = &minios_privcmd_map_foreign_bulk,
> - .map_foreign_range = &minios_privcmd_map_foreign_range,
> - .map_foreign_ranges = &minios_privcmd_map_foreign_ranges,
> - },
> -};
> -
> -
> /* XXX Note: This is not threadsafe */
> static struct evtchn_port_info* port_alloc(int fd) {
> struct evtchn_port_info *port_info;
> @@ -409,7 +255,7 @@ static int minios_evtchn_unmask(xc_evtchn *xce,
> xc_osdep_handle h, evtchn_port_t
> return 0;
> }
>
> -static struct xc_osdep_ops minios_evtchn_ops = {
> +struct xc_osdep_ops xc_evtchn_ops = {
> .open = &minios_evtchn_open,
> .close = &minios_evtchn_close,
>
> @@ -437,97 +283,16 @@ void *xc_memalign(xc_interface *xch, size_t alignment,
> size_t size)
> return memalign(alignment, size);
> }
>
> -static xc_osdep_handle minios_gnttab_open(xc_gnttab *xcg)
> -{
> - int fd = alloc_fd(FTYPE_GNTMAP);
> - if ( fd == -1 )
> - return XC_OSDEP_OPEN_ERROR;
> - gntmap_init(&files[fd].gntmap);
> - return (xc_osdep_handle)fd;
> -}
> -
> -static int minios_gnttab_close(xc_gnttab *xcg, xc_osdep_handle h)
> -{
> - int fd = (int)h;
> - return close(fd);
> -}
> -
> -void minios_gnttab_close_fd(int fd)
> -{
> - gntmap_fini(&files[fd].gntmap);
> - files[fd].type = FTYPE_NONE;
> -}
> -
> -static void *minios_gnttab_grant_map(xc_gnttab *xcg, xc_osdep_handle h,
> - uint32_t count, int flags, int prot,
> - uint32_t *domids, uint32_t *refs,
> - uint32_t notify_offset,
> - evtchn_port_t notify_port)
> -{
> - int fd = (int)h;
> - int stride = 1;
> - if (flags & XC_GRANT_MAP_SINGLE_DOMAIN)
> - stride = 0;
> - if (notify_offset != -1 || notify_port != -1) {
> - errno = ENOSYS;
> - return NULL;
> - }
> - return gntmap_map_grant_refs(&files[fd].gntmap,
> - count, domids, stride,
> - refs, prot & PROT_WRITE);
> -}
> -
> -static int minios_gnttab_munmap(xc_gnttab *xcg, xc_osdep_handle h,
> - void *start_address,
> - uint32_t count)
> -{
> - int fd = (int)h;
> - int ret;
> - ret = gntmap_munmap(&files[fd].gntmap,
> - (unsigned long) start_address,
> - count);
> - if (ret < 0) {
> - errno = -ret;
> - return -1;
> - }
> - return ret;
> -}
> -
> -static int minios_gnttab_set_max_grants(xc_gnttab *xcg, xc_osdep_handle h,
> - uint32_t count)
> -{
> - int fd = (int)h;
> - int ret;
> - ret = gntmap_set_max_grants(&files[fd].gntmap,
> - count);
> - if (ret < 0) {
> - errno = -ret;
> - return -1;
> - }
> - return ret;
> -}
> -
> -static struct xc_osdep_ops minios_gnttab_ops = {
> - .open = &minios_gnttab_open,
> - .close = &minios_gnttab_close,
> -
> - .u.gnttab = {
> - .grant_map = &minios_gnttab_grant_map,
> - .munmap = &minios_gnttab_munmap,
> - .set_max_grants = &minios_gnttab_set_max_grants,
> - },
> -};
> -
> static struct xc_osdep_ops *minios_osdep_init(xc_interface *xch, enum
> xc_osdep_type type)
> {
> switch ( type )
> {
> case XC_OSDEP_PRIVCMD:
> - return &minios_privcmd_ops;
> + return &xc_privcmd_ops;
> case XC_OSDEP_EVTCHN:
> - return &minios_evtchn_ops;
> + return &xc_evtchn_ops;
> case XC_OSDEP_GNTTAB:
> - return &minios_gnttab_ops;
> + return &xc_gnttab_ops;
> default:
> return NULL;
> }
> diff --git a/tools/libxc/xc_minios_privcmd.c b/tools/libxc/xc_minios_privcmd.c
> new file mode 100644
> index 0000000..7766b86
> --- /dev/null
> +++ b/tools/libxc/xc_minios_privcmd.c
> @@ -0,0 +1,291 @@
> +/******************************************************************************
> + *
> + * Copyright 2007-2008 Samuel Thibault <samuel.thibault@xxxxxxxxxxxxx>.
> + * All rights reserved.
> + * Use is subject to license terms.
> + *
> + * 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
> + */
> +
> +#undef NDEBUG
> +#include "xen-external/bsd-sys-queue.h"
> +#include <mini-os/types.h>
> +#include <mini-os/os.h>
> +#include <mini-os/mm.h>
> +#include <mini-os/lib.h>
> +#include <mini-os/gntmap.h>
> +#include <mini-os/events.h>
> +#include <mini-os/wait.h>
> +#include <sys/mman.h>
> +
> +#include <xen/memory.h>
> +#include <unistd.h>
> +#include <fcntl.h>
> +#include <stdio.h>
> +#include <assert.h>
> +#include <stdint.h>
> +#include <inttypes.h>
> +#include <malloc.h>
> +
> +#include "xc_private.h"
> +
> +#ifdef __RUMPRUN___
> +# define map_frames_ex minios_map_frames_ex
> +#endif /* __RUMPRUN__ */
> +
> +void minios_interface_close_fd(int fd);
> +void minios_gnttab_close_fd(int fd);
> +
> +static xc_osdep_handle minios_privcmd_open(xc_interface *xch)
> +{
> + int fd = alloc_fd(FTYPE_XC);
> +
> + if ( fd == -1)
> + return XC_OSDEP_OPEN_ERROR;
> +
> + return (xc_osdep_handle)fd;
> +}
> +
> +static int minios_privcmd_close(xc_interface *xch, xc_osdep_handle h)
> +{
> + int fd = (int)h;
> + return close(fd);
> +}
> +
> +void minios_interface_close_fd(int fd)
> +{
> + files[fd].type = FTYPE_NONE;
> +}
> +
> +static void *minios_privcmd_alloc_hypercall_buffer(xc_interface *xch,
> + xc_osdep_handle h,
> + int npages)
> +{
> + return xc_memalign(xch, PAGE_SIZE, npages * PAGE_SIZE);
> +}
> +
> +static void minios_privcmd_free_hypercall_buffer(xc_interface *xch,
> + xc_osdep_handle h,
> + void *ptr, int npages)
> +{
> + free(ptr);
> +}
> +
> +static int minios_privcmd_hypercall(xc_interface *xch, xc_osdep_handle h,
> + privcmd_hypercall_t *hypercall)
> +{
> + multicall_entry_t call;
> + int i, ret;
> +
> + call.op = hypercall->op;
> + for (i = 0; i < ARRAY_SIZE(hypercall->arg); i++)
> + call.args[i] = hypercall->arg[i];
> +
> + ret = HYPERVISOR_multicall(&call, 1);
> +
> + if (ret < 0) {
> + errno = -ret;
> + return -1;
> + }
> + if ((long) call.result < 0) {
> + errno = - (long) call.result;
> + return -1;
> + }
> + return call.result;
> +}
> +
> +static void *minios_privcmd_map_foreign_bulk(xc_interface *xch,
> + xc_osdep_handle h,
> + uint32_t dom, int prot,
> + const xen_pfn_t *arr,
> + int *err, unsigned int num)
> +{
> + unsigned long pt_prot = 0;
> + if (prot & PROT_READ)
> + pt_prot = L1_PROT_RO;
> + if (prot & PROT_WRITE)
> + pt_prot = L1_PROT;
> + return map_frames_ex(arr, num, 1, 0, 1, dom, err, pt_prot);
> +}
> +
> +static void *minios_privcmd_map_foreign_batch(xc_interface *xch,
> + xc_osdep_handle h,
> + uint32_t dom, int prot,
> + xen_pfn_t *arr, int num)
> +{
> + unsigned long pt_prot = 0;
> + int err[num];
> + int i;
> + unsigned long addr;
> +
> + if (prot & PROT_READ)
> + pt_prot = L1_PROT_RO;
> + if (prot & PROT_WRITE)
> + pt_prot = L1_PROT;
> +
> + addr = (unsigned long) map_frames_ex(arr, num, 1, 0, 1, dom, err,
> pt_prot);
> + for (i = 0; i < num; i++) {
> + if (err[i])
> + arr[i] |= 0xF0000000;
> + }
> + return (void *) addr;
> +}
> +
> +static void *minios_privcmd_map_foreign_range(xc_interface *xch,
> + xc_osdep_handle h,
> + uint32_t dom,
> + int size, int prot,
> + unsigned long mfn)
> +{
> + unsigned long pt_prot = 0;
> +
> + if (prot & PROT_READ)
> + pt_prot = L1_PROT_RO;
> + if (prot & PROT_WRITE)
> + pt_prot = L1_PROT;
> +
> + assert(!(size % getpagesize()));
> + return map_frames_ex(&mfn, size / getpagesize(), 0, 1, 1, dom,
> + NULL, pt_prot);
> +}
> +
> +static void *minios_privcmd_map_foreign_ranges(xc_interface *xch,
> + xc_osdep_handle h,
> + uint32_t dom,
> + size_t size, int prot,
> + size_t chunksize,
> + privcmd_mmap_entry_t
> entries[],
> + int nentries)
> +{
> + unsigned long *mfns;
> + int i, j, n;
> + unsigned long pt_prot = 0;
> + void *ret;
> +
> + if (prot & PROT_READ)
> + pt_prot = L1_PROT_RO;
> + if (prot & PROT_WRITE)
> + pt_prot = L1_PROT;
> +
> + mfns = malloc((size / XC_PAGE_SIZE) * sizeof(*mfns));
> +
> + n = 0;
> + for (i = 0; i < nentries; i++)
> + for (j = 0; j < chunksize / XC_PAGE_SIZE; j++)
> + mfns[n++] = entries[i].mfn + j;
> +
> + ret = map_frames_ex(mfns, n, 1, 0, 1, dom, NULL, pt_prot);
> + free(mfns);
> + return ret;
> +}
> +
> +struct xc_osdep_ops xc_privcmd_ops = {
> + .open = &minios_privcmd_open,
> + .close = &minios_privcmd_close,
> +
> + .u.privcmd = {
> + .alloc_hypercall_buffer = &minios_privcmd_alloc_hypercall_buffer,
> + .free_hypercall_buffer = &minios_privcmd_free_hypercall_buffer,
> +
> + .hypercall = &minios_privcmd_hypercall,
> +
> + .map_foreign_batch = &minios_privcmd_map_foreign_batch,
> + .map_foreign_bulk = &minios_privcmd_map_foreign_bulk,
> + .map_foreign_range = &minios_privcmd_map_foreign_range,
> + .map_foreign_ranges = &minios_privcmd_map_foreign_ranges,
> + },
> +};
> +
> +static xc_osdep_handle minios_gnttab_open(xc_gnttab *xcg)
> +{
> + int fd = alloc_fd(FTYPE_GNTMAP);
> + if ( fd == -1 )
> + return XC_OSDEP_OPEN_ERROR;
> + gntmap_init(&files[fd].gntmap);
> + return (xc_osdep_handle)fd;
> +}
> +
> +static int minios_gnttab_close(xc_gnttab *xcg, xc_osdep_handle h)
> +{
> + int fd = (int)h;
> + return close(fd);
> +}
> +
> +void minios_gnttab_close_fd(int fd)
> +{
> + gntmap_fini(&files[fd].gntmap);
> + files[fd].type = FTYPE_NONE;
> +}
> +
> +static void *minios_gnttab_grant_map(xc_gnttab *xcg, xc_osdep_handle h,
> + uint32_t count, int flags, int prot,
> + uint32_t *domids, uint32_t *refs,
> + uint32_t notify_offset,
> + evtchn_port_t notify_port)
> +{
> + int fd = (int)h;
> + int stride = 1;
> + if (flags & XC_GRANT_MAP_SINGLE_DOMAIN)
> + stride = 0;
> + if (notify_offset != -1 || notify_port != -1) {
> + errno = ENOSYS;
> + return NULL;
> + }
> + return gntmap_map_grant_refs(&files[fd].gntmap,
> + count, domids, stride,
> + refs, prot & PROT_WRITE);
> +}
> +
> +static int minios_gnttab_munmap(xc_gnttab *xcg, xc_osdep_handle h,
> + void *start_address,
> + uint32_t count)
> +{
> + int fd = (int)h;
> + int ret;
> + ret = gntmap_munmap(&files[fd].gntmap,
> + (unsigned long) start_address,
> + count);
> + if (ret < 0) {
> + errno = -ret;
> + return -1;
> + }
> + return ret;
> +}
> +
> +static int minios_gnttab_set_max_grants(xc_gnttab *xcg, xc_osdep_handle h,
> + uint32_t count)
> +{
> + int fd = (int)h;
> + int ret;
> + ret = gntmap_set_max_grants(&files[fd].gntmap,
> + count);
> + if (ret < 0) {
> + errno = -ret;
> + return -1;
> + }
> + return ret;
> +}
> +
> +struct xc_osdep_ops xc_gnttab_ops = {
> + .open = &minios_gnttab_open,
> + .close = &minios_gnttab_close,
> +
> + .u.gnttab = {
> + .grant_map = &minios_gnttab_grant_map,
> + .munmap = &minios_gnttab_munmap,
> + .set_max_grants = &minios_gnttab_set_max_grants,
> + },
> +};
> +
> diff --git a/tools/libxc/xc_private.h b/tools/libxc/xc_private.h
> index 45b8644..152465f 100644
> --- a/tools/libxc/xc_private.h
> +++ b/tools/libxc/xc_private.h
> @@ -111,6 +111,9 @@ struct xc_interface_core {
> xc_osdep_handle ops_handle; /* opaque data for xc_osdep_ops */
> };
>
> +/* Do not use these directly; go via the handle you already have. */
> +extern struct xc_osdep_ops xc_privcmd_ops, xc_evtchn_ops, xc_gnttab_ops;
> +
> void xc_report_error(xc_interface *xch, int code, const char *fmt, ...)
> __attribute__((format(printf,3,4)));
> void xc_reportv(xc_interface *xch, xentoollog_logger *lg, xentoollog_level,
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |