I've broken this patch up into a few pieces to make it more reviewable and tried to address the comments from the previous patch (Jun 15th'ish if your looking). Here is first part... tested on today's CVS bits on a FC7 dom0 (LD_PRELOAD=src/.libs/libvirt.so src/.libs/virsh) One note, it looks like you still need a xend change on FC7 before the no kernel/bootloader option works. It looks like it's close though.. works fine with them of course. More details... [root@fedora solaris]# cat guest.py name = "solaris" vcpus = 1 memory = "512" #bootloader = "/usr/bin/pygrub" #kernel = "/platform/i86xpv/kernel/unix" #ramdisk = "/platform/i86pc/boot_archive" extra = "-k" root = "/dev/dsk/c0d0s0" disk = ['file:/export/guests/solaris/disk.img,0,w'] vif = ['bridge=xenbr0'] on_shutdown = "destroy" on_reboot = "restart" on_crash = "destroy" [root@fedora solaris]# xm list -l solaris (domain (on_crash destroy) (uuid 72f9b45e-4be9-bf1f-a500-3707b9c3922c) (bootloader_args ) (vcpus 1) (name solaris) (on_poweroff destroy) (on_reboot restart) (bootloader ) (maxmem 512) (memory 512) (shadow_memory 0) (cpu_weight 256) (cpu_cap 0) (features ) (on_xend_start ignore) (on_xend_stop ignore) (image (linux (kernel ) (args 'root=/dev/dsk/c0d0s0 -k'))) (status 0) (device (vif (bridge xenbr0) (uuid 9a8d5a2f-0a70-3a1f-fed0-fd2459e63733))) (device (vbd (uuid a6ba2241-1019-151e-6dd7-28638d3e17b7) (bootable 1) (driver paravirtualised) (dev 0) (uname file:/export/guests/solaris/disk.img) (mode w) ) ) ) [root@fedora solaris]# virsh # start solaris Domain solaris started virsh # dominfo solaris Id: 5 Name: solaris UUID: 72f9b45e-4be9-bf1f-a500-3707b9c3922c OS Type: linux State: no state CPU(s): 1 CPU time: 2.1s Max memory: 524288 kB Used memory: 524288 kB virsh # console solaris libvir: Xen Daemon error : internal error domain information incomplete, missing kernel & bootloader domain.xml:25: parser error : Opening and ending tag mismatch: os line 4 and domain </domain> ^ domain.xml:26: parser error : Premature end of data in tag domain line 1 ^ virsh # quit [root@fedora solaris]# xm console solaris Loading kmdb... SunOS Release 5.11 Version matrix-devel-build 32-bit Copyright 1983-2007 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. WARNING: Found xen v3.1.0-rc7-2934.fc7 but need xen v3.0.4-1-xvm WARNING: The kernel may not function correctly Hostname: unknown Reading ZFS config: done. Sep 28 18:48:53 unknown ntpdate[419]: no server suitable for synchronization found unknown console login: root Password: Last login: Fri Sep 28 18:45:46 on console Sep 28 18:50:30 unknown login: ROOT LOGIN /dev/console Sun Microsystems Inc. SunOS 5.11 matrix-devel-build October 2007 bfu'ed from /net/girltalk/export/xvm/matrix-devel/archives/i386/nightly-nd on 2007-09-28 Sun Microsystems Inc. SunOS 5.11 xen-nv66-2007-06-24 October 2007 # poweroff Sep 28 18:50:33 unknown poweroff: initiated by root on /dev/console [root@fedora solaris]# Thanks, MRJ --- Solaris dom0 support diff --git a/src/xen_internal.c b/src/xen_internal.c --- a/src/xen_internal.c +++ b/src/xen_internal.c @@ -56,9 +56,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 { @@ -67,8 +68,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 @@ -314,6 +319,26 @@ typedef union xen_getschedulerid xen_get dominfo.v2.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 { @@ -616,7 +641,17 @@ typedef struct xen_op_v2_dom xen_op_v2_d #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); @@ -773,7 +808,7 @@ xenHypervisorDoV0Op(int handle, xen_op_v 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); } @@ -783,7 +818,7 @@ xenHypervisorDoV0Op(int handle, xen_op_v 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; } @@ -814,7 +849,7 @@ xenHypervisorDoV1Op(int handle, xen_op_v 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); } @@ -824,7 +859,7 @@ xenHypervisorDoV1Op(int handle, xen_op_v 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; } @@ -856,7 +891,7 @@ xenHypervisorDoV2Sys(int handle, xen_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); } @@ -866,7 +901,7 @@ xenHypervisorDoV2Sys(int handle, xen_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; } @@ -898,7 +933,7 @@ xenHypervisorDoV2Dom(int handle, xen_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); } @@ -908,7 +943,7 @@ xenHypervisorDoV2Dom(int handle, xen_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; } @@ -936,7 +971,7 @@ virXen_getdomaininfolist(int handle, int { 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); @@ -992,7 +1027,7 @@ virXen_getdomaininfolist(int handle, int 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); @@ -1679,7 +1714,7 @@ virXen_setvcpumap(int handle, int id, un 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); } @@ -1697,7 +1732,7 @@ virXen_setvcpumap(int handle, int id, un } ret = xenHypervisorDoV2Dom(handle, &op); - if (munlock(cpumap, maplen) < 0) { + if (unlock_pages(cpumap, maplen) < 0) { virXenError(VIR_ERR_XEN_CALL, " release", maplen); ret = -1; } @@ -1794,7 +1829,7 @@ virXen_getvcpusinfo(int handle, int id, 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); } @@ -1812,7 +1847,7 @@ virXen_getvcpusinfo(int handle, int id, 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; } @@ -1963,6 +1998,7 @@ xenHypervisorInit(void) goto detect_v2; } +#ifndef __sun__ /* * check if the old hypercall are actually working */ @@ -1980,6 +2016,7 @@ xenHypervisorInit(void) hypervisor_version = 0; goto done; } +#endif /* * we faild to make any hypercall diff --git a/src/xend_internal.c b/src/xend_internal.c --- a/src/xend_internal.c +++ b/src/xend_internal.c @@ -1280,9 +1280,7 @@ xend_parse_sexp_desc_os(virConnectPtr xe virBufferVSprintf(buf, " <type>hvm</type>\n"); tmp = sexpr_node(node, "domain/image/hvm/kernel"); if (tmp == NULL && !bootloader) { - virXendError(xend, VIR_ERR_INTERNAL_ERROR, - _("domain information incomplete, missing kernel & bootloader")); - return(-1); + virBufferVSprintf(buf, " <!-- use the default bootloader -->\n"); } if (tmp) virBufferVSprintf(buf, " <loader>%s</loader>\n", tmp); @@ -1311,9 +1309,7 @@ xend_parse_sexp_desc_os(virConnectPtr xe virBufferVSprintf(buf, " <type>linux</type>\n"); tmp = sexpr_node(node, "domain/image/linux/kernel"); if (tmp == NULL && !bootloader) { - virXendError(xend, VIR_ERR_INTERNAL_ERROR, - _("domain information incomplete, missing kernel & bootloader")); - return(-1); + virBufferVSprintf(buf, " <!-- use the default bootloader -->\n"); } if (tmp) virBufferVSprintf(buf, " <kernel>%s</kernel>\n", tmp); diff --git a/src/xml.c b/src/xml.c --- a/src/xml.c +++ b/src/xml.c @@ -703,10 +703,7 @@ virDomainParseXMLOSDescPV(virConnectPtr return (-1); } virBufferAdd(buf, "(image (linux ", 14); - if (kernel == NULL) { - virXMLError(conn, VIR_ERR_NO_KERNEL, NULL, 0); - return (-1); - } else { + if (kernel != NULL) { virBufferVSprintf(buf, "(kernel '%s')", (const char *) kernel); } if (initrd != NULL) diff --git a/src/xs_internal.c b/src/xs_internal.c --- a/src/xs_internal.c +++ b/src/xs_internal.c @@ -31,7 +31,13 @@ #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); -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list