Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock
Please unblock xen/4.1.3-1. It updates the package to the release. By doing this it fixes two security bugs, error handling in exceptional conditions, missing access control and adds hardware support. It also includes a build fix (removal of asmlinkage, which is a larger fraction of the overall patch) for gcc 4.7 that was already fixed for Debian in a different way. xen (4.1.3-1) unstable; urgency=medium * New upstream release: (closes: #683286) - Don't leave the x86 emulation in a bad state. (closes: #683279) CVE-2012-3432 - Only check for shared pages while any exist on teardown. CVE-2012-3433 - Fix error handling for unexpected conditions. - Update CPUID masking to latest Intel spec. - Allow large ACPI ids. - Fix IOMMU support for PCI-to-PCIe bridges. - Disallow access to some sensitive IO-ports. - Fix wrong address in IOTLB. - Fix deadlock on CPUs without working cpufreq driver. - Use uncached disk access in qemu. - Fix buffer size on emulated e1000 device in qemu. * Fixup broken and remove applied patches. -- Bastian Blank <wa...@debian.org> Fri, 17 Aug 2012 11:25:02 +0200 diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/.hg_archival.txt xen-4.1.3/.hg_archival.txt --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/.hg_archival.txt 2012-06-14 10:39:57.000000000 +0000 +++ xen-4.1.3/.hg_archival.txt 2012-08-09 20:08:04.000000000 +0000 @@ -1,5 +1,4 @@ repo: ab039beb22dc9d53f224a5ef2ef88d534b561898 -node: a9c0a89c08f2a1c92f64f001b653d7c02fbc852c +node: ce7195d2b80e4df9857e434fa29689fd678a2341 branch: default -latesttag: 4.1.3-rc1 -latesttagdistance: 13 +tag: RELEASE-4.1.3 diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/.hgsigs xen-4.1.3/.hgsigs --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/.hgsigs 2012-06-14 10:39:57.000000000 +0000 +++ xen-4.1.3/.hgsigs 2012-08-09 20:08:04.000000000 +0000 @@ -16,3 +16,5 @@ 24041ed83728ac6c26d3c32d29d7d08eb8433149 0 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 diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/.hgtags xen-4.1.3/.hgtags --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/.hgtags 2012-06-14 10:39:57.000000000 +0000 +++ xen-4.1.3/.hgtags 2012-08-09 20:08:04.000000000 +0000 @@ -63,3 +63,5 @@ 24041ed83728ac6c26d3c32d29d7d08eb8433149 4.1.2-rc3 3eca5bf65e6cca881d599c68f2305f865e0f9fd0 RELEASE-4.1.2 da64f68730cf1c42c06919578e70d8bc01041051 4.1.3-rc1 +acbd3617691397911f34e4574d03385c08aec900 4.1.3-rc2 +5cdcfed7b5b129843e1602b5d43c7651de337092 4.1.3-rc3 diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/Config.mk xen-4.1.3/Config.mk --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/Config.mk 2012-08-18 11:44:33.000000000 +0000 +++ xen-4.1.3/Config.mk 2012-08-18 11:44:27.000000000 +0000 @@ -179,7 +179,7 @@ # CONFIG_QEMU ?= `pwd`/$(XEN_ROOT)/../qemu-xen.git CONFIG_QEMU ?= $(QEMU_REMOTE) -QEMU_TAG ?= xen-4.1.3-rc1 +QEMU_TAG ?= xen-4.1.3 # Mon Apr 2 17:55:05 2012 +0100 # qemu-xen-traditional: QDISK fixes diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/debian/changelog xen-4.1.3/debian/changelog --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/debian/changelog 2012-07-28 08:23:49.000000000 +0000 +++ xen-4.1.3/debian/changelog 2012-08-17 09:25:55.000000000 +0000 @@ -1,3 +1,23 @@ +xen (4.1.3-1) unstable; urgency=medium + + * New upstream release: (closes: #683286) + - Don't leave the x86 emulation in a bad state. (closes: #683279) + CVE-2012-3432 + - Only check for shared pages while any exist on teardown. + CVE-2012-3433 + - Fix error handling for unexpected conditions. + - Update CPUID masking to latest Intel spec. + - Allow large ACPI ids. + - Fix IOMMU support for PCI-to-PCIe bridges. + - Disallow access to some sensitive IO-ports. + - Fix wrong address in IOTLB. + - Fix deadlock on CPUs without working cpufreq driver. + - Use uncached disk access in qemu. + - Fix buffer size on emulated e1000 device in qemu. + * Fixup broken and remove applied patches. + + -- Bastian Blank <wa...@debian.org> Fri, 17 Aug 2012 11:25:02 +0200 + xen (4.1.3~rc1+hg-20120614.a9c0a89c08f2-5) unstable; urgency=low [ Ian Campbell ] diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/debian/control.md5sum xen-4.1.3/debian/control.md5sum --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/debian/control.md5sum 2012-07-28 08:24:09.000000000 +0000 +++ xen-4.1.3/debian/control.md5sum 2012-08-17 09:27:06.000000000 +0000 @@ -1,4 +1,4 @@ -478e166c79e05c696584c9ba633c0d7e debian/changelog +05bf20e67873f3a3cca030d54cbeb222 debian/changelog 2cfc80dad0da6ef5789993726da25549 debian/bin/gencontrol.py 667edd28bcda9cd243bb69c78e452aad debian/templates/control.hypervisor.in 4106f2621fc4dad25c0d6569b51cbce3 debian/templates/control.main.in diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/debian/patches/series xen-4.1.3/debian/patches/series --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/debian/patches/series 2012-07-01 14:45:10.000000000 +0000 +++ xen-4.1.3/debian/patches/series 2012-08-16 20:34:51.000000000 +0000 @@ -2,7 +2,6 @@ upstream-23937:5173834e8476 upstream-23938:fa04fbd56521-rework upstream-23939:51288f69523f-rework -upstream-23940:187d59e32a58 upstream-25290:7a6dcecb1781-rework xen-x86-interrupt-pointer-missmatch.diff diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/debian/patches/tools-pygrub-remove-static-solaris-support.patch xen-4.1.3/debian/patches/tools-pygrub-remove-static-solaris-support.patch --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/debian/patches/tools-pygrub-remove-static-solaris-support.patch 2011-03-16 16:18:07.000000000 +0000 +++ xen-4.1.3/debian/patches/tools-pygrub-remove-static-solaris-support.patch 2012-08-06 15:39:30.000000000 +0000 @@ -8,7 +8,7 @@ import curses, _curses, curses.wrapper, curses.textpad, curses.ascii import getopt -@@ -585,48 +584,6 @@ +@@ -595,51 +594,6 @@ return grubcfg @@ -23,7 +23,8 @@ -# If nothing has been specified, look for a Solaris domU. If found, perform the -# necessary tweaks. -def sniff_solaris(fs, cfg): -- if not fs.file_exists("/platform/i86xpv/kernel/unix"): +- if not fs.file_exists("/platform/i86xpv/kernel/unix") and \ +- not fs.file_exists("/platform/i86xpv/kernel/amd64/unix"): - return cfg - - if not cfg["kernel"]: @@ -31,9 +32,11 @@ - fs.file_exists("/platform/i86xpv/kernel/amd64/unix"): - cfg["kernel"] = "/platform/i86xpv/kernel/amd64/unix" - cfg["ramdisk"] = "/platform/i86pc/amd64/boot_archive" -- else: +- elif fs.file_exists("/platform/i86xpv/kernel/unix"): - cfg["kernel"] = "/platform/i86xpv/kernel/unix" - cfg["ramdisk"] = "/platform/i86pc/boot_archive" +- else: +- return cfg - - # Unpleasant. Typically we'll have 'root=foo -k' or 'root=foo /kernel -k', - # and we need to maintain Xen properties (root= and ip=) and the kernel @@ -57,7 +60,7 @@ def sniff_netware(fs, cfg): if not fs.file_exists("/nwserver/xnloader.sys"): return cfg -@@ -751,10 +708,7 @@ +@@ -764,10 +718,7 @@ try: fs = fsimage.open(file, offset, bootfsoptions) diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/debian/patches/upstream-23936:cdb34816a40a-rework xen-4.1.3/debian/patches/upstream-23936:cdb34816a40a-rework --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/debian/patches/upstream-23936:cdb34816a40a-rework 2011-12-06 21:43:59.000000000 +0000 +++ xen-4.1.3/debian/patches/upstream-23936:cdb34816a40a-rework 2012-08-16 20:34:51.000000000 +0000 @@ -2430,7 +2430,7 @@ - - for (i=0; i<len; i++) { - if (Bool_val(Field(cpumap, i))) -- c_cpumap[i/8] |= i << (i&7); +- c_cpumap[i/8] |= 1 << (i&7); - } - retval = xc_vcpu_setaffinity(_H(xch), _D(domid), - Int_val(vcpu), c_cpumap); @@ -2466,7 +2466,7 @@ - ret = caml_alloc(len, 0); - - for (i=0; i<len; i++) { -- if (c_cpumap[i%8] & 1 << (i&7)) +- if (c_cpumap[i/8] & 1 << (i&7)) - Store_field(ret, i, Val_true); - else - Store_field(ret, i, Val_false); @@ -2523,7 +2523,7 @@ - -CAMLprim value stub_xc_readconsolering(value xch) -{ -- unsigned int size = RING_SIZE; +- unsigned int size = RING_SIZE - 1; - char *ring_ptr = ring; - - CAMLparam1(xch); @@ -4110,7 +4110,7 @@ + + for (i=0; i<len; i++) { + if (Bool_val(Field(cpumap, i))) -+ c_cpumap[i/8] |= i << (i&7); ++ c_cpumap[i/8] |= 1 << (i&7); + } + retval = xc_vcpu_setaffinity(_H(xch), _D(domid), + Int_val(vcpu), c_cpumap); @@ -4146,7 +4146,7 @@ + ret = caml_alloc(len, 0); + + for (i=0; i<len; i++) { -+ if (c_cpumap[i%8] & 1 << (i&7)) ++ if (c_cpumap[i/8] & 1 << (i&7)) + Store_field(ret, i, Val_true); + else + Store_field(ret, i, Val_false); @@ -4203,7 +4203,7 @@ + +CAMLprim value stub_xc_readconsolering(value xch) +{ -+ unsigned int size = RING_SIZE; ++ unsigned int size = RING_SIZE - 1; + char *ring_ptr = ring; + + CAMLparam1(xch); diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/debian/patches/upstream-23940:187d59e32a58 xen-4.1.3/debian/patches/upstream-23940:187d59e32a58 --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/debian/patches/upstream-23940:187d59e32a58 2011-12-06 21:43:59.000000000 +0000 +++ xen-4.1.3/debian/patches/upstream-23940:187d59e32a58 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -# HG changeset patch -# User Jon Ludlam <jonathan.lud...@eu.citrix.com> -# Date 1318261276 -3600 -# Node ID 187d59e32a586d65697ed46bef106b52e3fb5ab9 -# Parent 51288f69523fcbbefa12cea5a761a6e957410151 -tools/ocaml: Fix 2 bit-twiddling bugs and an off-by-one - -The bit bugs are in ocaml vcpu affinity calls, and the off-by-one -error is in the ocaml console ring code - -Signed-off-by: Zheng Li <zheng...@eu.citrix.com> -Acked-by: Ian Campbell <ian.campbell.com> -Committed-by: Ian Jackson <ian.jackson.citrix.com> -Acked-by: Jon Ludlam <jonathan.lud...@eu.citrix.com> - -diff -r 51288f69523f -r 187d59e32a58 tools/ocaml/libs/xc/xenctrl_stubs.c ---- a/tools/ocaml/libs/xc/xenctrl_stubs.c Mon Oct 10 16:41:16 2011 +0100 -+++ b/tools/ocaml/libs/xc/xenctrl_stubs.c Mon Oct 10 16:41:16 2011 +0100 -@@ -430,7 +430,7 @@ - - for (i=0; i<len; i++) { - if (Bool_val(Field(cpumap, i))) -- c_cpumap[i/8] |= i << (i&7); -+ c_cpumap[i/8] |= 1 << (i&7); - } - retval = xc_vcpu_setaffinity(_H(xch), _D(domid), - Int_val(vcpu), c_cpumap); -@@ -466,7 +466,7 @@ - ret = caml_alloc(len, 0); - - for (i=0; i<len; i++) { -- if (c_cpumap[i%8] & 1 << (i&7)) -+ if (c_cpumap[i/8] & 1 << (i&7)) - Store_field(ret, i, Val_true); - else - Store_field(ret, i, Val_false); -@@ -523,7 +523,7 @@ - - CAMLprim value stub_xc_readconsolering(value xch) - { -- unsigned int size = RING_SIZE; -+ unsigned int size = RING_SIZE - 1; - char *ring_ptr = ring; - - CAMLparam1(xch); diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/qemu/hw/e1000.c xen-4.1.3/qemu/hw/e1000.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/qemu/hw/e1000.c 2011-04-28 07:38:36.000000000 +0000 +++ xen-4.1.3/qemu/hw/e1000.c 2012-04-24 17:35:40.000000000 +0000 @@ -444,6 +444,8 @@ bytes = split_size; if (tp->size + bytes > msh) bytes = msh - tp->size; + + bytes = MIN(sizeof(tp->data) - tp->size, bytes); cpu_physical_memory_read(addr, tp->data + tp->size, bytes); if ((sz = tp->size + bytes) >= hdr && tp->size < hdr) memmove(tp->header, tp->data, hdr); @@ -459,6 +461,7 @@ // context descriptor TSE is not set, while data descriptor TSE is set DBGOUT(TXERR, "TCP segmentaion Error\n"); } else { + split_size = MIN(sizeof(tp->data) - tp->size, split_size); cpu_physical_memory_read(addr, tp->data + tp->size, split_size); tp->size += split_size; } diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/qemu/hw/pci.h xen-4.1.3/qemu/hw/pci.h --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/qemu/hw/pci.h 2011-04-28 07:38:36.000000000 +0000 +++ xen-4.1.3/qemu/hw/pci.h 2012-04-24 17:35:40.000000000 +0000 @@ -177,9 +177,15 @@ #define PCI_STATUS_RESERVED1 0x007 #define PCI_STATUS_INT_STATUS 0x008 #define PCI_STATUS_CAPABILITIES 0x010 +#ifndef PCI_STATUS_66MHZ #define PCI_STATUS_66MHZ 0x020 +#endif +#ifndef PCI_STATUS_RESERVED2 #define PCI_STATUS_RESERVED2 0x040 +#endif +#ifndef PCI_STATUS_FAST_BACK #define PCI_STATUS_FAST_BACK 0x080 +#endif #define PCI_STATUS_DEVSEL 0x600 #define PCI_STATUS_RESERVED_MASK_LO (PCI_STATUS_RESERVED1 | \ diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/qemu/hw/pt-msi.h xen-4.1.3/qemu/hw/pt-msi.h --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/qemu/hw/pt-msi.h 2011-04-28 07:38:36.000000000 +0000 +++ xen-4.1.3/qemu/hw/pt-msi.h 2012-04-24 17:35:40.000000000 +0000 @@ -26,7 +26,9 @@ /* MSI-X */ #define PCI_MSIX_ENABLE 0x8000 #define PCI_MSIX_MASK 0x4000 +#ifndef PCI_MSIX_TABSIZE #define PCI_MSIX_TABSIZE 0x03ff +#endif #define PCI_MSIX_TABLE 4 #define PCI_MSIX_PBA 8 #define PCI_MSIX_BIR 0x7 diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/qemu/hw/xen_console.c xen-4.1.3/qemu/hw/xen_console.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/qemu/hw/xen_console.c 2011-04-28 07:38:36.000000000 +0000 +++ xen-4.1.3/qemu/hw/xen_console.c 2012-04-24 17:35:40.000000000 +0000 @@ -253,6 +253,8 @@ { struct XenConsole *con = container_of(xendev, struct XenConsole, xendev); + if (!xendev->dev) + return; if (con->chr) qemu_chr_add_handlers(con->chr, NULL, NULL, NULL, NULL); xen_be_unbind_evtchn(&con->xendev); diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/qemu/hw/xen_disk.c xen-4.1.3/qemu/hw/xen_disk.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/qemu/hw/xen_disk.c 2011-04-28 07:38:36.000000000 +0000 +++ xen-4.1.3/qemu/hw/xen_disk.c 2012-04-24 17:35:40.000000000 +0000 @@ -46,11 +46,11 @@ /* ------------------------------------------------------------- */ -static int syncwrite = 1; -static int batch_maps = 0; +static int syncwrite = 0; +static int batch_maps = 1; static int max_requests = 32; -static int use_aio = 0; +static int use_aio = 1; /* ------------------------------------------------------------- */ @@ -382,6 +382,8 @@ ioreq->aio_inflight--; if (ioreq->aio_inflight > 0) return; + if (ioreq->postsync) + bdrv_flush(ioreq->blkdev->bs); ioreq->status = ioreq->aio_errors ? BLKIF_RSP_ERROR : BLKIF_RSP_OKAY; ioreq_unmap(ioreq); @@ -409,9 +411,9 @@ break; case BLKIF_OP_WRITE: case BLKIF_OP_WRITE_BARRIER: - ioreq->aio_inflight++; if (!ioreq->req.nr_segments) break; + ioreq->aio_inflight++; bdrv_aio_writev(blkdev->bs, ioreq->start / BLOCK_SIZE, &ioreq->v, ioreq->v.size / BLOCK_SIZE, qemu_aio_complete, ioreq); @@ -421,8 +423,6 @@ goto err; } - if (ioreq->postsync) - bdrv_flush(blkdev->bs); /* FIXME: aio_flush() ??? */ qemu_aio_complete(ioreq, 0); return 0; @@ -617,12 +617,13 @@ return -1; /* read-only ? */ + qflags = BDRV_O_NOCACHE; if (strcmp(blkdev->mode, "w") == 0) { mode = O_RDWR; - qflags = BDRV_O_RDWR; + qflags |= BDRV_O_RDWR; } else { mode = O_RDONLY; - qflags = BDRV_O_RDONLY; + qflags |= BDRV_O_RDONLY; info |= VDISK_READONLY; } diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/qemu/xenstore.c xen-4.1.3/qemu/xenstore.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/qemu/xenstore.c 2011-04-28 07:38:36.000000000 +0000 +++ xen-4.1.3/qemu/xenstore.c 2012-04-24 17:35:40.000000000 +0000 @@ -643,7 +643,7 @@ } pstrcpy(bs->filename, sizeof(bs->filename), params); - flags = BDRV_O_CACHE_WB; /* snapshot and write-back */ + flags = BDRV_O_NOCACHE; is_readonly = 0; if (pasprintf(&buf, "%s/mode", bpath) == -1) continue; diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/Makefile xen-4.1.3/xen/Makefile --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/Makefile 2012-08-18 11:44:33.000000000 +0000 +++ xen-4.1.3/xen/Makefile 2012-08-18 11:44:27.000000000 +0000 @@ -2,7 +2,7 @@ # All other places this is stored (eg. compile.h) should be autogenerated. export XEN_VERSION = 4 export XEN_SUBVERSION = 1 -export XEN_EXTRAVERSION ?= .3-rc2-pre$(XEN_VENDORVERSION) +export XEN_EXTRAVERSION ?= .3$(XEN_VENDORVERSION) export XEN_FULLVERSION = $(XEN_VERSION).$(XEN_SUBVERSION)$(XEN_EXTRAVERSION) -include xen-version diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/ia64/linux-xen/acpi.c xen-4.1.3/xen/arch/ia64/linux-xen/acpi.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/ia64/linux-xen/acpi.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/ia64/linux-xen/acpi.c 2012-08-09 20:08:08.000000000 +0000 @@ -223,11 +223,14 @@ {[0 ... MAX_LOCAL_SAPIC - 1] = 0xffff }; /* acpi id to cpu id */ -int get_cpu_id(u8 acpi_id) +int get_cpu_id(u32 acpi_id) { int i; u16 apic_id; + if ( acpi_id >= MAX_LOCAL_SAPIC ) + return -EINVAL; + apic_id = ia64_acpiid_to_sapicid[acpi_id]; if ( apic_id == 0xffff ) return -EINVAL; diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/acpi/cpu_idle.c xen-4.1.3/xen/arch/x86/acpi/cpu_idle.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/acpi/cpu_idle.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/acpi/cpu_idle.c 2012-08-09 20:08:08.000000000 +0000 @@ -44,6 +44,7 @@ #include <xen/sched-if.h> #include <asm/cache.h> #include <asm/io.h> +#include <asm/iocap.h> #include <asm/hpet.h> #include <asm/processor.h> #include <xen/pmstat.h> @@ -111,6 +112,7 @@ /* Westmere */ case 0x25: case 0x2C: + case 0x2F: GET_PC3_RES(hw_res->pc3); GET_PC6_RES(hw_res->pc6); GET_PC7_RES(hw_res->pc7); @@ -887,6 +889,9 @@ cx->entry_method = ACPI_CSTATE_EM_HALT; break; case ACPI_ADR_SPACE_SYSTEM_IO: + if ( ioports_deny_access(dom0, cx->address, cx->address) ) + printk(XENLOG_WARNING "Could not deny access to port %04x\n", + cx->address); cx->entry_method = ACPI_CSTATE_EM_SYSIO; break; default: @@ -902,11 +907,14 @@ acpi_power->safe_state = cx; } -int get_cpu_id(u8 acpi_id) +int get_cpu_id(u32 acpi_id) { int i; u32 apic_id; + if ( acpi_id >= MAX_MADT_ENTRIES ) + return -1; + apic_id = x86_acpiid_to_apicid[acpi_id]; if ( apic_id == BAD_APICID ) return -1; @@ -983,7 +991,7 @@ print_cx_pminfo(cpu, power); /* map from acpi_id to cpu_id */ - cpu_id = get_cpu_id((u8)cpu); + cpu_id = get_cpu_id(cpu); if ( cpu_id == -1 ) { printk(XENLOG_ERR "no cpu_id for acpi_id %d\n", cpu); diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/acpi/power.c xen-4.1.3/xen/arch/x86/acpi/power.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/acpi/power.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/acpi/power.c 2012-08-09 20:08:08.000000000 +0000 @@ -321,7 +321,7 @@ } /* System is really put into sleep state by this stub */ -acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state) +acpi_status acpi_enter_sleep_state(u8 sleep_state) { acpi_status status; diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/cpu/common.c xen-4.1.3/xen/arch/x86/cpu/common.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/cpu/common.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/cpu/common.c 2012-08-09 20:08:08.000000000 +0000 @@ -27,10 +27,15 @@ static bool_t __cpuinitdata use_xsave; boolean_param("xsave", use_xsave); + unsigned int __devinitdata opt_cpuid_mask_ecx = ~0u; integer_param("cpuid_mask_ecx", opt_cpuid_mask_ecx); unsigned int __devinitdata opt_cpuid_mask_edx = ~0u; integer_param("cpuid_mask_edx", opt_cpuid_mask_edx); + +unsigned int __devinitdata opt_cpuid_mask_xsave_eax = ~0u; +integer_param("cpuid_mask_xsave_eax", opt_cpuid_mask_xsave_eax); + unsigned int __devinitdata opt_cpuid_mask_ext_ecx = ~0u; integer_param("cpuid_mask_ext_ecx", opt_cpuid_mask_ext_ecx); unsigned int __devinitdata opt_cpuid_mask_ext_edx = ~0u; diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/cpu/cpu.h xen-4.1.3/xen/arch/x86/cpu/cpu.h --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/cpu/cpu.h 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/cpu/cpu.h 2012-08-09 20:08:08.000000000 +0000 @@ -22,6 +22,7 @@ extern struct cpu_dev * cpu_devs [X86_VENDOR_NUM]; extern unsigned int opt_cpuid_mask_ecx, opt_cpuid_mask_edx; +extern unsigned int opt_cpuid_mask_xsave_eax; extern unsigned int opt_cpuid_mask_ext_ecx, opt_cpuid_mask_ext_edx; extern int get_model_name(struct cpuinfo_x86 *c); diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/cpu/intel.c xen-4.1.3/xen/arch/x86/cpu/intel.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/cpu/intel.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/cpu/intel.c 2012-08-09 20:08:08.000000000 +0000 @@ -59,10 +59,12 @@ */ static void __devinit set_cpuidmask(const struct cpuinfo_x86 *c) { + u32 eax, edx; const char *extra = ""; if (!~(opt_cpuid_mask_ecx & opt_cpuid_mask_edx & - opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx)) + opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx & + opt_cpuid_mask_xsave_eax)) return; /* Only family 6 supports this feature */ @@ -75,7 +77,11 @@ wrmsr(MSR_INTEL_CPUID_FEATURE_MASK, opt_cpuid_mask_ecx, opt_cpuid_mask_edx); - if (!~(opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx)) + if (~(opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx)) + extra = "extended "; + else if (~opt_cpuid_mask_xsave_eax) + extra = "xsave "; + else return; extra = "extended "; break; @@ -97,11 +103,25 @@ wrmsr(MSR_INTEL_CPUID80000001_FEATURE_MASK, opt_cpuid_mask_ext_ecx, opt_cpuid_mask_ext_edx); + if (!~opt_cpuid_mask_xsave_eax) + return; + extra = "xsave "; + break; + case 0x2a: + wrmsr(MSR_INTEL_CPUID1_FEATURE_MASK_V2, + opt_cpuid_mask_ecx, + opt_cpuid_mask_edx); + rdmsr(MSR_INTEL_CPUIDD_01_FEATURE_MASK, eax, edx); + wrmsr(MSR_INTEL_CPUIDD_01_FEATURE_MASK, + opt_cpuid_mask_xsave_eax, edx); + wrmsr(MSR_INTEL_CPUID80000001_FEATURE_MASK_V2, + opt_cpuid_mask_ext_ecx, + opt_cpuid_mask_ext_edx); return; } - printk(XENLOG_ERR "Cannot set CPU feature mask on CPU#%d\n", - smp_processor_id()); + printk(XENLOG_ERR "Cannot set CPU %sfeature mask on CPU#%d\n", + extra, smp_processor_id()); } void __devinit early_intel_workaround(struct cpuinfo_x86 *c) diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/domctl.c xen-4.1.3/xen/arch/x86/domctl.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/domctl.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/domctl.c 2012-08-09 20:08:08.000000000 +0000 @@ -873,7 +873,7 @@ break; } - ret = xsm_assign_device(d, domctl->u.assign_device.machine_bdf); + ret = xsm_deassign_device(d, domctl->u.assign_device.machine_bdf); if ( ret ) goto deassign_device_out; diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/hvm/hvm.c xen-4.1.3/xen/arch/x86/hvm/hvm.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/hvm/hvm.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/hvm/hvm.c 2012-08-09 20:08:08.000000000 +0000 @@ -1109,7 +1109,7 @@ domain_shutdown(v->domain, SHUTDOWN_reboot); } -bool_t hvm_hap_nested_page_fault(unsigned long gpa, +bool_t hvm_hap_nested_page_fault(paddr_t gpa, bool_t gla_valid, unsigned long gla, bool_t access_valid, diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/hvm/io.c xen-4.1.3/xen/arch/x86/hvm/io.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/hvm/io.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/hvm/io.c 2012-08-09 20:08:08.000000000 +0000 @@ -176,6 +176,8 @@ rc = hvm_emulate_one(&ctxt); + if ( rc != X86EMUL_RETRY ) + curr->arch.hvm_vcpu.io_state = HVMIO_none; if ( curr->arch.hvm_vcpu.io_state == HVMIO_awaiting_completion ) curr->arch.hvm_vcpu.io_state = HVMIO_handle_mmio_awaiting_completion; else diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/hvm/svm/asid.c xen-4.1.3/xen/arch/x86/hvm/svm/asid.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/hvm/svm/asid.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/hvm/svm/asid.c 2012-08-09 20:08:08.000000000 +0000 @@ -38,7 +38,7 @@ * Called directly before VMRUN. Checks if the VCPU needs a new ASID, * assigns it, and if required, issues required TLB flushes. */ -asmlinkage void svm_asid_handle_vmrun(void) +void svm_asid_handle_vmrun(void) { struct vcpu *curr = current; struct vmcb_struct *vmcb = curr->arch.hvm_svm.vmcb; @@ -52,7 +52,8 @@ return; } - vmcb_set_guest_asid(vmcb, curr->arch.hvm_vcpu.asid); + if (vmcb_get_guest_asid(vmcb) != curr->arch.hvm_vcpu.asid) + vmcb_set_guest_asid(vmcb, curr->arch.hvm_vcpu.asid); vmcb->tlb_control = need_flush; } diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/hvm/svm/intr.c xen-4.1.3/xen/arch/x86/hvm/svm/intr.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/hvm/svm/intr.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/hvm/svm/intr.c 2012-08-09 20:08:08.000000000 +0000 @@ -116,7 +116,7 @@ vmcb, general1_intercepts | GENERAL1_INTERCEPT_VINTR); } -asmlinkage void svm_intr_assist(void) +void svm_intr_assist(void) { struct vcpu *v = current; struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb; diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/hvm/svm/svm.c xen-4.1.3/xen/arch/x86/hvm/svm/svm.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/hvm/svm/svm.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/hvm/svm/svm.c 2012-08-09 20:08:08.000000000 +0000 @@ -1534,7 +1534,7 @@ .get_insn_bytes = svm_get_insn_bytes, }; -asmlinkage void svm_vmexit_handler(struct cpu_user_regs *regs) +void svm_vmexit_handler(struct cpu_user_regs *regs) { unsigned int exit_reason; struct vcpu *v = current; @@ -1851,7 +1851,7 @@ vmcb_set_vintr(vmcb, intr); } -asmlinkage void svm_trace_vmentry(void) +void svm_trace_vmentry(void) { HVMTRACE_ND (VMENTRY, 1/*cycles*/, 0, 0, 0, 0, 0, 0, 0); } diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/hvm/vmx/intr.c xen-4.1.3/xen/arch/x86/hvm/vmx/intr.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/hvm/vmx/intr.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/hvm/vmx/intr.c 2012-08-09 20:08:08.000000000 +0000 @@ -109,7 +109,7 @@ } } -asmlinkage void vmx_intr_assist(void) +void vmx_intr_assist(void) { struct hvm_intack intack; struct vcpu *v = current; diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/hvm/vmx/vmx.c xen-4.1.3/xen/arch/x86/hvm/vmx/vmx.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/hvm/vmx/vmx.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/hvm/vmx/vmx.c 2012-08-09 20:08:08.000000000 +0000 @@ -2035,7 +2035,7 @@ domain_crash(curr->domain); } -asmlinkage void vmx_enter_realmode(struct cpu_user_regs *regs) +void vmx_enter_realmode(struct cpu_user_regs *regs) { struct vcpu *v = current; @@ -2089,7 +2089,7 @@ return 0; } -asmlinkage void vmx_vmexit_handler(struct cpu_user_regs *regs) +void vmx_vmexit_handler(struct cpu_user_regs *regs) { unsigned int exit_reason, idtv_info, intr_info = 0, vector = 0; unsigned long exit_qualification, inst_len = 0; @@ -2518,7 +2518,7 @@ } } -asmlinkage void vmx_vmenter_helper(void) +void vmx_vmenter_helper(void) { struct vcpu *curr = current; u32 new_asid, old_asid; diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/io_apic.c xen-4.1.3/xen/arch/x86/io_apic.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/io_apic.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/io_apic.c 2012-08-09 20:08:08.000000000 +0000 @@ -2665,7 +2665,7 @@ } } - nr_irqs_gsi = max(nr_irqs_gsi, highest_gsi()); + nr_irqs_gsi = max(nr_irqs_gsi, highest_gsi() + 1); if ( max_gsi_irqs == 0 ) max_gsi_irqs = nr_irqs ? nr_irqs / 8 : PAGE_SIZE; diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/irq.c xen-4.1.3/xen/arch/x86/irq.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/irq.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/irq.c 2012-08-09 20:08:08.000000000 +0000 @@ -636,7 +636,7 @@ DEFINE_PER_CPU(unsigned int, irq_count); -asmlinkage void do_IRQ(struct cpu_user_regs *regs) +void do_IRQ(struct cpu_user_regs *regs) { struct irqaction *action; uint32_t tsc_in; diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/mm/p2m.c xen-4.1.3/xen/arch/x86/mm/p2m.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/mm/p2m.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/mm/p2m.c 2012-08-09 20:08:08.000000000 +0000 @@ -2044,6 +2044,8 @@ #ifdef __x86_64__ for ( gfn=0; gfn < p2m->max_mapped_pfn; gfn++ ) { + if ( atomic_read(&d->shr_pages) == 0 ) + break; mfn = p2m->get_entry(p2m, gfn, &t, &a, p2m_query); if ( mfn_valid(mfn) && (t == p2m_ram_shared) ) BUG_ON(mem_sharing_unshare_page(p2m, gfn, MEM_SHARING_DESTROY_GFN)); @@ -3032,7 +3034,7 @@ mem_event_unpause_vcpus(d); } -void p2m_mem_access_check(unsigned long gpa, bool_t gla_valid, unsigned long gla, +void p2m_mem_access_check(paddr_t gpa, bool_t gla_valid, unsigned long gla, bool_t access_r, bool_t access_w, bool_t access_x) { struct vcpu *v = current; diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/trace.c xen-4.1.3/xen/arch/x86/trace.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/trace.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/trace.c 2012-08-09 20:08:09.000000000 +0000 @@ -11,7 +11,7 @@ #define TRC_64_FLAG 0 #endif -asmlinkage void trace_hypercall(void) +void trace_hypercall(void) { struct cpu_user_regs *regs = guest_cpu_user_regs(); diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/traps.c xen-4.1.3/xen/arch/x86/traps.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/traps.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/traps.c 2012-08-09 20:08:09.000000000 +0000 @@ -420,7 +420,7 @@ * are disabled). In such situations we can't do much that is safe. We try to * print out some tracing and then we just spin. */ -asmlinkage void fatal_trap(int trapnr, struct cpu_user_regs *regs) +void fatal_trap(int trapnr, struct cpu_user_regs *regs) { static DEFINE_PER_CPU(char, depth); @@ -534,7 +534,7 @@ * Called from asm to set up the MCE trapbounce info. * Returns 0 if no callback is set up, else 1. */ -asmlinkage int set_guest_machinecheck_trapbounce(void) +int set_guest_machinecheck_trapbounce(void) { struct vcpu *v = current; struct trap_bounce *tb = &v->arch.trap_bounce; @@ -548,7 +548,7 @@ * Called from asm to set up the NMI trapbounce info. * Returns 0 if no callback is set up, else 1. */ -asmlinkage int set_guest_nmi_trapbounce(void) +int set_guest_nmi_trapbounce(void) { struct vcpu *v = current; struct trap_bounce *tb = &v->arch.trap_bounce; @@ -596,13 +596,13 @@ } #define DO_ERROR_NOCODE(trapnr, name) \ -asmlinkage void do_##name(struct cpu_user_regs *regs) \ +void do_##name(struct cpu_user_regs *regs) \ { \ do_trap(trapnr, regs, 0); \ } #define DO_ERROR(trapnr, name) \ -asmlinkage void do_##name(struct cpu_user_regs *regs) \ +void do_##name(struct cpu_user_regs *regs) \ { \ do_trap(trapnr, regs, 1); \ } @@ -959,7 +959,7 @@ return EXCRET_fault_fixed; } -asmlinkage void do_invalid_op(struct cpu_user_regs *regs) +void do_invalid_op(struct cpu_user_regs *regs) { struct bug_frame bug; struct bug_frame_str bug_str; @@ -1053,7 +1053,7 @@ panic("FATAL TRAP: vector = %d (invalid opcode)\n", TRAP_invalid_op); } -asmlinkage void do_int3(struct cpu_user_regs *regs) +void do_int3(struct cpu_user_regs *regs) { DEBUGGER_trap_entry(TRAP_int3, regs); @@ -1066,7 +1066,7 @@ do_guest_trap(TRAP_int3, regs, 0); } -asmlinkage void do_machine_check(struct cpu_user_regs *regs) +void do_machine_check(struct cpu_user_regs *regs) { machine_check_vector(regs, regs->error_code); } @@ -1367,7 +1367,7 @@ * Bit 3: Reserved bit violation * Bit 4: Instruction fetch */ -asmlinkage void do_page_fault(struct cpu_user_regs *regs) +void do_page_fault(struct cpu_user_regs *regs) { unsigned long addr, fixup; unsigned int error_code; @@ -1433,7 +1433,7 @@ * during early boot (an issue was seen once, but was most likely a hardware * problem). */ -asmlinkage void __init do_early_page_fault(struct cpu_user_regs *regs) +void __init do_early_page_fault(struct cpu_user_regs *regs) { static int stuck; static unsigned long prev_eip, prev_cr2; @@ -1678,7 +1678,7 @@ while ( bytes != 0 ) { unsigned int size = 1; - uint32_t sub_data = 0xff; + uint32_t sub_data = ~0; if ( (port == 0x42) || (port == 0x43) || (port == 0x61) ) { @@ -2978,7 +2978,7 @@ #endif } -asmlinkage void do_general_protection(struct cpu_user_regs *regs) +void do_general_protection(struct cpu_user_regs *regs) { struct vcpu *v = current; unsigned long fixup; @@ -3225,7 +3225,7 @@ outb((inb(0x61) & 0x07) | 0x00, 0x61); /* enable IOCK */ } -static void unknown_nmi_error(unsigned char reason) +static void unknown_nmi_error(struct cpu_user_regs *regs, unsigned char reason) { switch ( opt_nmi[0] ) { @@ -3234,10 +3234,10 @@ case 'i': /* 'ignore' */ break; default: /* 'fatal' */ + console_force_unlock(); printk("Uhhuh. NMI received for unknown reason %02x.\n", reason); - printk("Dazed and confused, but trying to continue\n"); printk("Do you have a strange power saving mode enabled?\n"); - kexec_crash(); + fatal_trap(TRAP_nmi, regs); } } @@ -3248,7 +3248,7 @@ static nmi_callback_t nmi_callback = dummy_nmi_callback; -asmlinkage void do_nmi(struct cpu_user_regs *regs) +void do_nmi(struct cpu_user_regs *regs) { unsigned int cpu = smp_processor_id(); unsigned char reason; @@ -3270,7 +3270,7 @@ else if ( reason & 0x40 ) io_check_error(regs); else if ( !nmi_watchdog ) - unknown_nmi_error((unsigned char)(reason&0xff)); + unknown_nmi_error(regs, (unsigned char)(reason&0xff)); } } @@ -3284,7 +3284,7 @@ nmi_callback = dummy_nmi_callback; } -asmlinkage void do_device_not_available(struct cpu_user_regs *regs) +void do_device_not_available(struct cpu_user_regs *regs) { struct vcpu *curr = current; @@ -3325,7 +3325,7 @@ wrmsrl(MSR_IA32_DEBUGCTLMSR, debugctl | 1); } -asmlinkage void do_debug(struct cpu_user_regs *regs) +void do_debug(struct cpu_user_regs *regs) { struct vcpu *v = current; @@ -3378,7 +3378,7 @@ return; } -asmlinkage void do_spurious_interrupt_bug(struct cpu_user_regs *regs) +void do_spurious_interrupt_bug(struct cpu_user_regs *regs) { } diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/x86_32/traps.c xen-4.1.3/xen/arch/x86/x86_32/traps.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/x86_32/traps.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/x86_32/traps.c 2012-08-09 20:08:09.000000000 +0000 @@ -20,7 +20,7 @@ #include <public/callback.h> -extern asmlinkage int hypercall(void); +extern int hypercall(void); static void print_xen_info(void) { @@ -229,7 +229,7 @@ .notifier_call = cpu_doublefault_tss_callback }; -asmlinkage void do_double_fault(void) +void do_double_fault(void) { struct tss_struct *tss; unsigned int cpu; diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/x86_64/traps.c xen-4.1.3/xen/arch/x86/x86_64/traps.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/arch/x86/x86_64/traps.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/arch/x86/x86_64/traps.c 2012-08-09 20:08:09.000000000 +0000 @@ -23,10 +23,10 @@ #include <asm/hvm/support.h> #include <public/callback.h> -asmlinkage void syscall_enter(void); -asmlinkage void sysenter_entry(void); -asmlinkage void compat_hypercall(void); -asmlinkage void int80_direct_trap(void); +void syscall_enter(void); +void sysenter_entry(void); +void compat_hypercall(void); +void int80_direct_trap(void); static void print_xen_info(void) { @@ -215,8 +215,8 @@ l1_table_offset(addr), l1e_get_intpte(l1e), pfn); } -asmlinkage void double_fault(void); -asmlinkage void do_double_fault(struct cpu_user_regs *regs) +void double_fault(void); +void do_double_fault(struct cpu_user_regs *regs) { unsigned int cpu; @@ -385,13 +385,13 @@ BUILD_BUG_ON((IST_MAX + 2) * PAGE_SIZE + PRIMARY_STACK_SIZE > STACK_SIZE); /* Machine Check handler has its own per-CPU 4kB stack. */ - this_cpu(init_tss).ist[IST_MCE] = (unsigned long)&stack[IST_MCE * PAGE_SIZE]; + this_cpu(init_tss).ist[IST_MCE-1] = (unsigned long)&stack[IST_MCE * PAGE_SIZE]; /* Double-fault handler has its own per-CPU 4kB stack. */ - this_cpu(init_tss).ist[IST_DF] = (unsigned long)&stack[IST_DF * PAGE_SIZE]; + this_cpu(init_tss).ist[IST_DF-1] = (unsigned long)&stack[IST_DF * PAGE_SIZE]; /* NMI handler has its own per-CPU 4kB stack. */ - this_cpu(init_tss).ist[IST_NMI] = (unsigned long)&stack[IST_NMI * PAGE_SIZE]; + this_cpu(init_tss).ist[IST_NMI-1] = (unsigned long)&stack[IST_NMI * PAGE_SIZE]; /* Trampoline for SYSCALL entry from long mode. */ stack = &stack[IST_MAX * PAGE_SIZE]; /* Skip the IST stacks. */ diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/common/kernel.c xen-4.1.3/xen/common/kernel.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/common/kernel.c 2012-08-18 11:44:33.000000000 +0000 +++ xen-4.1.3/xen/common/kernel.c 2012-08-18 11:44:27.000000000 +0000 @@ -92,7 +92,7 @@ if ( !bool_assert ) optkey += 3; - for ( param = &__setup_start; param <= &__setup_end; param++ ) + for ( param = &__setup_start; param < &__setup_end; param++ ) { if ( strcmp(param->name, optkey) ) continue; diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/common/schedule.c xen-4.1.3/xen/common/schedule.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/common/schedule.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/common/schedule.c 2012-08-09 20:08:09.000000000 +0000 @@ -1122,6 +1122,7 @@ bool_t tasklet_work_scheduled = 0; struct schedule_data *sd; struct task_slice next_slice; + int cpu = smp_processor_id(); ASSERT(!in_atomic()); @@ -1146,7 +1147,7 @@ BUG(); } - spin_lock_irq(sd->schedule_lock); + pcpu_schedule_lock_irq(cpu); stop_timer(&sd->s_timer); @@ -1163,7 +1164,7 @@ if ( unlikely(prev == next) ) { - spin_unlock_irq(sd->schedule_lock); + pcpu_schedule_unlock_irq(cpu); trace_continue_running(next); return continue_running(prev); } @@ -1201,7 +1202,7 @@ ASSERT(!next->is_running); next->is_running = 1; - spin_unlock_irq(sd->schedule_lock); + pcpu_schedule_unlock_irq(cpu); perfc_incr(sched_ctx); diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/drivers/acpi/pmstat.c xen-4.1.3/xen/drivers/acpi/pmstat.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/drivers/acpi/pmstat.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/drivers/acpi/pmstat.c 2012-08-09 20:08:09.000000000 +0000 @@ -68,6 +68,8 @@ case PMSTAT_PX: if ( !(xen_processor_pmbits & XEN_PROCESSOR_PM_PX) ) return -ENODEV; + if ( !cpufreq_driver ) + return -ENODEV; if ( !pmpt || !(pmpt->perf.init & XEN_PX_INIT) ) return -EINVAL; break; diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/drivers/passthrough/vtd/iommu.c xen-4.1.3/xen/drivers/passthrough/vtd/iommu.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/drivers/passthrough/vtd/iommu.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/drivers/passthrough/vtd/iommu.c 2012-08-09 20:08:09.000000000 +0000 @@ -118,6 +118,27 @@ return 0; } +static int context_get_domain_id(struct context_entry *context, + struct iommu *iommu) +{ + unsigned long dom_index, nr_dom; + int domid = -1; + + if (iommu && context) + { + nr_dom = cap_ndoms(iommu->cap); + + dom_index = context_domain_id(*context); + + if ( dom_index < nr_dom && iommu->domid_map) + domid = iommu->domid_map[dom_index]; + else + dprintk(XENLOG_DEBUG VTDPREFIX, "%s: dom_index %lu exceeds nr_dom %lu or iommu has no domid_map\n", + __func__, dom_index, nr_dom); + } + return domid; +} + static struct intel_iommu *__init alloc_intel_iommu(void) { struct intel_iommu *intel; @@ -1278,7 +1299,6 @@ struct hvm_iommu *hd = domain_hvm_iommu(domain); struct context_entry *context, *context_entries; u64 maddr, pgd_maddr; - struct pci_dev *pdev = NULL; int agaw; ASSERT(spin_is_locked(&pcidevs_lock)); @@ -1290,12 +1310,45 @@ if ( context_present(*context) ) { int res = 0; + struct pci_dev *pdev = NULL; + /* First try to get domain ownership from device structure. If that's + * not available, try to read it from the context itself. */ pdev = pci_get_pdev(bus, devfn); - if (!pdev) - res = -ENODEV; - else if (pdev->domain != domain) - res = -EINVAL; + if ( pdev ) + { + if ( pdev->domain != domain ) + { + dprintk(XENLOG_INFO VTDPREFIX, "d%d: bdf = %x:%x.%x owned by d%d!", + domain->domain_id, + bus, PCI_SLOT(devfn), PCI_FUNC(devfn), + (pdev->domain) + ? pdev->domain->domain_id : -1); + res = -EINVAL; + } + } + else + { + int cdomain; + cdomain = context_get_domain_id(context, iommu); + + if ( cdomain < 0 ) + { + dprintk(VTDPREFIX, "d%d: bdf = %x:%x.%x mapped, but can't find owner!\n", + domain->domain_id, + bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); + res = -EINVAL; + } + else if ( cdomain != domain->domain_id ) + { + dprintk(XENLOG_INFO VTDPREFIX, "d%d: bdf = %x:%x.%x already mapped to d%d!", + domain->domain_id, + bus, PCI_SLOT(devfn), PCI_FUNC(devfn), + cdomain); + res = -EINVAL; + } + } + unmap_vtd_domain_page(context_entries); spin_unlock(&iommu->lock); return res; @@ -2105,6 +2158,15 @@ { iommu = drhd->iommu; + printk("Intel VT-d supported page sizes: 4kB"); + if (cap_sps_2mb(iommu->cap)) + printk(", 2MB"); + + if (cap_sps_1gb(iommu->cap)) + printk(", 1GB"); + + printk(".\n"); + if ( iommu_snoop && !ecap_snp_ctl(iommu->ecap) ) iommu_snoop = 0; diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/drivers/passthrough/vtd/qinval.c xen-4.1.3/xen/drivers/passthrough/vtd/qinval.c --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/drivers/passthrough/vtd/qinval.c 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/drivers/passthrough/vtd/qinval.c 2012-08-09 20:08:09.000000000 +0000 @@ -140,7 +140,7 @@ qinval_entry->q.iotlb_inv_dsc.hi.am = am; qinval_entry->q.iotlb_inv_dsc.hi.ih = ih; qinval_entry->q.iotlb_inv_dsc.hi.res_1 = 0; - qinval_entry->q.iotlb_inv_dsc.hi.addr = addr; + qinval_entry->q.iotlb_inv_dsc.hi.addr = addr >> PAGE_SHIFT_4K; unmap_vtd_domain_page(qinval_entries); spin_unlock_irqrestore(&qi_ctrl->qinval_lock, flags); diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/include/acpi/cpufreq/processor_perf.h xen-4.1.3/xen/include/acpi/cpufreq/processor_perf.h --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/include/acpi/cpufreq/processor_perf.h 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/include/acpi/cpufreq/processor_perf.h 2012-08-09 20:08:09.000000000 +0000 @@ -6,7 +6,7 @@ #define XEN_PX_INIT 0x80000000 -int get_cpu_id(u8); +int get_cpu_id(u32); int powernow_cpufreq_init(void); unsigned int powernow_register_driver(void); unsigned int get_measured_perf(unsigned int cpu, unsigned int flag); diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/include/asm-x86/config.h xen-4.1.3/xen/include/asm-x86/config.h --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/include/asm-x86/config.h 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/include/asm-x86/config.h 2012-08-09 20:08:09.000000000 +0000 @@ -110,13 +110,13 @@ extern unsigned int video_mode, video_flags; #endif +#define asmlinkage + #if defined(__x86_64__) #define CONFIG_X86_64 1 #define CONFIG_COMPAT 1 -#define asmlinkage - #define PML4_ENTRY_BITS 39 #ifndef __ASSEMBLY__ #define PML4_ENTRY_BYTES (1UL << PML4_ENTRY_BITS) @@ -280,8 +280,6 @@ #define CONFIG_X86_32 1 #define CONFIG_DOMAIN_PAGE 1 -#define asmlinkage __attribute__((regparm(0))) - /* * Memory layout (high to low): PAE-SIZE * ------ diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/include/asm-x86/hvm/hvm.h xen-4.1.3/xen/include/asm-x86/hvm/hvm.h --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/include/asm-x86/hvm/hvm.h 2012-06-14 10:39:59.000000000 +0000 +++ xen-4.1.3/xen/include/asm-x86/hvm/hvm.h 2012-08-09 20:08:10.000000000 +0000 @@ -368,7 +368,7 @@ int hvm_debug_op(struct vcpu *v, int32_t op); -bool_t hvm_hap_nested_page_fault(unsigned long gpa, +bool_t hvm_hap_nested_page_fault(paddr_t gpa, bool_t gla_valid, unsigned long gla, bool_t access_valid, bool_t access_r, diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/include/asm-x86/irq.h xen-4.1.3/xen/include/asm-x86/irq.h --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/include/asm-x86/irq.h 2012-06-14 10:40:00.000000000 +0000 +++ xen-4.1.3/xen/include/asm-x86/irq.h 2012-08-09 20:08:10.000000000 +0000 @@ -97,7 +97,7 @@ fastcall void smp_cmci_interrupt(struct cpu_user_regs *regs); fastcall void smp_irq_move_cleanup_interrupt(struct cpu_user_regs *regs); -asmlinkage void do_IRQ(struct cpu_user_regs *regs); +void do_IRQ(struct cpu_user_regs *regs); void disable_8259A_irq(unsigned int irq); void enable_8259A_irq(unsigned int irq); diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/include/asm-x86/msr-index.h xen-4.1.3/xen/include/asm-x86/msr-index.h --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/include/asm-x86/msr-index.h 2012-06-14 10:40:00.000000000 +0000 +++ xen-4.1.3/xen/include/asm-x86/msr-index.h 2012-08-09 20:08:10.000000000 +0000 @@ -495,6 +495,10 @@ #define MSR_INTEL_CPUID1_FEATURE_MASK 0x00000130 #define MSR_INTEL_CPUID80000001_FEATURE_MASK 0x00000131 +#define MSR_INTEL_CPUID1_FEATURE_MASK_V2 0x00000132 +#define MSR_INTEL_CPUID80000001_FEATURE_MASK_V2 0x00000133 +#define MSR_INTEL_CPUIDD_01_FEATURE_MASK 0x00000134 + /* Intel cpuid faulting MSRs */ #define MSR_INTEL_PLATFORM_INFO 0x000000ce #define MSR_INTEL_MISC_FEATURES_ENABLES 0x00000140 diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/include/asm-x86/p2m.h xen-4.1.3/xen/include/asm-x86/p2m.h --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/include/asm-x86/p2m.h 2012-06-14 10:40:00.000000000 +0000 +++ xen-4.1.3/xen/include/asm-x86/p2m.h 2012-08-09 20:08:10.000000000 +0000 @@ -539,12 +539,12 @@ #ifdef __x86_64__ /* Send mem event based on the access (gla is -1ull if not available). Handles * the rw2rx conversion */ -void p2m_mem_access_check(unsigned long gpa, bool_t gla_valid, unsigned long gla, +void p2m_mem_access_check(paddr_t gpa, bool_t gla_valid, unsigned long gla, bool_t access_r, bool_t access_w, bool_t access_x); /* Resumes the running of the VCPU, restarting the last instruction */ void p2m_mem_access_resume(struct p2m_domain *p2m); #else -static inline void p2m_mem_access_check(unsigned long gpa, bool_t gla_valid, +static inline void p2m_mem_access_check(paddr_t gpa, bool_t gla_valid, unsigned long gla, bool_t access_r, bool_t access_w, bool_t access_x) { } diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/include/asm-x86/processor.h xen-4.1.3/xen/include/asm-x86/processor.h --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/include/asm-x86/processor.h 2012-06-14 10:40:00.000000000 +0000 +++ xen-4.1.3/xen/include/asm-x86/processor.h 2012-08-09 20:08:10.000000000 +0000 @@ -427,7 +427,9 @@ union { u64 rsp1, esp1; }; union { u64 rsp2, esp2; }; u64 reserved1; - u64 ist[7]; + u64 ist[7]; /* Interrupt Stack Table is 1-based so tss->ist[0] + * corresponds to an IST value of 1 in an Interrupt + * Descriptor */ u64 reserved2; u16 reserved3; #else @@ -548,7 +550,7 @@ void show_execution_state(struct cpu_user_regs *regs); #define dump_execution_state() run_in_exception_handler(show_execution_state) void show_page_walk(unsigned long addr); -asmlinkage void fatal_trap(int trapnr, struct cpu_user_regs *regs); +void fatal_trap(int trapnr, struct cpu_user_regs *regs); #ifdef CONFIG_COMPAT void compat_show_guest_stack(struct vcpu *, struct cpu_user_regs *, int lines); @@ -562,8 +564,8 @@ void mcheck_init(struct cpuinfo_x86 *c, bool_t bsp); #define DECLARE_TRAP_HANDLER(_name) \ -asmlinkage void _name(void); \ -asmlinkage void do_ ## _name(struct cpu_user_regs *regs) +void _name(void); \ +void do_ ## _name(struct cpu_user_regs *regs) DECLARE_TRAP_HANDLER(divide_error); DECLARE_TRAP_HANDLER(debug); DECLARE_TRAP_HANDLER(nmi); diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/include/asm-x86/x86_32/asm_defns.h xen-4.1.3/xen/include/asm-x86/x86_32/asm_defns.h --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/include/asm-x86/x86_32/asm_defns.h 2012-06-14 10:40:00.000000000 +0000 +++ xen-4.1.3/xen/include/asm-x86/x86_32/asm_defns.h 2012-08-09 20:08:10.000000000 +0000 @@ -138,7 +138,7 @@ #define IRQ_NAME(nr) IRQ_NAME2(IRQ##nr) #define BUILD_IRQ(nr) \ -asmlinkage void IRQ_NAME(nr); \ +void IRQ_NAME(nr); \ __asm__( \ "\n"__ALIGN_STR"\n" \ STR(IRQ) #nr "_interrupt:\n\t" \ diff -x .pc -urN xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/include/asm-x86/x86_64/asm_defns.h xen-4.1.3/xen/include/asm-x86/x86_64/asm_defns.h --- xen-4.1.3~rc1+hg-20120614.a9c0a89c08f2/xen/include/asm-x86/x86_64/asm_defns.h 2012-06-14 10:40:00.000000000 +0000 +++ xen-4.1.3/xen/include/asm-x86/x86_64/asm_defns.h 2012-08-09 20:08:10.000000000 +0000 @@ -114,7 +114,7 @@ #define IRQ_NAME(nr) IRQ_NAME2(IRQ##nr) #define BUILD_IRQ(nr) \ -asmlinkage void IRQ_NAME(nr); \ +void IRQ_NAME(nr); \ __asm__( \ "\n"__ALIGN_STR"\n" \ STR(IRQ) #nr "_interrupt:\n\t" \ -- To UNSUBSCRIBE, email to debian-release-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20120818120733.26686.53079.report...@lumphammer.waldi.eu.org