# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1287756891 -3600
# Node ID dfdfb1ec4ad03f2b7bdeababfd78e1c5b5575842
# Parent 8c2f8fd6148da8ffee46b4bdcf108e39df038e63
libxc: convert acm interfaces over to hypercall buffers
Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
Signed-off-by: Ian Jackson <ian.jackson.citrix.com>
---
tools/libxc/xc_acm.c | 39 +++++++++++++++++++++------------------
1 files changed, 21 insertions(+), 18 deletions(-)
diff -r 8c2f8fd6148d -r dfdfb1ec4ad0 tools/libxc/xc_acm.c
--- a/tools/libxc/xc_acm.c Fri Oct 22 15:14:51 2010 +0100
+++ b/tools/libxc/xc_acm.c Fri Oct 22 15:14:51 2010 +0100
@@ -27,12 +27,19 @@ int xc_acm_op(xc_interface *xch, int cmd
{
int ret;
DECLARE_HYPERCALL;
- struct xen_acmctl acmctl;
+ DECLARE_HYPERCALL_BUFFER(struct xen_acmctl, acmctl);
+
+ acmctl = xc_hypercall_buffer_alloc(xch, acmctl, sizeof(*acmctl));
+ if ( acmctl == NULL )
+ {
+ PERROR("Could not allocate memory for ACM OP hypercall");
+ return -EFAULT;
+ }
switch (cmd) {
case ACMOP_setpolicy: {
struct acm_setpolicy *setpolicy = (struct acm_setpolicy *)arg;
- memcpy(&acmctl.u.setpolicy,
+ memcpy(&acmctl->u.setpolicy,
setpolicy,
sizeof(struct acm_setpolicy));
}
@@ -40,7 +47,7 @@ int xc_acm_op(xc_interface *xch, int cmd
case ACMOP_getpolicy: {
struct acm_getpolicy *getpolicy = (struct acm_getpolicy *)arg;
- memcpy(&acmctl.u.getpolicy,
+ memcpy(&acmctl->u.getpolicy,
getpolicy,
sizeof(struct acm_getpolicy));
}
@@ -48,7 +55,7 @@ int xc_acm_op(xc_interface *xch, int cmd
case ACMOP_dumpstats: {
struct acm_dumpstats *dumpstats = (struct acm_dumpstats *)arg;
- memcpy(&acmctl.u.dumpstats,
+ memcpy(&acmctl->u.dumpstats,
dumpstats,
sizeof(struct acm_dumpstats));
}
@@ -56,7 +63,7 @@ int xc_acm_op(xc_interface *xch, int cmd
case ACMOP_getssid: {
struct acm_getssid *getssid = (struct acm_getssid *)arg;
- memcpy(&acmctl.u.getssid,
+ memcpy(&acmctl->u.getssid,
getssid,
sizeof(struct acm_getssid));
}
@@ -64,7 +71,7 @@ int xc_acm_op(xc_interface *xch, int cmd
case ACMOP_getdecision: {
struct acm_getdecision *getdecision = (struct acm_getdecision
*)arg;
- memcpy(&acmctl.u.getdecision,
+ memcpy(&acmctl->u.getdecision,
getdecision,
sizeof(struct acm_getdecision));
}
@@ -72,7 +79,7 @@ int xc_acm_op(xc_interface *xch, int cmd
case ACMOP_chgpolicy: {
struct acm_change_policy *change_policy = (struct
acm_change_policy *)arg;
- memcpy(&acmctl.u.change_policy,
+ memcpy(&acmctl->u.change_policy,
change_policy,
sizeof(struct acm_change_policy));
}
@@ -80,40 +87,36 @@ int xc_acm_op(xc_interface *xch, int cmd
case ACMOP_relabeldoms: {
struct acm_relabel_doms *relabel_doms = (struct acm_relabel_doms
*)arg;
- memcpy(&acmctl.u.relabel_doms,
+ memcpy(&acmctl->u.relabel_doms,
relabel_doms,
sizeof(struct acm_relabel_doms));
}
break;
}
- acmctl.cmd = cmd;
- acmctl.interface_version = ACM_INTERFACE_VERSION;
+ acmctl->cmd = cmd;
+ acmctl->interface_version = ACM_INTERFACE_VERSION;
hypercall.op = __HYPERVISOR_xsm_op;
- hypercall.arg[0] = (unsigned long)&acmctl;
- if ( lock_pages(xch, &acmctl, sizeof(acmctl)) != 0)
- {
- PERROR("Could not lock memory for Xen hypercall");
- return -EFAULT;
- }
+ hypercall.arg[0] = HYPERCALL_BUFFER_AS_ARG(acmctl);
if ( (ret = do_xen_hypercall(xch, &hypercall)) < 0)
{
if ( errno == EACCES )
DPRINTF("acmctl operation failed -- need to"
" rebuild the user-space tool set?\n");
}
- unlock_pages(xch, &acmctl, sizeof(acmctl));
switch (cmd) {
case ACMOP_getdecision: {
struct acm_getdecision *getdecision = (struct acm_getdecision
*)arg;
memcpy(getdecision,
- &acmctl.u.getdecision,
+ &acmctl->u.getdecision,
sizeof(struct acm_getdecision));
break;
}
}
+
+ xc_hypercall_buffer_free(xch, acmctl);
return ret;
}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|