diff options
author | Ian Campbell <ian.campbell@citrix.com> | 2010-10-22 15:14:51 +0100 |
---|---|---|
committer | Ian Campbell <ian.campbell@citrix.com> | 2010-10-22 15:14:51 +0100 |
commit | 79647c5bc9c62feeed8a1e50e7c73001ae10b23d (patch) | |
tree | a3132a6db9d4cea23c2936efd23e4078057d6341 /tools/libxc/xc_private.c | |
parent | 70d20aed9a6406842d3d957583fbe15c60fd84ec (diff) | |
download | xen-79647c5bc9c62feeed8a1e50e7c73001ae10b23d.tar.gz xen-79647c5bc9c62feeed8a1e50e7c73001ae10b23d.tar.bz2 xen-79647c5bc9c62feeed8a1e50e7c73001ae10b23d.zip |
libxc: convert domctl interfaces over to hypercall buffers
(defer save/restore and shadow related interfaces til a later patch)
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Ian Jackson <ian.jackson.citrix.com>
Diffstat (limited to 'tools/libxc/xc_private.c')
-rw-r--r-- | tools/libxc/xc_private.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/tools/libxc/xc_private.c b/tools/libxc/xc_private.c index 2b862a5814..2ef31f0827 100644 --- a/tools/libxc/xc_private.c +++ b/tools/libxc/xc_private.c @@ -320,12 +320,18 @@ void hcall_buf_release(xc_interface *xch, void **addr, size_t len) int xc_get_pfn_type_batch(xc_interface *xch, uint32_t dom, unsigned int num, xen_pfn_t *arr) { + int rc; DECLARE_DOMCTL; + DECLARE_HYPERCALL_BOUNCE(arr, sizeof(*arr) * num, XC_HYPERCALL_BUFFER_BOUNCE_BOTH); + if ( xc_hypercall_bounce_pre(xch, arr) ) + return -1; domctl.cmd = XEN_DOMCTL_getpageframeinfo3; domctl.domain = (domid_t)dom; domctl.u.getpageframeinfo3.num = num; - set_xen_guest_handle(domctl.u.getpageframeinfo3.array, arr); - return do_domctl(xch, &domctl); + xc_set_xen_guest_handle(domctl.u.getpageframeinfo3.array, arr); + rc = do_domctl(xch, &domctl); + xc_hypercall_bounce_post(xch, arr); + return rc; } int xc_mmuext_op( @@ -496,25 +502,27 @@ int xc_get_pfn_list(xc_interface *xch, unsigned long max_pfns) { DECLARE_DOMCTL; + DECLARE_HYPERCALL_BOUNCE(pfn_buf, max_pfns * sizeof(*pfn_buf), XC_HYPERCALL_BUFFER_BOUNCE_OUT); int ret; - domctl.cmd = XEN_DOMCTL_getmemlist; - domctl.domain = (domid_t)domid; - domctl.u.getmemlist.max_pfns = max_pfns; - set_xen_guest_handle(domctl.u.getmemlist.buffer, pfn_buf); #ifdef VALGRIND memset(pfn_buf, 0, max_pfns * sizeof(*pfn_buf)); #endif - if ( lock_pages(xch, pfn_buf, max_pfns * sizeof(*pfn_buf)) != 0 ) + if ( xc_hypercall_bounce_pre(xch, pfn_buf) ) { - PERROR("xc_get_pfn_list: pfn_buf lock failed"); + PERROR("xc_get_pfn_list: pfn_buf bounce failed"); return -1; } + domctl.cmd = XEN_DOMCTL_getmemlist; + domctl.domain = (domid_t)domid; + domctl.u.getmemlist.max_pfns = max_pfns; + xc_set_xen_guest_handle(domctl.u.getmemlist.buffer, pfn_buf); + ret = do_domctl(xch, &domctl); - unlock_pages(xch, pfn_buf, max_pfns * sizeof(*pfn_buf)); + xc_hypercall_bounce_post(xch, pfn_buf); return (ret < 0) ? -1 : domctl.u.getmemlist.num_pfns; } |