aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxc/xc_private.c
diff options
context:
space:
mode:
authorIan Campbell <ian.campbell@citrix.com>2010-10-22 15:14:51 +0100
committerIan Campbell <ian.campbell@citrix.com>2010-10-22 15:14:51 +0100
commit79647c5bc9c62feeed8a1e50e7c73001ae10b23d (patch)
treea3132a6db9d4cea23c2936efd23e4078057d6341 /tools/libxc/xc_private.c
parent70d20aed9a6406842d3d957583fbe15c60fd84ec (diff)
downloadxen-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.c26
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;
}