aboutsummaryrefslogtreecommitdiffstats
path: root/tools/xenstat
diff options
context:
space:
mode:
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2006-02-10 00:16:53 +0100
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2006-02-10 00:16:53 +0100
commit30ed8dac34a5a8e097484fa581afa9eb12b2429f (patch)
treeeb3b4525fc23f3b224323529652087db212cc65d /tools/xenstat
parentf1e6a1060ad3f381d7c678b1d346afb1b183ba07 (diff)
downloadxen-30ed8dac34a5a8e097484fa581afa9eb12b2429f.tar.gz
xen-30ed8dac34a5a8e097484fa581afa9eb12b2429f.tar.bz2
xen-30ed8dac34a5a8e097484fa581afa9eb12b2429f.zip
Check the hypercall number in the privcmd hypercall ioctl.
We check it is a member of a small set of permitted hypercalls. Fix libxenstat to not use multicalls (not permitted, and not need for efficiency in libxenstat). Based on an original patch by Chris Wright. Signed-off-by: Keir Fraser <keir@xensource.com> Signed-off-by: Chris Wright <chrisw@sous-sol.org>
Diffstat (limited to 'tools/xenstat')
-rw-r--r--tools/xenstat/libxenstat/src/xen-interface.c43
1 files changed, 20 insertions, 23 deletions
diff --git a/tools/xenstat/libxenstat/src/xen-interface.c b/tools/xenstat/libxenstat/src/xen-interface.c
index 8c06449db3..6b6fa6b9fb 100644
--- a/tools/xenstat/libxenstat/src/xen-interface.c
+++ b/tools/xenstat/libxenstat/src/xen-interface.c
@@ -61,43 +61,40 @@ static int xi_make_xen_version_hypercall(xi_handle *handle, long *vnum,
xen_extraversion_t *ver)
{
privcmd_hypercall_t privcmd;
- multicall_entry_t multicall[2];
int ret = 0;
- /* set up for doing hypercall */
- privcmd.op = __HYPERVISOR_multicall;
- privcmd.arg[0] = (unsigned long)multicall;
- privcmd.arg[1] = 2;
-
- /* first one to get xen version number */
- multicall[0].op = __HYPERVISOR_xen_version;
- multicall[0].args[0] = (unsigned long)XENVER_version;
-
- /* second to get xen version flag */
- multicall[1].op = __HYPERVISOR_xen_version;
- multicall[1].args[0] = (unsigned long)XENVER_extraversion;
- multicall[1].args[1] = (unsigned long)ver;
-
- if (mlock( &privcmd, sizeof(privcmd_hypercall_t)) < 0) {
+ if (mlock(&privcmd, sizeof(privcmd)) < 0) {
perror("Failed to mlock privcmd structure");
return -1;
}
- if (mlock( multicall, sizeof(multicall_entry_t)) < 0) {
- perror("Failed to mlock multicall_entry structure");
- munlock( &multicall, sizeof(multicall_entry_t));
+ if (mlock(ver, sizeof(*ver)) < 0) {
+ perror("Failed to mlock extraversion structure");
+ munlock(&privcmd, sizeof(privcmd));
return -1;
}
- if (ioctl( handle->fd, IOCTL_PRIVCMD_HYPERCALL, &privcmd) < 0) {
+ privcmd.op = __HYPERVISOR_xen_version;
+ privcmd.arg[0] = (unsigned long)XENVER_version;
+ privcmd.arg[1] = 0;
+
+ *vnum = ioctl(handle->fd, IOCTL_PRIVCMD_HYPERCALL, &privcmd);
+ if (*vnum < 0) {
perror("Hypercall failed");
ret = -1;
}
- *vnum = multicall[0].result;
+ privcmd.op = __HYPERVISOR_xen_version;
+ privcmd.arg[0] = (unsigned long)XENVER_extraversion;
+ privcmd.arg[1] = (unsigned long)ver;
- munlock( &privcmd, sizeof(privcmd_hypercall_t));
- munlock( &multicall, sizeof(multicall_entry_t));
+ if (ioctl(handle->fd, IOCTL_PRIVCMD_HYPERCALL, &privcmd) < 0) {
+ perror("Hypercall failed");
+ ret = -1;
+ }
+
+ munlock(&privcmd, sizeof(privcmd));
+ munlock(ver, sizeof(*ver));
return ret;
}