mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-26 10:31:16 +00:00
Solaris hypercall compatability fixes (Mark Johnson)
This commit is contained in:
parent
84b5415cbf
commit
0e7aa57385
@ -1,3 +1,8 @@
|
|||||||
|
Sat Sep 29 14:30:41 EST 2007 Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
|
||||||
|
* src/xen_internal.c, src/xs_internal.c: Solaris hypercall compat
|
||||||
|
changes. (Mark Johnson)
|
||||||
|
|
||||||
Sat Sep 29 14:23:41 EST 2007 Daniel P. Berrange <berrange@redhat.com>
|
Sat Sep 29 14:23:41 EST 2007 Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
|
||||||
* src/sexpr.h, src/sexpr.c, src/xml.c, src/xend_internal.c: Allow
|
* src/sexpr.h, src/sexpr.c, src/xml.c, src/xend_internal.c: Allow
|
||||||
|
@ -57,9 +57,10 @@ typedef struct v0_hypercall_struct {
|
|||||||
unsigned long op;
|
unsigned long op;
|
||||||
unsigned long arg[5];
|
unsigned long arg[5];
|
||||||
} v0_hypercall_t;
|
} v0_hypercall_t;
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
#define XEN_V0_IOCTL_HYPERCALL_CMD \
|
#define XEN_V0_IOCTL_HYPERCALL_CMD \
|
||||||
_IOC(_IOC_NONE, 'P', 0, sizeof(v0_hypercall_t))
|
_IOC(_IOC_NONE, 'P', 0, sizeof(v0_hypercall_t))
|
||||||
|
|
||||||
/* the new one */
|
/* the new one */
|
||||||
typedef struct v1_hypercall_struct
|
typedef struct v1_hypercall_struct
|
||||||
{
|
{
|
||||||
@ -68,8 +69,12 @@ typedef struct v1_hypercall_struct
|
|||||||
} v1_hypercall_t;
|
} v1_hypercall_t;
|
||||||
#define XEN_V1_IOCTL_HYPERCALL_CMD \
|
#define XEN_V1_IOCTL_HYPERCALL_CMD \
|
||||||
_IOC(_IOC_NONE, 'P', 0, sizeof(v1_hypercall_t))
|
_IOC(_IOC_NONE, 'P', 0, sizeof(v1_hypercall_t))
|
||||||
|
|
||||||
typedef v1_hypercall_t 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
|
#ifndef __HYPERVISOR_sysctl
|
||||||
#define __HYPERVISOR_sysctl 35
|
#define __HYPERVISOR_sysctl 35
|
||||||
@ -325,6 +330,26 @@ typedef struct xen_v2s4_availheap xen_v2s4_availheap;
|
|||||||
dominfo.v2d5.handle))
|
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 {
|
struct xen_v0_getdomaininfolistop {
|
||||||
domid_t first_domain;
|
domid_t first_domain;
|
||||||
@ -632,7 +657,17 @@ typedef struct xen_op_v2_dom xen_op_v2_dom;
|
|||||||
#include "xen_unified.h"
|
#include "xen_unified.h"
|
||||||
#include "xen_internal.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
|
#ifndef PROXY
|
||||||
static const char * xenHypervisorGetType(virConnectPtr conn);
|
static const char * xenHypervisorGetType(virConnectPtr conn);
|
||||||
@ -789,7 +824,7 @@ xenHypervisorDoV0Op(int handle, xen_op_v0 * op)
|
|||||||
hc.op = __HYPERVISOR_dom0_op;
|
hc.op = __HYPERVISOR_dom0_op;
|
||||||
hc.arg[0] = (unsigned long) 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));
|
virXenError(VIR_ERR_XEN_CALL, " locking", sizeof(*op));
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
@ -799,7 +834,7 @@ xenHypervisorDoV0Op(int handle, xen_op_v0 * op)
|
|||||||
virXenError(VIR_ERR_XEN_CALL, " ioctl ", xen_ioctl_hypercall_cmd);
|
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));
|
virXenError(VIR_ERR_XEN_CALL, " releasing", sizeof(*op));
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
@ -830,7 +865,7 @@ xenHypervisorDoV1Op(int handle, xen_op_v1* op)
|
|||||||
hc.op = __HYPERVISOR_dom0_op;
|
hc.op = __HYPERVISOR_dom0_op;
|
||||||
hc.arg[0] = (unsigned long) 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));
|
virXenError(VIR_ERR_XEN_CALL, " locking", sizeof(*op));
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
@ -840,7 +875,7 @@ xenHypervisorDoV1Op(int handle, xen_op_v1* op)
|
|||||||
virXenError(VIR_ERR_XEN_CALL, " ioctl ", xen_ioctl_hypercall_cmd);
|
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));
|
virXenError(VIR_ERR_XEN_CALL, " releasing", sizeof(*op));
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
@ -872,7 +907,7 @@ xenHypervisorDoV2Sys(int handle, xen_op_v2_sys* op)
|
|||||||
hc.op = __HYPERVISOR_sysctl;
|
hc.op = __HYPERVISOR_sysctl;
|
||||||
hc.arg[0] = (unsigned long) 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));
|
virXenError(VIR_ERR_XEN_CALL, " locking", sizeof(*op));
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
@ -882,7 +917,7 @@ xenHypervisorDoV2Sys(int handle, xen_op_v2_sys* op)
|
|||||||
virXenError(VIR_ERR_XEN_CALL, " sys ioctl ", xen_ioctl_hypercall_cmd);
|
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));
|
virXenError(VIR_ERR_XEN_CALL, " releasing", sizeof(*op));
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
@ -914,7 +949,7 @@ xenHypervisorDoV2Dom(int handle, xen_op_v2_dom* op)
|
|||||||
hc.op = __HYPERVISOR_domctl;
|
hc.op = __HYPERVISOR_domctl;
|
||||||
hc.arg[0] = (unsigned long) 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));
|
virXenError(VIR_ERR_XEN_CALL, " locking", sizeof(*op));
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
@ -924,7 +959,7 @@ xenHypervisorDoV2Dom(int handle, xen_op_v2_dom* op)
|
|||||||
virXenError(VIR_ERR_XEN_CALL, " ioctl ", xen_ioctl_hypercall_cmd);
|
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));
|
virXenError(VIR_ERR_XEN_CALL, " releasing", sizeof(*op));
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
@ -952,7 +987,7 @@ virXen_getdomaininfolist(int handle, int first_domain, int maxids,
|
|||||||
{
|
{
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
if (mlock(XEN_GETDOMAININFOLIST_DATA(dominfos),
|
if (lock_pages(XEN_GETDOMAININFOLIST_DATA(dominfos),
|
||||||
XEN_GETDOMAININFO_SIZE * maxids) < 0) {
|
XEN_GETDOMAININFO_SIZE * maxids) < 0) {
|
||||||
virXenError(VIR_ERR_XEN_CALL, " locking",
|
virXenError(VIR_ERR_XEN_CALL, " locking",
|
||||||
XEN_GETDOMAININFO_SIZE * maxids);
|
XEN_GETDOMAININFO_SIZE * maxids);
|
||||||
@ -1008,7 +1043,7 @@ virXen_getdomaininfolist(int handle, int first_domain, int maxids,
|
|||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = op.u.getdomaininfolist.num_domains;
|
ret = op.u.getdomaininfolist.num_domains;
|
||||||
}
|
}
|
||||||
if (munlock(XEN_GETDOMAININFOLIST_DATA(dominfos),
|
if (unlock_pages(XEN_GETDOMAININFOLIST_DATA(dominfos),
|
||||||
XEN_GETDOMAININFO_SIZE * maxids) < 0) {
|
XEN_GETDOMAININFO_SIZE * maxids) < 0) {
|
||||||
virXenError(VIR_ERR_XEN_CALL, " release",
|
virXenError(VIR_ERR_XEN_CALL, " release",
|
||||||
XEN_GETDOMAININFO_SIZE * maxids);
|
XEN_GETDOMAININFO_SIZE * maxids);
|
||||||
@ -1701,7 +1736,7 @@ virXen_setvcpumap(int handle, int id, unsigned int vcpu,
|
|||||||
if (hypervisor_version > 1) {
|
if (hypervisor_version > 1) {
|
||||||
xen_op_v2_dom op;
|
xen_op_v2_dom op;
|
||||||
|
|
||||||
if (mlock(cpumap, maplen) < 0) {
|
if (lock_pages(cpumap, maplen) < 0) {
|
||||||
virXenError(VIR_ERR_XEN_CALL, " locking", maplen);
|
virXenError(VIR_ERR_XEN_CALL, " locking", maplen);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
@ -1719,7 +1754,7 @@ virXen_setvcpumap(int handle, int id, unsigned int vcpu,
|
|||||||
}
|
}
|
||||||
ret = xenHypervisorDoV2Dom(handle, &op);
|
ret = xenHypervisorDoV2Dom(handle, &op);
|
||||||
|
|
||||||
if (munlock(cpumap, maplen) < 0) {
|
if (unlock_pages(cpumap, maplen) < 0) {
|
||||||
virXenError(VIR_ERR_XEN_CALL, " release", maplen);
|
virXenError(VIR_ERR_XEN_CALL, " release", maplen);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
@ -1816,7 +1851,7 @@ virXen_getvcpusinfo(int handle, int id, unsigned int vcpu, virVcpuInfoPtr ipt,
|
|||||||
ipt->cpu = op.u.getvcpuinfod5.online ? (int)op.u.getvcpuinfod5.cpu : -1;
|
ipt->cpu = op.u.getvcpuinfod5.online ? (int)op.u.getvcpuinfod5.cpu : -1;
|
||||||
}
|
}
|
||||||
if ((cpumap != NULL) && (maplen > 0)) {
|
if ((cpumap != NULL) && (maplen > 0)) {
|
||||||
if (mlock(cpumap, maplen) < 0) {
|
if (lock_pages(cpumap, maplen) < 0) {
|
||||||
virXenError(VIR_ERR_XEN_CALL, " locking", maplen);
|
virXenError(VIR_ERR_XEN_CALL, " locking", maplen);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
@ -1834,7 +1869,7 @@ virXen_getvcpusinfo(int handle, int id, unsigned int vcpu, virVcpuInfoPtr ipt,
|
|||||||
op.u.getvcpumapd5.cpumap.nr_cpus = maplen * 8;
|
op.u.getvcpumapd5.cpumap.nr_cpus = maplen * 8;
|
||||||
}
|
}
|
||||||
ret = xenHypervisorDoV2Dom(handle, &op);
|
ret = xenHypervisorDoV2Dom(handle, &op);
|
||||||
if (munlock(cpumap, maplen) < 0) {
|
if (unlock_pages(cpumap, maplen) < 0) {
|
||||||
virXenError(VIR_ERR_XEN_CALL, " release", maplen);
|
virXenError(VIR_ERR_XEN_CALL, " release", maplen);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
@ -1985,6 +2020,7 @@ xenHypervisorInit(void)
|
|||||||
goto detect_v2;
|
goto detect_v2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef __sun__
|
||||||
/*
|
/*
|
||||||
* check if the old hypercall are actually working
|
* check if the old hypercall are actually working
|
||||||
*/
|
*/
|
||||||
@ -2002,6 +2038,7 @@ xenHypervisorInit(void)
|
|||||||
hypervisor_version = 0;
|
hypervisor_version = 0;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* we faild to make any hypercall
|
* we faild to make any hypercall
|
||||||
|
@ -31,7 +31,13 @@
|
|||||||
#include "xs_internal.h"
|
#include "xs_internal.h"
|
||||||
#include "xen_internal.h" /* for xenHypervisorCheckID */
|
#include "xen_internal.h" /* for xenHypervisorCheckID */
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
#define XEN_HYPERVISOR_SOCKET "/proc/xen/privcmd"
|
#define XEN_HYPERVISOR_SOCKET "/proc/xen/privcmd"
|
||||||
|
#elif define(__sun__)
|
||||||
|
#define XEN_HYPERVISOR_SOCKET "/dev/xen/privcmd"
|
||||||
|
#else
|
||||||
|
#error "unsupported platform"
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef PROXY
|
#ifndef PROXY
|
||||||
static char *xenStoreDomainGetOSType(virDomainPtr domain);
|
static char *xenStoreDomainGetOSType(virDomainPtr domain);
|
||||||
|
Loading…
Reference in New Issue
Block a user