unsigned long op;
unsigned long arg[5];
} v0_hypercall_t;
+
+#ifdef __linux__
#define XEN_V0_IOCTL_HYPERCALL_CMD \
_IOC(_IOC_NONE, 'P', 0, sizeof(v0_hypercall_t))
-
/* the new one */
typedef struct v1_hypercall_struct
{
} v1_hypercall_t;
#define XEN_V1_IOCTL_HYPERCALL_CMD \
_IOC(_IOC_NONE, 'P', 0, sizeof(v1_hypercall_t))
-
typedef v1_hypercall_t hypercall_t;
+#elif define(__sun__)
+typedef privcmd_hypercall_t hypercall_t;
+#else
+#error "unsupported platform"
+#endif
#ifndef __HYPERVISOR_sysctl
#define __HYPERVISOR_sysctl 35
dominfo.v2d5.handle))
+static int
+lock_pages(void *addr, size_t len)
+{
+#ifdef __linux__
+ return (mlock(addr, len));
+#elif define(__sun)
+ return (0);
+#endif
+}
+
+static int
+unlock_pages(void *addr, size_t len)
+{
+#ifdef __linux__
+ return (munlock(addr, len));
+#elif define(__sun)
+ return (0);
+#endif
+}
+
struct xen_v0_getdomaininfolistop {
domid_t first_domain;
#include "xen_unified.h"
#include "xen_internal.h"
-#define XEN_HYPERVISOR_SOCKET "/proc/xen/privcmd"
+#ifdef __linux__
+#define XEN_HYPERVISOR_SOCKET "/proc/xen/privcmd"
+#define HYPERVISOR_CAPABILITIES "/sys/hypervisor/properties/capabilities"
+#define CPUINFO "/proc/cpuinfo"
+#elif define(__sun__)
+#define XEN_HYPERVISOR_SOCKET "/dev/xen/privcmd"
+#define HYPERVISOR_CAPABILITIES ""
+#define CPUINFO "/dev/cpu/self/cpuid"
+#else
+#error "unsupported platform"
+#endif
#ifndef PROXY
static const char * xenHypervisorGetType(virConnectPtr conn);
hc.op = __HYPERVISOR_dom0_op;
hc.arg[0] = (unsigned long) op;
- if (mlock(op, sizeof(dom0_op_t)) < 0) {
+ if (lock_pages(op, sizeof(dom0_op_t)) < 0) {
virXenError(VIR_ERR_XEN_CALL, " locking", sizeof(*op));
return (-1);
}
virXenError(VIR_ERR_XEN_CALL, " ioctl ", xen_ioctl_hypercall_cmd);
}
- if (munlock(op, sizeof(dom0_op_t)) < 0) {
+ if (unlock_pages(op, sizeof(dom0_op_t)) < 0) {
virXenError(VIR_ERR_XEN_CALL, " releasing", sizeof(*op));
ret = -1;
}
hc.op = __HYPERVISOR_dom0_op;
hc.arg[0] = (unsigned long) op;
- if (mlock(op, sizeof(dom0_op_t)) < 0) {
+ if (lock_pages(op, sizeof(dom0_op_t)) < 0) {
virXenError(VIR_ERR_XEN_CALL, " locking", sizeof(*op));
return (-1);
}
virXenError(VIR_ERR_XEN_CALL, " ioctl ", xen_ioctl_hypercall_cmd);
}
- if (munlock(op, sizeof(dom0_op_t)) < 0) {
+ if (unlock_pages(op, sizeof(dom0_op_t)) < 0) {
virXenError(VIR_ERR_XEN_CALL, " releasing", sizeof(*op));
ret = -1;
}
hc.op = __HYPERVISOR_sysctl;
hc.arg[0] = (unsigned long) op;
- if (mlock(op, sizeof(dom0_op_t)) < 0) {
+ if (lock_pages(op, sizeof(dom0_op_t)) < 0) {
virXenError(VIR_ERR_XEN_CALL, " locking", sizeof(*op));
return (-1);
}
virXenError(VIR_ERR_XEN_CALL, " sys ioctl ", xen_ioctl_hypercall_cmd);
}
- if (munlock(op, sizeof(dom0_op_t)) < 0) {
+ if (unlock_pages(op, sizeof(dom0_op_t)) < 0) {
virXenError(VIR_ERR_XEN_CALL, " releasing", sizeof(*op));
ret = -1;
}
hc.op = __HYPERVISOR_domctl;
hc.arg[0] = (unsigned long) op;
- if (mlock(op, sizeof(dom0_op_t)) < 0) {
+ if (lock_pages(op, sizeof(dom0_op_t)) < 0) {
virXenError(VIR_ERR_XEN_CALL, " locking", sizeof(*op));
return (-1);
}
virXenError(VIR_ERR_XEN_CALL, " ioctl ", xen_ioctl_hypercall_cmd);
}
- if (munlock(op, sizeof(dom0_op_t)) < 0) {
+ if (unlock_pages(op, sizeof(dom0_op_t)) < 0) {
virXenError(VIR_ERR_XEN_CALL, " releasing", sizeof(*op));
ret = -1;
}
{
int ret = -1;
- if (mlock(XEN_GETDOMAININFOLIST_DATA(dominfos),
+ if (lock_pages(XEN_GETDOMAININFOLIST_DATA(dominfos),
XEN_GETDOMAININFO_SIZE * maxids) < 0) {
virXenError(VIR_ERR_XEN_CALL, " locking",
XEN_GETDOMAININFO_SIZE * maxids);
if (ret == 0)
ret = op.u.getdomaininfolist.num_domains;
}
- if (munlock(XEN_GETDOMAININFOLIST_DATA(dominfos),
+ if (unlock_pages(XEN_GETDOMAININFOLIST_DATA(dominfos),
XEN_GETDOMAININFO_SIZE * maxids) < 0) {
virXenError(VIR_ERR_XEN_CALL, " release",
XEN_GETDOMAININFO_SIZE * maxids);
if (hypervisor_version > 1) {
xen_op_v2_dom op;
- if (mlock(cpumap, maplen) < 0) {
+ if (lock_pages(cpumap, maplen) < 0) {
virXenError(VIR_ERR_XEN_CALL, " locking", maplen);
return (-1);
}
}
ret = xenHypervisorDoV2Dom(handle, &op);
- if (munlock(cpumap, maplen) < 0) {
+ if (unlock_pages(cpumap, maplen) < 0) {
virXenError(VIR_ERR_XEN_CALL, " release", maplen);
ret = -1;
}
ipt->cpu = op.u.getvcpuinfod5.online ? (int)op.u.getvcpuinfod5.cpu : -1;
}
if ((cpumap != NULL) && (maplen > 0)) {
- if (mlock(cpumap, maplen) < 0) {
+ if (lock_pages(cpumap, maplen) < 0) {
virXenError(VIR_ERR_XEN_CALL, " locking", maplen);
return (-1);
}
op.u.getvcpumapd5.cpumap.nr_cpus = maplen * 8;
}
ret = xenHypervisorDoV2Dom(handle, &op);
- if (munlock(cpumap, maplen) < 0) {
+ if (unlock_pages(cpumap, maplen) < 0) {
virXenError(VIR_ERR_XEN_CALL, " release", maplen);
ret = -1;
}
goto detect_v2;
}
+#ifndef __sun__
/*
* check if the old hypercall are actually working
*/
hypervisor_version = 0;
goto done;
}
+#endif
/*
* we faild to make any hypercall