]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Solaris hypercall compatability fixes (Mark Johnson)
authorDaniel P. Berrange <berrange@redhat.com>
Sat, 29 Sep 2007 18:37:47 +0000 (18:37 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Sat, 29 Sep 2007 18:37:47 +0000 (18:37 +0000)
ChangeLog
src/xen_internal.c
src/xs_internal.c

index b0c46167c528e97abd6e4a5e810610aca427e9b5..0efee894b9a6701f3cbbf188c810dfa71874e9db 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
 
        * src/sexpr.h, src/sexpr.c, src/xml.c, src/xend_internal.c: Allow
index 891e856a3613f5b3c2998f5ea1bfbb2c1bdab0c7..8cc5a5cf805f39613178457805e795f8b7861c7e 100644 (file)
@@ -57,9 +57,10 @@ typedef struct v0_hypercall_struct {
     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
 {
@@ -68,8 +69,12 @@ 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
@@ -325,6 +330,26 @@ typedef struct xen_v2s4_availheap  xen_v2s4_availheap;
       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;
@@ -632,7 +657,17 @@ typedef struct xen_op_v2_dom xen_op_v2_dom;
 #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);
@@ -789,7 +824,7 @@ xenHypervisorDoV0Op(int handle, xen_op_v0 * op)
     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);
     }
@@ -799,7 +834,7 @@ xenHypervisorDoV0Op(int handle, xen_op_v0 * op)
         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;
     }
@@ -830,7 +865,7 @@ xenHypervisorDoV1Op(int handle, xen_op_v1* op)
     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);
     }
@@ -840,7 +875,7 @@ xenHypervisorDoV1Op(int handle, xen_op_v1* op)
         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;
     }
@@ -872,7 +907,7 @@ xenHypervisorDoV2Sys(int handle, xen_op_v2_sys* op)
     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);
     }
@@ -882,7 +917,7 @@ xenHypervisorDoV2Sys(int handle, xen_op_v2_sys* op)
         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;
     }
@@ -914,7 +949,7 @@ xenHypervisorDoV2Dom(int handle, xen_op_v2_dom* op)
     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);
     }
@@ -924,7 +959,7 @@ xenHypervisorDoV2Dom(int handle, xen_op_v2_dom* op)
         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;
     }
@@ -952,7 +987,7 @@ virXen_getdomaininfolist(int handle, int first_domain, int maxids,
 {
     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);
@@ -1008,7 +1043,7 @@ virXen_getdomaininfolist(int handle, int first_domain, int 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);
@@ -1701,7 +1736,7 @@ virXen_setvcpumap(int handle, int id, unsigned int vcpu,
     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);
         }
@@ -1719,7 +1754,7 @@ virXen_setvcpumap(int handle, int id, unsigned int vcpu,
         }
         ret = xenHypervisorDoV2Dom(handle, &op);
 
-        if (munlock(cpumap, maplen) < 0) {
+        if (unlock_pages(cpumap, maplen) < 0) {
             virXenError(VIR_ERR_XEN_CALL, " release", maplen);
             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;
         }
         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);
             }
@@ -1834,7 +1869,7 @@ virXen_getvcpusinfo(int handle, int id, unsigned int vcpu, virVcpuInfoPtr ipt,
                 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;
             }
@@ -1985,6 +2020,7 @@ xenHypervisorInit(void)
         goto detect_v2;
     }
 
+#ifndef __sun__
     /*
      * check if the old hypercall are actually working
      */
@@ -2002,6 +2038,7 @@ xenHypervisorInit(void)
         hypervisor_version = 0;
         goto done;
     }
+#endif
 
     /*
      * we faild to make any hypercall
index b6639c4db22acf984c410bfb44404d42a7a36605..31bf4917a8847351c106fb6c5ae25d2a71fe2be3 100644 (file)
 #include "xs_internal.h"
 #include "xen_internal.h" /* for xenHypervisorCheckID */
 
+#ifdef __linux__
 #define XEN_HYPERVISOR_SOCKET "/proc/xen/privcmd"
+#elif define(__sun__)
+#define XEN_HYPERVISOR_SOCKET "/dev/xen/privcmd"
+#else
+#error "unsupported platform"
+#endif
 
 #ifndef PROXY
 static char *xenStoreDomainGetOSType(virDomainPtr domain);