Hello community, here is the log from the commit of package xen for openSUSE:Factory checked in at 2014-09-25 09:33:42 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/xen (Old) and /work/SRC/openSUSE:Factory/.xen.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "xen" Changes: -------- --- /work/SRC/openSUSE:Factory/xen/xen.changes 2014-09-06 12:17:50.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.xen.new/xen.changes 2014-09-25 09:33:43.000000000 +0200 @@ -1,0 +2,36 @@ +Mon Sep 22 09:55:35 MDT 2014 - [email protected] + +- bnc#897614 - Virtualization/xen: Bug `xen-tools` uninstallable; + grub2-x86_64-xen dependency not available + xen.spec + +------------------------------------------------------------------- +Wed Sep 17 16:21:22 MDT 2014 - [email protected] + +- More cleanup of README.SUSE + +------------------------------------------------------------------- +Fri Sep 15 09:37:10 CST 2014 - [email protected] + +- Update xen patch with upstream patch so that latest libvirt + patch can work. (bnc#896044) + + 53fcebab-xen-pass-kernel-initrd-to-qemu.patch + - xen-pass-kernel-initrd-to-qemu.patch + +------------------------------------------------------------------- +Wed Sep 10 09:15:39 MDT 2014 - [email protected] + +- bnc#895804 - VUL-0: CVE-2014-6268: xen: XSA-107: Mishandling of + uninitialised FIFO-based event channel control blocks + xsa107.patch +- bnc#895802 - VUL-0: xen: XSA-106: Missing privilege level checks + in x86 emulation of software interrupts + xsa106.patch +- bnc#895799 - VUL-0: xen: XSA-105: Missing privilege level checks + in x86 HLT, LGDT, LIDT, and LMSW emulation + xsa105.patch +- bnc#895798 - VUL-0: xen: XSA-104: Race condition in + HVMOP_track_dirty_vram + xsa104.patch + +------------------------------------------------------------------- Old: ---- xen-pass-kernel-initrd-to-qemu.patch New: ---- 53fcebab-xen-pass-kernel-initrd-to-qemu.patch xsa104.patch xsa105.patch xsa106.patch xsa107.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xen.spec ++++++ --- /var/tmp/diff_new_pack.M0pMmJ/_old 2014-09-25 09:33:47.000000000 +0200 +++ /var/tmp/diff_new_pack.M0pMmJ/_new 2014-09-25 09:33:47.000000000 +0200 @@ -153,7 +153,7 @@ %endif %endif -Version: 4.4.1_04 +Version: 4.4.1_06 Release: 0 PreReq: %insserv_prereq %fillup_prereq Summary: Xen Virtualization: Hypervisor (aka VMM aka Microkernel) @@ -229,12 +229,17 @@ Patch15: 53e8be5f-x86-vHPET-use-rwlock-instead-of-simple-one.patch Patch16: 53f737b1-VMX-fix-DebugCtl-MSR-clearing.patch Patch17: 53f7386d-x86-irq-process-softirqs-in-irq-keyhandlers.patch -Patch18: 53ff3659-x86-consolidate-boolean-inputs-in-hvm-and-p2m.patch -Patch19: 53ff36ae-x86-hvm-treat-non-insn-fetch-NPF-also-as-read-violations.patch -Patch20: 53ff36d5-x86-mem_event-deliver-gla-fault-EPT-violation-information.patch -Patch21: 53ff3716-x86-ats-Disable-Address-Translation-Services-by-default.patch -Patch22: 53ff3899-x86-NMI-allow-processing-unknown-NMIs-with-watchdog.patch -Patch23: 54005472-EPT-utilize-GLA-GPA-translation-known-for-certain-faults.patch +Patch18: 53fcebab-xen-pass-kernel-initrd-to-qemu.patch +Patch19: 53ff3659-x86-consolidate-boolean-inputs-in-hvm-and-p2m.patch +Patch20: 53ff36ae-x86-hvm-treat-non-insn-fetch-NPF-also-as-read-violations.patch +Patch21: 53ff36d5-x86-mem_event-deliver-gla-fault-EPT-violation-information.patch +Patch22: 53ff3716-x86-ats-Disable-Address-Translation-Services-by-default.patch +Patch23: 53ff3899-x86-NMI-allow-processing-unknown-NMIs-with-watchdog.patch +Patch24: 54005472-EPT-utilize-GLA-GPA-translation-known-for-certain-faults.patch +Patch104: xsa104.patch +Patch105: xsa105.patch +Patch106: xsa106.patch +Patch107: xsa107.patch # Upstream qemu Patch250: VNC-Support-for-ExtendedKeyEvent-client-message.patch Patch251: 0001-net-move-the-tap-buffer-into-TAPState.patch @@ -362,9 +367,8 @@ Patch468: libxl.introduce-an-option-to-disable-the-non-O_DIRECT-workaround.patch Patch469: libxl.add-option-to-disable-disk-cache-flushes-in-qdisk.patch Patch470: qemu-xen-upstream-qdisk-cache-unsafe.patch -Patch471: xen-pass-kernel-initrd-to-qemu.patch -Patch472: qemu-support-xen-hvm-direct-kernel-boot.patch -Patch473: tigervnc-long-press.patch +Patch471: qemu-support-xen-hvm-direct-kernel-boot.patch +Patch472: tigervnc-long-press.patch # Hypervisor and PV driver Patches Patch501: x86-ioapic-ack-default.patch Patch502: x86-cpufreq-report.patch @@ -459,7 +463,9 @@ Summary: Xen Virtualization: Control tools for domain 0 Group: System/Kernel Requires: bridge-utils +%if %suse_version >= 1315 Requires: grub2-x86_64-xen +%endif Requires: multipath-tools Requires: python Requires: python-curses @@ -625,6 +631,11 @@ %patch21 -p1 %patch22 -p1 %patch23 -p1 +%patch24 -p1 +%patch104 -p1 +%patch105 -p1 +%patch106 -p1 +%patch107 -p1 # Upstream qemu patches %patch250 -p1 %patch251 -p1 @@ -753,7 +764,6 @@ %patch470 -p1 %patch471 -p1 %patch472 -p1 -%patch473 -p1 # Hypervisor and PV driver Patches %patch501 -p1 %patch502 -p1 ++++++ 53fcebab-xen-pass-kernel-initrd-to-qemu.patch ++++++ Subject: xen: pass kernel initrd to qemu From: Chunyan Liu [email protected] Mon Jul 7 14:34:33 2014 +0800 Date: Tue Aug 26 21:18:51 2014 +0100: Git: 11dffa2359e8a2629490c14c029c7c7c777b3e47 xen side patch to support xen HVM direct kernel boot: support 'kernel', 'ramdisk', 'cmdline' (and 'root', 'extra' as well which would be deprecated later) in HVM config file, parse config file, pass -kernel, -initrd, -append parameters to qemu. Signed-off-by: Chunyan Liu <[email protected]> Acked-by: Ian Campbell <[email protected]> Index: xen-4.4.1-testing/docs/man/xl.cfg.pod.5 =================================================================== --- xen-4.4.1-testing.orig/docs/man/xl.cfg.pod.5 +++ xen-4.4.1-testing/docs/man/xl.cfg.pod.5 @@ -296,6 +296,37 @@ Action to take if the domain crashes. D =back +=head3 Direct Kernel Boot + +Direct kernel boot allows booting directly from a kernel and initrd +stored in the host physical machine OS, allowing command line arguments +to be passed directly. PV guest direct kernel boot is supported. HVM +guest direct kernel boot is supported with limitation (it's supported +when using qemu-xen and default BIOS 'seabios'; not supported in case of +stubdom-dm and old rombios.) + +=over 4 + +=item B<kernel="PATHNAME"> + +Load the specified file as the kernel image. + +=item B<ramdisk="PATHNAME"> + +Load the specified file as the ramdisk. + +=item B<root="STRING"> + +Append B<root="STRING"> to the kernel command line (Note: it is guest +specific what meaning this has). + +=item B<extra="STRING"> + +Append B<STRING> to the kernel command line. (Note: it is guest +specific what meaning this has). + +=back + =head3 Other Options =over 4 @@ -625,20 +656,12 @@ The following options apply only to Para =over 4 -=item B<kernel="PATHNAME"> - -Load the specified file as the kernel image. Either B<kernel> or -B<bootloader> must be specified for PV guests. - -=item B<ramdisk="PATHNAME"> - -Load the specified file as the ramdisk. - =item B<bootloader="PROGRAM"> Run C<PROGRAM> to find the kernel image and ramdisk to use. Normally C<PROGRAM> would be C<pygrub>, which is an emulation of -grub/grub2/syslinux. +grub/grub2/syslinux. Either B<kernel> or B<bootloader> must be specified +for PV guests. =item B<bootloader_args=[ "ARG", "ARG", ...]> @@ -646,16 +669,6 @@ Append B<ARG>s to the arguments to the B program. Alternatively if the argument is a simple string then it will be split into words at whitespace (this second option is deprecated). -=item B<root="STRING"> - -Append B<root="STRING"> to the kernel command line (Note: it is guest -specific what meaning this has). - -=item B<extra="STRING"> - -Append B<STRING> to the kernel command line. Note: it is guest -specific what meaning this has). - =item B<e820_host=BOOLEAN> Selects whether to expose the host e820 (memory map) to the guest via Index: xen-4.4.1-testing/tools/libxl/libxl.h =================================================================== --- xen-4.4.1-testing.orig/tools/libxl/libxl.h +++ xen-4.4.1-testing/tools/libxl/libxl.h @@ -445,6 +445,21 @@ #define LIBXL_HAVE_NO_SUSPEND_RESUME 1 #endif +/* + * LIBXL_HAVE_BUILDINFO_KERNEL + * + * If this is defined, then the libxl_domain_build_info structure will + * contain 'kernel', 'ramdisk', 'cmdline' fields. 'kernel' is a string + * to indicate kernel image location, 'ramdisk' is a string to indicate + * ramdisk location, 'cmdline' is a string to indicate the paramters which + * would be appended to kernel image. + * + * Both PV guest and HVM guest can use these fields for direct kernel boot. + * But for compatibility reason, u.pv.kernel, u.pv.ramdisk and u.pv.cmdline + * still exist. + */ +#define LIBXL_HAVE_BUILDINFO_KERNEL 1 + /* Functions annotated with LIBXL_EXTERNAL_CALLERS_ONLY may not be * called from within libxl itself. Callers outside libxl, who * do not #include libxl_internal.h, are fine. */ Index: xen-4.4.1-testing/tools/libxl/libxl_bootloader.c =================================================================== --- xen-4.4.1-testing.orig/tools/libxl/libxl_bootloader.c +++ xen-4.4.1-testing/tools/libxl/libxl_bootloader.c @@ -56,12 +56,12 @@ static void make_bootloader_args(libxl__ ARG(bootloader_path); - if (info->u.pv.kernel) - ARG(libxl__sprintf(gc, "--kernel=%s", info->u.pv.kernel)); - if (info->u.pv.ramdisk) - ARG(libxl__sprintf(gc, "--ramdisk=%s", info->u.pv.ramdisk)); - if (info->u.pv.cmdline && *info->u.pv.cmdline != '\0') - ARG(libxl__sprintf(gc, "--args=%s", info->u.pv.cmdline)); + if (info->kernel) + ARG(libxl__sprintf(gc, "--kernel=%s", info->kernel)); + if (info->ramdisk) + ARG(libxl__sprintf(gc, "--ramdisk=%s", info->ramdisk)); + if (info->cmdline && *info->cmdline != '\0') + ARG(libxl__sprintf(gc, "--args=%s", info->cmdline)); ARG(libxl__sprintf(gc, "--output=%s", bl->outputpath)); ARG("--output-format=simple0"); @@ -325,9 +325,9 @@ void libxl__bootloader_run(libxl__egc *e if (!info->u.pv.bootloader) { LOG(DEBUG, "no bootloader configured, using user supplied kernel"); - bl->kernel->path = bl->info->u.pv.kernel; - bl->ramdisk->path = bl->info->u.pv.ramdisk; - bl->cmdline = bl->info->u.pv.cmdline; + bl->kernel->path = bl->info->kernel; + bl->ramdisk->path = bl->info->ramdisk; + bl->cmdline = bl->info->cmdline; rc = 0; goto out_ok; } Index: xen-4.4.1-testing/tools/libxl/libxl_create.c =================================================================== --- xen-4.4.1-testing.orig/tools/libxl/libxl_create.c +++ xen-4.4.1-testing/tools/libxl/libxl_create.c @@ -337,6 +337,25 @@ int libxl__domain_build_info_setdefault( b_info->shadow_memkb = 0; if (b_info->u.pv.slack_memkb == LIBXL_MEMKB_DEFAULT) b_info->u.pv.slack_memkb = 0; + + /* For compatibility, fill in b_info->kernel|ramdisk|cmdline + * with the value in u.pv, later processing will use + * b_info->kernel|ramdisk|cmdline only. + * User with old APIs that passes u.pv.kernel|ramdisk|cmdline + * is not affected. + */ + if (!b_info->kernel && b_info->u.pv.kernel) { + b_info->kernel = b_info->u.pv.kernel; + b_info->u.pv.kernel = NULL; + } + if (!b_info->ramdisk && b_info->u.pv.ramdisk) { + b_info->ramdisk = b_info->u.pv.ramdisk; + b_info->u.pv.ramdisk = NULL; + } + if (!b_info->cmdline && b_info->u.pv.cmdline) { + b_info->cmdline = b_info->u.pv.cmdline; + b_info->u.pv.cmdline = NULL; + } break; default: LIBXL__LOG(CTX, LIBXL__LOG_ERROR, Index: xen-4.4.1-testing/tools/libxl/libxl_dm.c =================================================================== --- xen-4.4.1-testing.orig/tools/libxl/libxl_dm.c +++ xen-4.4.1-testing/tools/libxl/libxl_dm.c @@ -196,6 +196,12 @@ static char ** libxl__build_device_model int nr_set_cpus = 0; char *s; + if (b_info->kernel) { + LOG(ERROR, "HVM direct kernel boot is not supported by " + "qemu-xen-traditional"); + return NULL; + } + if (b_info->u.hvm.serial) { flexarray_vappend(dm_args, "-serial", b_info->u.hvm.serial, NULL); } @@ -481,6 +487,15 @@ static char ** libxl__build_device_model if (b_info->type == LIBXL_DOMAIN_TYPE_HVM) { int ioemu_nics = 0; + if (b_info->kernel) + flexarray_vappend(dm_args, "-kernel", b_info->kernel, NULL); + + if (b_info->ramdisk) + flexarray_vappend(dm_args, "-initrd", b_info->ramdisk, NULL); + + if (b_info->cmdline) + flexarray_vappend(dm_args, "-append", b_info->cmdline, NULL); + if (b_info->u.hvm.serial) { flexarray_vappend(dm_args, "-serial", b_info->u.hvm.serial, NULL); } Index: xen-4.4.1-testing/tools/libxl/libxl_types.idl =================================================================== --- xen-4.4.1-testing.orig/tools/libxl/libxl_types.idl +++ xen-4.4.1-testing/tools/libxl/libxl_types.idl @@ -333,6 +333,9 @@ libxl_domain_build_info = Struct("domain ("iomem", Array(libxl_iomem_range, "num_iomem")), ("claim_mode", libxl_defbool), ("event_channels", uint32), + ("kernel", string), + ("cmdline", string), + ("ramdisk", string), ("u", KeyedUnion(None, libxl_domain_type, "type", [("hvm", Struct(None, [("firmware", string), ("bios", libxl_bios_type), Index: xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c =================================================================== --- xen-4.4.1-testing.orig/tools/libxl/xl_cmdimpl.c +++ xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c @@ -721,6 +721,29 @@ static void parse_top_level_vnc_options( xlu_cfg_get_defbool(config, "vncunused", &vnc->findunused, 0); } +static char *parse_cmdline(XLU_Config *config) +{ + char *cmdline = NULL; + const char *root = NULL, *extra = ""; + + xlu_cfg_get_string (config, "root", &root, 0); + xlu_cfg_get_string (config, "extra", &extra, 0); + + if (root) { + if (asprintf(&cmdline, "root=%s %s", root, extra) == -1) + cmdline = NULL; + } else { + cmdline = strdup(extra); + } + + if ((root || extra) && !cmdline) { + fprintf(stderr, "Failed to allocate memory for cmdline\n"); + exit(1); + } + + return cmdline; +} + static void parse_config_data(const char *config_source, const char *config_data, int config_len, @@ -998,13 +1021,21 @@ static void parse_config_data(const char if (!xlu_cfg_get_long(config, "max_event_channels", &l, 0)) b_info->event_channels = l; + xlu_cfg_replace_string (config, "kernel", &b_info->kernel, 0); + xlu_cfg_replace_string (config, "ramdisk", &b_info->ramdisk, 0); + b_info->cmdline = parse_cmdline(config); + xlu_cfg_get_defbool(config, "driver_domain", &c_info->driver_domain, 0); switch(b_info->type) { case LIBXL_DOMAIN_TYPE_HVM: - if (!xlu_cfg_get_string (config, "kernel", &buf, 0)) - fprintf(stderr, "WARNING: ignoring \"kernel\" directive for HVM guest. " - "Use \"firmware_override\" instead if you really want a non-default firmware\n"); + if (!strcmp(libxl_basename(b_info->kernel), "hvmloader")) { + fprintf(stderr, "WARNING: you seem to be using \"kernel\" " + "directive to override HVM guest firmware. Ignore " + "that. Use \"firmware_override\" instead if you " + "really want a non-default firmware\n"); + b_info->kernel = NULL; + } xlu_cfg_replace_string (config, "firmware_override", &b_info->u.hvm.firmware, 0); @@ -1056,26 +1087,6 @@ static void parse_config_data(const char break; case LIBXL_DOMAIN_TYPE_PV: { - char *cmdline = NULL; - const char *root = NULL, *extra = ""; - - xlu_cfg_replace_string (config, "kernel", &b_info->u.pv.kernel, 0); - - xlu_cfg_get_string (config, "root", &root, 0); - xlu_cfg_get_string (config, "extra", &extra, 0); - - if (root) { - if (asprintf(&cmdline, "root=%s %s", root, extra) == -1) - cmdline = NULL; - } else { - cmdline = strdup(extra); - } - - if ((root || extra) && !cmdline) { - fprintf(stderr, "Failed to allocate memory for cmdline\n"); - exit(1); - } - xlu_cfg_replace_string (config, "bootloader", &b_info->u.pv.bootloader, 0); switch (xlu_cfg_get_list_as_string_list(config, "bootloader_args", &b_info->u.pv.bootloader_args, 1)) @@ -1098,13 +1109,11 @@ static void parse_config_data(const char exit(-ERROR_FAIL); } - if (!b_info->u.pv.bootloader && !b_info->u.pv.kernel) { + if (!b_info->u.pv.bootloader && !b_info->kernel) { fprintf(stderr, "Neither kernel nor bootloader specified\n"); exit(1); } - b_info->u.pv.cmdline = cmdline; - xlu_cfg_replace_string (config, "ramdisk", &b_info->u.pv.ramdisk, 0); break; } default: ++++++ README.SUSE ++++++ --- /var/tmp/diff_new_pack.M0pMmJ/_old 2014-09-25 09:33:47.000000000 +0200 +++ /var/tmp/diff_new_pack.M0pMmJ/_new 2014-09-25 09:33:47.000000000 +0200 @@ -8,9 +8,8 @@ virtualization information, at https://www.suse.com/documentation/sles11/singlehtml/book_xen/book_xen.html -For more complete documentation on Xen itself, please install one of the -xen-doc-* packages and read the documentation installed into -/usr/share/doc/packages/xen/. +For more complete documentation on Xen itself, please install the xen-doc-html +package and read the documentation installed into /usr/share/doc/packages/xen/. About @@ -18,7 +17,7 @@ Xen allows you to run multiple virtual machines on a single physical machine. See the Xen homepage for more information: - http://www.cl.cam.ac.uk/research/srg/netos/xen/ + http://www.xenproject.org/ If you want to use Xen, you need to install the Xen hypervisor and a number of supporting packages. During the initial SUSE installation (or when installing @@ -129,7 +128,7 @@ below called; "Dom0 Memory Ballooning" and "Troubleshooting". For a more complete discussion of possible parameters, see the user -documentation in the xen-doc-* packages. +documentation in the xen-doc-html package. Creating a VM with virt-install @@ -137,14 +136,14 @@ The virt-install program (part of the virt-install package, and accessible through YaST's Control Center) is the recommended method to create VMs. This program handles creating both the VM's libvirt XML definition and disk(s). -It can help install any operating system, not just SUSE. Virt-install has both +It can help install any operating system, not just SUSE. virt-install has both a command line only mode and a graphical wizard mode that may be used to define and start VM installations. -Virt-install may be launched from the virt-manager VM management tool. After -starting virt-manager either from the YaST Control Center or by starting -it from the command line. The installation icon from the main virt-manager -screen may be selected to begin the virt-install installation wizard. +virt-install may be launched from the virt-manager VM management tool. Start +virt-manager either from the YaST Control Center or from the command line. +The installation icon from the main virt-manager screen may be selected to +begin the virt-install installation wizard. The use of virt-install or virt-manager requires the installation of the libvirt packages and the libvirt daemon must be running on the host unless @@ -161,9 +160,10 @@ When defining the virtual network adapter(s), we recommend using a static MAC for the VM rather than allowing Xen to randomly select one each time the VM -boots. (See "Network Troubleshooting" below.) XenSource has been allocated a -range of MAC addresses with the OUI of 00-16-3E. By using MACs from this -range you can be sure they will not conflict with any physical adapters. +boots. (See "Network Troubleshooting" below.) The Xen Project has been +allocated a range of MAC addresses with the OUI of 00-16-3E. By using MACs +from this range you can be sure they will not conflict with any physical +adapters. When the VM shuts down (because the installation -- or at least the first stage of it -- is done), the wizard finalizes the VM's configuration and @@ -177,7 +177,7 @@ Creating a VM with vm-install ----------------------------- The vm-install program is also provided to create VMs. Like virt-install, -this optional program handles creating both the VM's Libvirt XML definition +this optional program handles creating both the VM's libvirt XML definition and disk(s). It also creates a legacy configuration file for use with 'xl'. It can help install any operating system, not just SUSE. @@ -210,16 +210,17 @@ and a configuration file. If you are using a disk or disk image that is already installed with an -operating system, you'll probably need to replace its kernel with a -Xen-enabled kernel. +operating system and you want the VM to run in paravirtual mode, you'll +probably need to replace its kernel with a Xen-enabled kernel. The kernel and ramdisk used to bootstrap the VM must match any kernel modules that might be present in the VM's disk. It is possible to manually copy the kernel and ramdisk from the VM's disk (for example, after updating the kernel within that VM) to the VM server's filesystem. However, an easier (and less -error-prone) method is to use something called the "pygrub". Before a new -VM is started, this loader automatically copies the kernel and ramdisk into -the VM server's filesystem, so that it can be used to bootstrap the new VM. +error-prone) method is to use /usr/lib/grub2/x86_64-xen/grub.xen as the VM +kernel. When the new VM is started, it runs grub.xen to read the grub +configuration from the VM disk, selecting the configured kernel and ramdisk +so that it can be used to bootstrap the new VM. Next, make a copy of one of the /etc/xen/examples/* files, and modify it to suit your needs. You'll need to change (at very least) the "name" and "disk" @@ -243,9 +244,8 @@ virsh start my-vm or start it from virt-manager's graphical menu. -Have a look at running sessions with "virsh list". Note the ID of the newly -created VM. Attach to the VM's text console with "virsh console <ID>" -(replacing ID with the VM's ID). Attaching to multiple VM consoles is most +Have a look at running VMs with "virsh list". Attach to the VM's text console +with "virsh console <vm-name>". Attaching to multiple VM consoles is most conveniently done with the terminal multiplexer "screen". Have a look at the other virsh commands by typing "virsh help". Note that most @@ -478,7 +478,7 @@ xm/xend, you must run a conversion tool called /usr/sbin/xen2libvirt for all VMs. -For example, to convert all managed xend domains: +For example, to convert all domains previously managed by xend: xen2libvirt -r /var/lib/xend/domains/ Now typing 'virsh list --all' will show your previously xend managed domains @@ -623,33 +623,20 @@ the "xl dmesg" command). If problems persist, check if a newer version is available. Well-tested -versions will be shipped with SUSE and via YaST Online Update. More frequent -(but less supported) updates are available on Novell's Forge site: - http://forge.novell.com/modules/xfmod/project/?xenpreview +versions will be shipped with SUSE and via YaST Online Update. Resources --------- https://www.suse.com/documentation/sles11/singlehtml/book_xen/book_xen.html http://doc.opensuse.org/products/draft/SLES/SLES-xen_sd_draft/cha.xen.basics.html -http://www.novell.com/documentation/vmserver/. - - -Disclaimer ----------- -Xen performed amazingly well in our tests and proved very stable. Still, you -should be careful when using it, just like you'd be careful if you boot an -experimental kernel. Expect that it may not boot and be prepared to have a -fall-back solution for that scenario. Be prepared that it may not support all -of your hardware. And for the worst of all cases, have your most valuable -data backed up. (This is always a good idea, of course.) Feedback -------- In case you have remarks about, problems with, ideas for, or praise for Xen, please report it back to the xen-devel list: - [email protected] + [email protected] If you find issues with the packaging or setup done by SUSE, please report it through bugzilla: https://bugzilla.novell.com ++++++ libxl.honor-more-top-level-vfb-options.patch ++++++ --- /var/tmp/diff_new_pack.M0pMmJ/_old 2014-09-25 09:33:47.000000000 +0200 +++ /var/tmp/diff_new_pack.M0pMmJ/_new 2014-09-25 09:33:47.000000000 +0200 @@ -16,11 +16,11 @@ tools/libxl/xl_cmdimpl.c | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) -diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 -index e15a49f..49a9250 100644 ---- a/docs/man/xl.cfg.pod.5 -+++ b/docs/man/xl.cfg.pod.5 -@@ -389,8 +389,8 @@ This options does not control the emulated graphics card presented to +Index: xen-4.4.1-testing/docs/man/xl.cfg.pod.5 +=================================================================== +--- xen-4.4.1-testing.orig/docs/man/xl.cfg.pod.5 ++++ xen-4.4.1-testing/docs/man/xl.cfg.pod.5 +@@ -420,8 +420,8 @@ This options does not control the emulat an HVM guest. See L<Emulated VGA Graphics Device> below for how to configure the emulated device. If L<Emulated VGA Graphics Device> options are used in a PV guest configuration, xl will pick up B<vnc>, B<vnclisten>, @@ -31,11 +31,11 @@ Each B<VFB_SPEC_STRING> is a comma-separated list of C<KEY=VALUE> settings, from the following list: -diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c -index 4fc46eb..28212e2 100644 ---- a/tools/libxl/xl_cmdimpl.c -+++ b/tools/libxl/xl_cmdimpl.c -@@ -721,6 +721,15 @@ static void parse_top_level_vnc_options(XLU_Config *config, +Index: xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c +=================================================================== +--- xen-4.4.1-testing.orig/tools/libxl/xl_cmdimpl.c ++++ xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c +@@ -721,6 +721,15 @@ static void parse_top_level_vnc_options( xlu_cfg_get_defbool(config, "vncunused", &vnc->findunused, 0); } @@ -48,10 +48,10 @@ + xlu_cfg_replace_string (config, "xauthority", &sdl->xauthority, 0); +} + - static void parse_config_data(const char *config_source, - const char *config_data, - int config_len, -@@ -1657,9 +1666,13 @@ skip_vfb: + static char *parse_cmdline(XLU_Config *config) + { + char *cmdline = NULL; +@@ -1666,9 +1675,13 @@ skip_vfb: libxl_device_vkb_init); parse_top_level_vnc_options(config, &vfb->vnc); @@ -66,7 +66,7 @@ if (c_info->type == LIBXL_DOMAIN_TYPE_HVM) { if (!xlu_cfg_get_string (config, "vga", &buf, 0)) { -@@ -1676,8 +1689,6 @@ skip_vfb: +@@ -1685,8 +1698,6 @@ skip_vfb: LIBXL_VGA_INTERFACE_TYPE_CIRRUS; xlu_cfg_replace_string (config, "keymap", &b_info->u.hvm.keymap, 0); ++++++ libxl.pvscsi.patch ++++++ --- /var/tmp/diff_new_pack.M0pMmJ/_old 2014-09-25 09:33:47.000000000 +0200 +++ /var/tmp/diff_new_pack.M0pMmJ/_new 2014-09-25 09:33:47.000000000 +0200 @@ -35,7 +35,7 @@ =================================================================== --- xen-4.4.1-testing.orig/docs/man/xl.cfg.pod.5 +++ xen-4.4.1-testing/docs/man/xl.cfg.pod.5 -@@ -380,6 +380,36 @@ value is optional if this is a guest dom +@@ -411,6 +411,36 @@ value is optional if this is a guest dom =back @@ -444,7 +444,7 @@ =================================================================== --- xen-4.4.1-testing.orig/tools/libxl/libxl.h +++ xen-4.4.1-testing/tools/libxl/libxl.h -@@ -951,6 +951,26 @@ libxl_device_vtpm *libxl_device_vtpm_lis +@@ -966,6 +966,26 @@ libxl_device_vtpm *libxl_device_vtpm_lis int libxl_device_vtpm_getinfo(libxl_ctx *ctx, uint32_t domid, libxl_device_vtpm *vtpm, libxl_vtpminfo *vtpminfo); @@ -471,7 +471,7 @@ /* Keyboard */ int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb, const libxl_asyncop_how *ao_how) -@@ -1166,6 +1186,27 @@ int libxl_fd_set_nonblock(libxl_ctx *ctx +@@ -1181,6 +1201,27 @@ int libxl_fd_set_nonblock(libxl_ctx *ctx #include <libxl_event.h> @@ -503,7 +503,7 @@ =================================================================== --- xen-4.4.1-testing.orig/tools/libxl/libxl_create.c +++ xen-4.4.1-testing/tools/libxl/libxl_create.c -@@ -1029,6 +1029,7 @@ static void domcreate_rebuild_done(libxl +@@ -1048,6 +1048,7 @@ static void domcreate_rebuild_done(libxl libxl__multidev_begin(ao, &dcs->multidev); dcs->multidev.callback = domcreate_launch_dm; libxl__add_disks(egc, ao, domid, d_config, &dcs->multidev); @@ -594,7 +594,7 @@ =================================================================== --- xen-4.4.1-testing.orig/tools/libxl/libxl_types.idl +++ xen-4.4.1-testing/tools/libxl/libxl_types.idl -@@ -453,6 +453,26 @@ libxl_device_vtpm = Struct("device_vtpm" +@@ -456,6 +456,26 @@ libxl_device_vtpm = Struct("device_vtpm" ("uuid", libxl_uuid), ]) @@ -621,7 +621,7 @@ libxl_domain_config = Struct("domain_config", [ ("c_info", libxl_domain_create_info), ("b_info", libxl_domain_build_info), -@@ -463,6 +483,8 @@ libxl_domain_config = Struct("domain_con +@@ -466,6 +486,8 @@ libxl_domain_config = Struct("domain_con ("vfbs", Array(libxl_device_vfb, "num_vfbs")), ("vkbs", Array(libxl_device_vkb, "num_vkbs")), ("vtpms", Array(libxl_device_vtpm, "num_vtpms")), @@ -630,7 +630,7 @@ ("on_poweroff", libxl_action_on_shutdown), ("on_reboot", libxl_action_on_shutdown), -@@ -505,6 +527,28 @@ libxl_vtpminfo = Struct("vtpminfo", [ +@@ -508,6 +530,28 @@ libxl_vtpminfo = Struct("vtpminfo", [ ("uuid", libxl_uuid), ], dir=DIR_OUT) @@ -828,7 +828,7 @@ static void split_string_into_string_list(const char *str, const char *delim, libxl_string_list *psl) -@@ -740,7 +858,7 @@ static void parse_config_data(const char +@@ -763,7 +881,7 @@ static void parse_config_data(const char const char *buf; long l; XLU_Config *config; @@ -837,7 +837,7 @@ XLU_ConfigList *ioports, *irqs, *iomem; int num_ioports, num_irqs, num_iomem; int pci_power_mgmt = 0; -@@ -1246,6 +1364,66 @@ static void parse_config_data(const char +@@ -1255,6 +1373,66 @@ static void parse_config_data(const char } } @@ -904,7 +904,7 @@ if (!xlu_cfg_get_list(config, "vtpm", &vtpms, 0, 0)) { d_config->num_vtpms = 0; d_config->vtpms = NULL; -@@ -6043,6 +6221,256 @@ int main_blockdetach(int argc, char **ar +@@ -6052,6 +6230,256 @@ int main_blockdetach(int argc, char **ar return rc; } ++++++ libxl.set-migration-constraints-from-cmdline.patch ++++++ --- /var/tmp/diff_new_pack.M0pMmJ/_old 2014-09-25 09:33:47.000000000 +0200 +++ /var/tmp/diff_new_pack.M0pMmJ/_new 2014-09-25 09:33:47.000000000 +0200 @@ -298,7 +298,7 @@ =================================================================== --- xen-4.4.1-testing.orig/tools/libxl/libxl.h +++ xen-4.4.1-testing/tools/libxl/libxl.h -@@ -687,8 +687,23 @@ int libxl_domain_suspend(libxl_ctx *ctx, +@@ -702,8 +702,23 @@ int libxl_domain_suspend(libxl_ctx *ctx, int flags, /* LIBXL_SUSPEND_* */ const libxl_asyncop_how *ao_how) LIBXL_EXTERNAL_CALLERS_ONLY; @@ -390,7 +390,7 @@ =================================================================== --- xen-4.4.1-testing.orig/tools/libxl/xl_cmdimpl.c +++ xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c -@@ -3647,6 +3647,8 @@ static void migrate_do_preamble(int send +@@ -3656,6 +3656,8 @@ static void migrate_do_preamble(int send } static void migrate_domain(uint32_t domid, const char *rune, int debug, @@ -399,7 +399,7 @@ const char *override_config_file) { pid_t child = -1; -@@ -3655,7 +3657,13 @@ static void migrate_domain(uint32_t domi +@@ -3664,7 +3666,13 @@ static void migrate_domain(uint32_t domi char *away_domname; char rc_buf; uint8_t *config_data; @@ -414,7 +414,7 @@ save_domain_core_begin(domid, override_config_file, &config_data, &config_len); -@@ -3674,10 +3682,13 @@ static void migrate_domain(uint32_t domi +@@ -3683,10 +3691,13 @@ static void migrate_domain(uint32_t domi xtl_stdiostream_adjust_flags(logger, XTL_STDIOSTREAM_HIDE_PROGRESS, 0); if (debug) @@ -431,7 +431,7 @@ " (rc=%d)\n", rc); if (rc == ERROR_GUEST_TIMEDOUT) goto failed_suspend; -@@ -4064,13 +4075,18 @@ int main_migrate(int argc, char **argv) +@@ -4073,13 +4084,18 @@ int main_migrate(int argc, char **argv) char *rune = NULL; char *host; int opt, daemonize = 1, monitor = 1, debug = 0; @@ -451,7 +451,7 @@ case 'C': config_filename = optarg; break; -@@ -4087,6 +4103,18 @@ int main_migrate(int argc, char **argv) +@@ -4096,6 +4112,18 @@ int main_migrate(int argc, char **argv) case 0x100: debug = 1; break; @@ -470,7 +470,7 @@ } domid = find_domain(argv[optind]); -@@ -4102,7 +4130,8 @@ int main_migrate(int argc, char **argv) +@@ -4111,7 +4139,8 @@ int main_migrate(int argc, char **argv) return 1; } ++++++ xend-tools-watchdog-support.patch ++++++ --- /var/tmp/diff_new_pack.M0pMmJ/_old 2014-09-25 09:33:48.000000000 +0200 +++ /var/tmp/diff_new_pack.M0pMmJ/_new 2014-09-25 09:33:48.000000000 +0200 @@ -1,7 +1,7 @@ -Index: xen-4.4.0-testing/tools/python/xen/xm/create.py +Index: xen-4.4.1-testing/tools/python/xen/xm/create.py =================================================================== ---- xen-4.4.0-testing.orig/tools/python/xen/xm/create.py -+++ xen-4.4.0-testing/tools/python/xen/xm/create.py +--- xen-4.4.1-testing.orig/tools/python/xen/xm/create.py ++++ xen-4.4.1-testing/tools/python/xen/xm/create.py @@ -517,6 +517,21 @@ gopts.var('usbdevice', val='NAME', fn=set_value, default='', use="Name of USB device to add?") @@ -32,10 +32,10 @@ 'xauthority', 'xen_extended_power_mgmt', 'xen_platform_pci', 'memory_sharing' ] -Index: xen-4.4.0-testing/tools/python/xen/xm/xenapi_create.py +Index: xen-4.4.1-testing/tools/python/xen/xm/xenapi_create.py =================================================================== ---- xen-4.4.0-testing.orig/tools/python/xen/xm/xenapi_create.py -+++ xen-4.4.0-testing/tools/python/xen/xm/xenapi_create.py +--- xen-4.4.1-testing.orig/tools/python/xen/xm/xenapi_create.py ++++ xen-4.4.1-testing/tools/python/xen/xm/xenapi_create.py @@ -1074,7 +1074,9 @@ class sxp2xml: 'xen_platform_pci', 'tsc_mode' @@ -47,10 +47,10 @@ ] platform_configs = [] -Index: xen-4.4.0-testing/tools/python/xen/xend/image.py +Index: xen-4.4.1-testing/tools/python/xen/xend/image.py =================================================================== ---- xen-4.4.0-testing.orig/tools/python/xen/xend/image.py -+++ xen-4.4.0-testing/tools/python/xen/xend/image.py +--- xen-4.4.1-testing.orig/tools/python/xen/xend/image.py ++++ xen-4.4.1-testing/tools/python/xen/xend/image.py @@ -855,7 +855,8 @@ class HVMImageHandler(ImageHandler): dmargs = [ 'boot', 'fda', 'fdb', 'soundhw', @@ -69,10 +69,10 @@ # Handle booleans gracefully if a in ['localtime', 'std-vga', 'isa', 'usb', 'acpi']: -Index: xen-4.4.0-testing/tools/python/xen/xend/XendConfig.py +Index: xen-4.4.1-testing/tools/python/xen/xend/XendConfig.py =================================================================== ---- xen-4.4.0-testing.orig/tools/python/xen/xend/XendConfig.py -+++ xen-4.4.0-testing/tools/python/xen/xend/XendConfig.py +--- xen-4.4.1-testing.orig/tools/python/xen/xend/XendConfig.py ++++ xen-4.4.1-testing/tools/python/xen/xend/XendConfig.py @@ -192,6 +192,8 @@ XENAPI_PLATFORM_CFG_TYPES = { 'xen_platform_pci': int, "gfx_passthru": int, @@ -82,11 +82,11 @@ } # Xen API console 'other_config' keys. -Index: xen-4.4.0-testing/tools/libxl/libxl_dm.c +Index: xen-4.4.1-testing/tools/libxl/libxl_dm.c =================================================================== ---- xen-4.4.0-testing.orig/tools/libxl/libxl_dm.c -+++ xen-4.4.0-testing/tools/libxl/libxl_dm.c -@@ -246,6 +246,12 @@ static char ** libxl__build_device_model +--- xen-4.4.1-testing.orig/tools/libxl/libxl_dm.c ++++ xen-4.4.1-testing/tools/libxl/libxl_dm.c +@@ -252,6 +252,12 @@ static char ** libxl__build_device_model } } } @@ -99,7 +99,7 @@ if (b_info->u.hvm.soundhw) { flexarray_vappend(dm_args, "-soundhw", b_info->u.hvm.soundhw, NULL); } -@@ -581,6 +587,12 @@ static char ** libxl__build_device_model +@@ -596,6 +602,12 @@ static char ** libxl__build_device_model return NULL; } } @@ -112,11 +112,11 @@ if (b_info->u.hvm.soundhw) { flexarray_vappend(dm_args, "-soundhw", b_info->u.hvm.soundhw, NULL); } -Index: xen-4.4.0-testing/tools/libxl/libxl_types.idl +Index: xen-4.4.1-testing/tools/libxl/libxl_types.idl =================================================================== ---- xen-4.4.0-testing.orig/tools/libxl/libxl_types.idl -+++ xen-4.4.0-testing/tools/libxl/libxl_types.idl -@@ -372,6 +372,8 @@ libxl_domain_build_info = Struct("domain +--- xen-4.4.1-testing.orig/tools/libxl/libxl_types.idl ++++ xen-4.4.1-testing/tools/libxl/libxl_types.idl +@@ -375,6 +375,8 @@ libxl_domain_build_info = Struct("domain ("xen_platform_pci", libxl_defbool), ("usbdevice_list", libxl_string_list), ("vendor_device", libxl_vendor_device), @@ -125,11 +125,11 @@ ])), ("pv", Struct(None, [("kernel", string), ("slack_memkb", MemKB), -Index: xen-4.4.0-testing/tools/libxl/xl_cmdimpl.c +Index: xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c =================================================================== ---- xen-4.4.0-testing.orig/tools/libxl/xl_cmdimpl.c -+++ xen-4.4.0-testing/tools/libxl/xl_cmdimpl.c -@@ -1915,6 +1915,8 @@ skip_vfb: +--- xen-4.4.1-testing.orig/tools/libxl/xl_cmdimpl.c ++++ xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c +@@ -1924,6 +1924,8 @@ skip_vfb: xlu_cfg_replace_string (config, "soundhw", &b_info->u.hvm.soundhw, 0); xlu_cfg_get_defbool(config, "xen_platform_pci", &b_info->u.hvm.xen_platform_pci, 0); ++++++ xsa104.patch ++++++ x86/shadow: fix race condition sampling the dirty vram state d->arch.hvm_domain.dirty_vram must be read with the domain's paging lock held. If not, two concurrent hypercalls could both end up attempting to free dirty_vram (the second of which will free a wild pointer), or both end up allocating a new dirty_vram structure (the first of which will be leaked). This is XSA-104. Signed-off-by: Andrew Cooper <[email protected]> Reviewed-by: Tim Deegan <[email protected]> Index: xen-4.4.1-testing/xen/arch/x86/mm/shadow/common.c =================================================================== --- xen-4.4.1-testing.orig/xen/arch/x86/mm/shadow/common.c +++ xen-4.4.1-testing/xen/arch/x86/mm/shadow/common.c @@ -3486,7 +3486,7 @@ int shadow_track_dirty_vram(struct domai int flush_tlb = 0; unsigned long i; p2m_type_t t; - struct sh_dirty_vram *dirty_vram = d->arch.hvm_domain.dirty_vram; + struct sh_dirty_vram *dirty_vram; struct p2m_domain *p2m = p2m_get_hostp2m(d); if ( end_pfn < begin_pfn || end_pfn > p2m->max_mapped_pfn + 1 ) @@ -3496,6 +3496,8 @@ int shadow_track_dirty_vram(struct domai p2m_lock(p2m_get_hostp2m(d)); paging_lock(d); + dirty_vram = d->arch.hvm_domain.dirty_vram; + if ( dirty_vram && (!nr || ( begin_pfn != dirty_vram->begin_pfn || end_pfn != dirty_vram->end_pfn )) ) Index: xen-4.4.1-testing/xen/include/asm-x86/hvm/domain.h =================================================================== --- xen-4.4.1-testing.orig/xen/include/asm-x86/hvm/domain.h +++ xen-4.4.1-testing/xen/include/asm-x86/hvm/domain.h @@ -67,7 +67,7 @@ struct hvm_domain { /* Memory ranges with pinned cache attributes. */ struct list_head pinned_cacheattr_ranges; - /* VRAM dirty support. */ + /* VRAM dirty support. Protect with the domain paging lock. */ struct sh_dirty_vram *dirty_vram; /* If one of vcpus of this domain is in no_fill_mode or ++++++ xsa105.patch ++++++ x86/emulate: check cpl for all privileged instructions Without this, it is possible for userspace to load its own IDT or GDT. This is XSA-105. Signed-off-by: Andrew Cooper <[email protected]> Reviewed-by: Jan Beulich <[email protected]> --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -3314,6 +3314,7 @@ x86_emulate( goto swint; case 0xf4: /* hlt */ + generate_exception_if(!mode_ring0(), EXC_GP, 0); ctxt->retire.flags.hlt = 1; break; @@ -3710,6 +3711,7 @@ x86_emulate( break; case 2: /* lgdt */ case 3: /* lidt */ + generate_exception_if(!mode_ring0(), EXC_GP, 0); generate_exception_if(ea.type != OP_MEM, EXC_UD, -1); fail_if(ops->write_segment == NULL); memset(®, 0, sizeof(reg)); @@ -3738,6 +3740,7 @@ x86_emulate( case 6: /* lmsw */ fail_if(ops->read_cr == NULL); fail_if(ops->write_cr == NULL); + generate_exception_if(!mode_ring0(), EXC_GP, 0); if ( (rc = ops->read_cr(0, &cr0, ctxt)) ) goto done; if ( ea.type == OP_REG ) ++++++ xsa106.patch ++++++ x86emul: only emulate software interrupt injection for real mode Protected mode emulation currently lacks proper privilege checking of the referenced IDT entry, and there's currently no legitimate way for any of the respective instructions to reach the emulator when the guest is in protected mode. This is XSA-106. Signed-off-by: Jan Beulich <[email protected]> Acked-by: Keir Fraser <[email protected]> --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -2634,6 +2634,7 @@ x86_emulate( case 0xcd: /* int imm8 */ src.val = insn_fetch_type(uint8_t); swint: + fail_if(!in_realmode(ctxt, ops)); /* XSA-106 */ fail_if(ops->inject_sw_interrupt == NULL); rc = ops->inject_sw_interrupt(src.val, _regs.eip - ctxt->regs->eip, ctxt) ? : X86EMUL_EXCEPTION; ++++++ xsa107.patch ++++++ evtchn: check control block exists when using FIFO-based events When using the FIFO-based event channels, there are no checks for the existance of a control block when binding an event or moving it to a different VCPU. This is because events may be bound when the ABI is in 2-level mode (e.g., by the toolstack before the domain is started). The guest may trigger a Xen crash in evtchn_fifo_set_pending() if: a) the event is bound to a VCPU without a control block; or b) VCPU 0 does not have a control block. In case (a), Xen will crash when looking up the current queue. In (b), Xen will crash when looking up the old queue (which defaults to a queue on VCPU 0). By allocating all the per-VCPU structures when enabling the FIFO ABI, we can be sure that v->evtchn_fifo is always valid. EVTCHNOP_init_control_block for all the other CPUs need only map the shared control block. A single check in evtchn_fifo_set_pending() before accessing the control block fixes all cases where the guest has not initialized some control blocks. This is XSA-107. Reported-by: Vitaly Kuznetsov <[email protected]> Signed-off-by: David Vrabel <[email protected]> Reviewed-by: Jan Beulich <[email protected]> --- a/xen/common/event_fifo.c +++ b/xen/common/event_fifo.c @@ -178,6 +178,19 @@ static void evtchn_fifo_set_pending(stru bool_t linked = 0; /* + * Control block not mapped. The guest must not unmask an + * event until the control block is initialized, so we can + * just drop the event. + */ + if ( unlikely(!v->evtchn_fifo->control_block) ) + { + printk(XENLOG_G_WARNING + "d%dv%d has no FIFO event channel control block\n", + d->domain_id, v->vcpu_id); + goto done; + } + + /* * No locking around getting the queue. This may race with * changing the priority but we are allowed to signal the * event once on the old priority. @@ -385,36 +398,42 @@ static void init_queue(struct vcpu *v, s { spin_lock_init(&q->lock); q->priority = i; - q->head = &v->evtchn_fifo->control_block->head[i]; } -static int setup_control_block(struct vcpu *v, uint64_t gfn, uint32_t offset) +static int setup_control_block(struct vcpu *v) { - struct domain *d = v->domain; struct evtchn_fifo_vcpu *efv; - void *virt; unsigned int i; - int rc; - - if ( v->evtchn_fifo ) - return -EINVAL; efv = xzalloc(struct evtchn_fifo_vcpu); if ( !efv ) return -ENOMEM; - rc = map_guest_page(d, gfn, &virt); + for ( i = 0; i <= EVTCHN_FIFO_PRIORITY_MIN; i++ ) + init_queue(v, &efv->queue[i], i); + + v->evtchn_fifo = efv; + + return 0; +} + +static int map_control_block(struct vcpu *v, uint64_t gfn, uint32_t offset) +{ + void *virt; + unsigned int i; + int rc; + + if ( v->evtchn_fifo->control_block ) + return -EINVAL; + + rc = map_guest_page(v->domain, gfn, &virt); if ( rc < 0 ) - { - xfree(efv); return rc; - } - v->evtchn_fifo = efv; v->evtchn_fifo->control_block = virt + offset; for ( i = 0; i <= EVTCHN_FIFO_PRIORITY_MIN; i++ ) - init_queue(v, &v->evtchn_fifo->queue[i], i); + v->evtchn_fifo->queue[i].head = &v->evtchn_fifo->control_block->head[i]; return 0; } @@ -508,28 +527,43 @@ int evtchn_fifo_init_control(struct evtc spin_lock(&d->event_lock); - rc = setup_control_block(v, gfn, offset); - /* * If this is the first control block, setup an empty event array * and switch to the fifo port ops. */ - if ( rc == 0 && !d->evtchn_fifo ) + if ( !d->evtchn_fifo ) { + struct vcpu *vcb; + + for_each_vcpu ( d, vcb ) { + rc = setup_control_block(vcb); + if ( rc < 0 ) + goto error; + } + rc = setup_event_array(d); if ( rc < 0 ) - cleanup_control_block(v); - else - { - d->evtchn_port_ops = &evtchn_port_ops_fifo; - d->max_evtchns = EVTCHN_FIFO_NR_CHANNELS; - setup_ports(d); - } + goto error; + + rc = map_control_block(v, gfn, offset); + if ( rc < 0 ) + goto error; + + d->evtchn_port_ops = &evtchn_port_ops_fifo; + d->max_evtchns = EVTCHN_FIFO_NR_CHANNELS; + setup_ports(d); } + else + rc = map_control_block(v, gfn, offset); spin_unlock(&d->event_lock); return rc; + + error: + evtchn_fifo_destroy(d); + spin_unlock(&d->event_lock); + return rc; } static int add_page_to_event_array(struct domain *d, unsigned long gfn) -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
