]> Pileus Git - ~andy/linux/commitdiff
Merge tag 'kvm-3.6-1' of git://git.kernel.org/pub/scm/virt/kvm/kvm
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 24 Jul 2012 19:01:20 +0000 (12:01 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 24 Jul 2012 19:01:20 +0000 (12:01 -0700)
Pull KVM updates from Avi Kivity:
 "Highlights include
  - full big real mode emulation on pre-Westmere Intel hosts (can be
    disabled with emulate_invalid_guest_state=0)
  - relatively small ppc and s390 updates
  - PCID/INVPCID support in guests
  - EOI avoidance; 3.6 guests should perform better on 3.6 hosts on
    interrupt intensive workloads)
  - Lockless write faults during live migration
  - EPT accessed/dirty bits support for new Intel processors"

Fix up conflicts in:
 - Documentation/virtual/kvm/api.txt:

   Stupid subchapter numbering, added next to each other.

 - arch/powerpc/kvm/booke_interrupts.S:

   PPC asm changes clashing with the KVM fixes

 - arch/s390/include/asm/sigp.h, arch/s390/kvm/sigp.c:

   Duplicated commits through the kvm tree and the s390 tree, with
   subsequent edits in the KVM tree.

* tag 'kvm-3.6-1' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (93 commits)
  KVM: fix race with level interrupts
  x86, hyper: fix build with !CONFIG_KVM_GUEST
  Revert "apic: fix kvm build on UP without IOAPIC"
  KVM guest: switch to apic_set_eoi_write, apic_write
  apic: add apic_set_eoi_write for PV use
  KVM: VMX: Implement PCID/INVPCID for guests with EPT
  KVM: Add x86_hyper_kvm to complete detect_hypervisor_platform check
  KVM: PPC: Critical interrupt emulation support
  KVM: PPC: e500mc: Fix tlbilx emulation for 64-bit guests
  KVM: PPC64: booke: Set interrupt computation mode for 64-bit host
  KVM: PPC: bookehv: Add ESR flag to Data Storage Interrupt
  KVM: PPC: bookehv64: Add support for std/ld emulation.
  booke: Added crit/mc exception handler for e500v2
  booke/bookehv: Add host crit-watchdog exception support
  KVM: MMU: document mmu-lock and fast page fault
  KVM: MMU: fix kvm_mmu_pagetable_walk tracepoint
  KVM: MMU: trace fast page fault
  KVM: MMU: fast path of handling guest page fault
  KVM: MMU: introduce SPTE_MMU_WRITEABLE bit
  KVM: MMU: fold tlb flush judgement into mmu_spte_update
  ...

20 files changed:
1  2 
Documentation/virtual/kvm/api.txt
MAINTAINERS
arch/powerpc/include/asm/hw_irq.h
arch/powerpc/kernel/kvm.c
arch/powerpc/kvm/book3s_hv.c
arch/powerpc/kvm/booke_interrupts.S
arch/powerpc/kvm/bookehv_interrupts.S
arch/s390/include/asm/sclp.h
arch/s390/kernel/setup.c
arch/s390/kvm/kvm-s390.c
arch/s390/kvm/sigp.c
arch/x86/include/asm/apic.h
arch/x86/include/asm/kvm_host.h
arch/x86/kernel/apic/apic.c
arch/x86/kvm/mmu.c
arch/x86/kvm/trace.h
drivers/s390/kvm/kvm_virtio.c
include/linux/kvm_host.h
virt/kvm/irq_comm.c
virt/kvm/kvm_main.c

index 2c9948379469c1dba5f8c7ef711567067727ff08,310fe508d9cd6b95ab1ecb13471a0f80a3edc5e4..bf33aaa4c59f8f2e507fdd3e9c32528b16e831d1
@@@ -1930,22 -1930,41 +1930,56 @@@ The "pte_enc" field provides a value th
  PTE's RPN field (ie, it needs to be shifted left by 12 to OR it
  into the hash PTE second double word).
  
 +4.75 KVM_IRQFD
  
 -4.75 KVM_PPC_ALLOCATE_HTAB
 +Capability: KVM_CAP_IRQFD
 +Architectures: x86
 +Type: vm ioctl
 +Parameters: struct kvm_irqfd (in)
 +Returns: 0 on success, -1 on error
 +
 +Allows setting an eventfd to directly trigger a guest interrupt.
 +kvm_irqfd.fd specifies the file descriptor to use as the eventfd and
 +kvm_irqfd.gsi specifies the irqchip pin toggled by this event.  When
 +an event is tiggered on the eventfd, an interrupt is injected into
 +the guest using the specified gsi pin.  The irqfd is removed using
 +the KVM_IRQFD_FLAG_DEASSIGN flag, specifying both kvm_irqfd.fd
 +and kvm_irqfd.gsi.
 +
++4.76 KVM_PPC_ALLOCATE_HTAB
+ Capability: KVM_CAP_PPC_ALLOC_HTAB
+ Architectures: powerpc
+ Type: vm ioctl
+ Parameters: Pointer to u32 containing hash table order (in/out)
+ Returns: 0 on success, -1 on error
+ This requests the host kernel to allocate an MMU hash table for a
+ guest using the PAPR paravirtualization interface.  This only does
+ anything if the kernel is configured to use the Book 3S HV style of
+ virtualization.  Otherwise the capability doesn't exist and the ioctl
+ returns an ENOTTY error.  The rest of this description assumes Book 3S
+ HV.
+ There must be no vcpus running when this ioctl is called; if there
+ are, it will do nothing and return an EBUSY error.
+ The parameter is a pointer to a 32-bit unsigned integer variable
+ containing the order (log base 2) of the desired size of the hash
+ table, which must be between 18 and 46.  On successful return from the
+ ioctl, it will have been updated with the order of the hash table that
+ was allocated.
+ If no hash table has been allocated when any vcpu is asked to run
+ (with the KVM_RUN ioctl), the host kernel will allocate a
+ default-sized hash table (16 MB).
+ If this ioctl is called when a hash table has already been allocated,
+ the kernel will clear out the existing hash table (zero all HPTEs) and
+ return the hash table order in the parameter.  (If the guest is using
+ the virtualized real-mode area (VRMA) facility, the kernel will
+ re-create the VMRA HPTEs on the next KVM_RUN of any vcpu.)
  
  5. The kvm_run structure
  ------------------------
diff --combined MAINTAINERS
index 7316ab62e5af3c0857acfbeff154e0bfaa0eb05e,4023d0b4e9db1f722b022212d9fdc13d3b829bb4..cda045337a9d319eca95e6b297d983b54085344a
@@@ -329,7 -329,7 +329,7 @@@ F: drivers/hwmon/adm1029.
  
  ADM8211 WIRELESS DRIVER
  L:    linux-wireless@vger.kernel.org
 -W:    http://linuxwireless.org/
 +W:    http://wireless.kernel.org/
  S:    Orphan
  F:    drivers/net/wireless/adm8211.*
  
@@@ -579,7 -579,7 +579,7 @@@ F: drivers/net/appletalk
  F:    net/appletalk/
  
  ARASAN COMPACT FLASH PATA CONTROLLER
 -M:    Viresh Kumar <viresh.kumar@st.com>
 +M:     Viresh Kumar <viresh.linux@gmail.com>
  L:    linux-ide@vger.kernel.org
  S:    Maintained
  F:    include/linux/pata_arasan_cf_data.h
@@@ -894,14 -894,6 +894,14 @@@ ARM/MAGICIAN MACHINE SUPPOR
  M:    Philipp Zabel <philipp.zabel@gmail.com>
  S:    Maintained
  
 +ARM/Marvell Armada 370 and Armada XP SOC support
 +M:    Jason Cooper <jason@lakedaemon.net>
 +M:    Andrew Lunn <andrew@lunn.ch>
 +M:    Gregory Clement <gregory.clement@free-electrons.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    arch/arm/mach-mvebu/
 +
  ARM/Marvell Dove/Kirkwood/MV78xx0/Orion SOC support
  M:    Jason Cooper <jason@lakedaemon.net>
  M:    Andrew Lunn <andrew@lunn.ch>
@@@ -1085,7 -1077,7 +1085,7 @@@ F:      drivers/media/video/s5p-fimc
  ARM/SAMSUNG S5P SERIES Multi Format Codec (MFC) SUPPORT
  M:    Kyungmin Park <kyungmin.park@samsung.com>
  M:    Kamil Debski <k.debski@samsung.com>
 -M:     Jeongtae Park <jtp.park@samsung.com>
 +M:    Jeongtae Park <jtp.park@samsung.com>
  L:    linux-arm-kernel@lists.infradead.org
  L:    linux-media@vger.kernel.org
  S:    Maintained
@@@ -1111,16 -1103,6 +1111,16 @@@ S:    Supporte
  F:    arch/arm/mach-shmobile/
  F:    drivers/sh/
  
 +ARM/SOCFPGA ARCHITECTURE
 +M:    Dinh Nguyen <dinguyen@altera.com>
 +S:    Maintained
 +F:    arch/arm/mach-socfpga/
 +
 +ARM/SOCFPGA CLOCK FRAMEWORK SUPPORT
 +M:    Dinh Nguyen <dinguyen@altera.com>
 +S:    Maintained
 +F:    drivers/clk/socfpga/
 +
  ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT
  M:    Lennert Buytenhek <kernel@wantstofly.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -1441,7 -1423,7 +1441,7 @@@ B43 WIRELESS DRIVE
  M:    Stefano Brivio <stefano.brivio@polimi.it>
  L:    linux-wireless@vger.kernel.org
  L:    b43-dev@lists.infradead.org
 -W:    http://linuxwireless.org/en/users/Drivers/b43
 +W:    http://wireless.kernel.org/en/users/Drivers/b43
  S:    Maintained
  F:    drivers/net/wireless/b43/
  
@@@ -1450,7 -1432,7 +1450,7 @@@ M:      Larry Finger <Larry.Finger@lwfinger.
  M:    Stefano Brivio <stefano.brivio@polimi.it>
  L:    linux-wireless@vger.kernel.org
  L:    b43-dev@lists.infradead.org
 -W:    http://linuxwireless.org/en/users/Drivers/b43
 +W:    http://wireless.kernel.org/en/users/Drivers/b43
  S:    Maintained
  F:    drivers/net/wireless/b43legacy/
  
@@@ -1613,7 -1595,6 +1613,7 @@@ M:      Arend van Spriel <arend@broadcom.com
  M:    Franky (Zhenhui) Lin <frankyl@broadcom.com>
  M:    Kan Yan <kanyan@broadcom.com>
  L:    linux-wireless@vger.kernel.org
 +L:    brcm80211-dev-list@broadcom.com
  S:    Supported
  F:    drivers/net/wireless/brcm80211/
  
@@@ -1665,11 -1646,11 +1665,11 @@@ S:   Maintaine
  F:    drivers/gpio/gpio-bt8xx.c
  
  BTRFS FILE SYSTEM
 -M:    Chris Mason <chris.mason@oracle.com>
 +M:    Chris Mason <chris.mason@fusionio.com>
  L:    linux-btrfs@vger.kernel.org
  W:    http://btrfs.wiki.kernel.org/
  Q:    http://patchwork.kernel.org/project/linux-btrfs/list/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs.git
  S:    Maintained
  F:    Documentation/filesystems/btrfs.txt
  F:    fs/btrfs/
@@@ -1762,10 -1743,10 +1762,10 @@@ F:   include/linux/can/platform
  CAPABILITIES
  M:    Serge Hallyn <serge.hallyn@canonical.com>
  L:    linux-security-module@vger.kernel.org
 -S:    Supported       
 +S:    Supported
  F:    include/linux/capability.h
  F:    security/capability.c
 -F:    security/commoncap.c 
 +F:    security/commoncap.c
  F:    kernel/capability.c
  
  CELL BROADBAND ENGINE ARCHITECTURE
@@@ -1819,9 -1800,6 +1819,9 @@@ F:      include/linux/cfag12864b.
  CFG80211 and NL80211
  M:    Johannes Berg <johannes@sipsolutions.net>
  L:    linux-wireless@vger.kernel.org
 +W:    http://wireless.kernel.org/
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git
  S:    Maintained
  F:    include/linux/nl80211.h
  F:    include/net/cfg80211.h
@@@ -2168,11 -2146,11 +2168,11 @@@ S:   Orpha
  F:    drivers/net/wan/pc300*
  
  CYTTSP TOUCHSCREEN DRIVER
 -M:      Javier Martinez Canillas <javier@dowhile0.org>
 -L:      linux-input@vger.kernel.org
 -S:      Maintained
 -F:      drivers/input/touchscreen/cyttsp*
 -F:      include/linux/input/cyttsp.h
 +M:    Javier Martinez Canillas <javier@dowhile0.org>
 +L:    linux-input@vger.kernel.org
 +S:    Maintained
 +F:    drivers/input/touchscreen/cyttsp*
 +F:    include/linux/input/cyttsp.h
  
  DAMA SLAVE for AX.25
  M:    Joerg Reuter <jreuter@yaina.de>
@@@ -2292,7 -2270,7 +2292,7 @@@ F:      include/linux/device-mapper.
  F:    include/linux/dm-*.h
  
  DIOLAN U2C-12 I2C DRIVER
 -M:    Guenter Roeck <guenter.roeck@ericsson.com>
 +M:    Guenter Roeck <linux@roeck-us.net>
  L:    linux-i2c@vger.kernel.org
  S:    Maintained
  F:    drivers/i2c/busses/i2c-diolan-u2c.c
@@@ -3167,7 -3145,7 +3167,7 @@@ F:      drivers/tty/hvc
  
  HARDWARE MONITORING
  M:    Jean Delvare <khali@linux-fr.org>
 -M:    Guenter Roeck <guenter.roeck@ericsson.com>
 +M:    Guenter Roeck <linux@roeck-us.net>
  L:    lm-sensors@lm-sensors.org
  W:    http://www.lm-sensors.org/
  T:    quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-hwmon/
@@@ -3452,14 -3430,13 +3452,14 @@@ S:   Supporte
  F:    drivers/idle/i7300_idle.c
  
  IEEE 802.15.4 SUBSYSTEM
 +M:    Alexander Smirnov <alex.bluesman.smirnov@gmail.com>
  M:    Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
 -M:    Sergey Lapin <slapin@ossfans.org>
  L:    linux-zigbee-devel@lists.sourceforge.net (moderated for non-subscribers)
  W:    http://apps.sourceforge.net/trac/linux-zigbee
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lowpan/lowpan.git
  S:    Maintained
  F:    net/ieee802154/
 +F:    net/mac802154/
  F:    drivers/ieee802154/
  
  IIO SUBSYSTEM AND DRIVERS
@@@ -3680,6 -3657,14 +3680,6 @@@ T:     git git://git.kernel.org/pub/scm/lin
  S:    Supported
  F:    drivers/net/wireless/iwlwifi/
  
 -INTEL WIRELESS MULTICOMM 3200 WIFI (iwmc3200wifi)
 -M:    Samuel Ortiz <samuel.ortiz@intel.com>
 -M:    Intel Linux Wireless <ilw@linux.intel.com>
 -L:    linux-wireless@vger.kernel.org
 -S:    Supported
 -W:    http://wireless.kernel.org/en/users/Drivers/iwmc3200wifi
 -F:    drivers/net/wireless/iwmc3200wifi/
 -
  INTEL MANAGEMENT ENGINE (mei)
  M:    Tomas Winkler <tomas.winkler@intel.com>
  L:    linux-kernel@vger.kernel.org
@@@ -4002,8 -3987,8 +4002,8 @@@ F:      arch/ia64/include/asm/kvm
  F:    arch/ia64/kvm/
  
  KERNEL VIRTUAL MACHINE for s390 (KVM/s390)
- M:    Carsten Otte <cotte@de.ibm.com>
  M:    Christian Borntraeger <borntraeger@de.ibm.com>
+ M:    Cornelia Huck <cornelia.huck@de.ibm.com>
  M:    linux390@de.ibm.com
  L:    linux-s390@vger.kernel.org
  W:    http://www.ibm.com/developerworks/linux/linux390/
@@@ -4118,8 -4103,6 +4118,8 @@@ F:      drivers/scsi/53c700
  LED SUBSYSTEM
  M:    Bryan Wu <bryan.wu@canonical.com>
  M:    Richard Purdie <rpurdie@rpsys.net>
 +L:    linux-leds@vger.kernel.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds.git
  S:    Maintained
  F:    drivers/leds/
  F:    include/linux/leds.h
@@@ -4363,9 -4346,8 +4363,9 @@@ F:      arch/m68k/hp300
  MAC80211
  M:    Johannes Berg <johannes@sipsolutions.net>
  L:    linux-wireless@vger.kernel.org
 -W:    http://linuxwireless.org/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless.git
 +W:    http://wireless.kernel.org/
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git
  S:    Maintained
  F:    Documentation/networking/mac80211-injection.txt
  F:    include/net/mac80211.h
@@@ -4375,9 -4357,8 +4375,9 @@@ MAC80211 PID RATE CONTRO
  M:    Stefano Brivio <stefano.brivio@polimi.it>
  M:    Mattias Nissler <mattias.nissler@gmx.de>
  L:    linux-wireless@vger.kernel.org
 -W:    http://linuxwireless.org/en/developers/Documentation/mac80211/RateControl/PID
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless.git
 +W:    http://wireless.kernel.org/en/developers/Documentation/mac80211/RateControl/PID
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git
  S:    Maintained
  F:    net/mac80211/rc80211_pid*
  
@@@ -4437,13 -4418,6 +4437,13 @@@ S:    Orpha
  F:    drivers/video/matrox/matroxfb_*
  F:    include/linux/matroxfb.h
  
 +MAX16065 HARDWARE MONITOR DRIVER
 +M:    Guenter Roeck <linux@roeck-us.net>
 +L:    lm-sensors@lm-sensors.org
 +S:    Maintained
 +F:    Documentation/hwmon/max16065
 +F:    drivers/hwmon/max16065.c
 +
  MAX6650 HARDWARE MONITOR AND FAN CONTROLLER DRIVER
  M:    "Hans J. Koch" <hjk@hansjkoch.de>
  L:    lm-sensors@lm-sensors.org
@@@ -4604,6 -4578,7 +4604,6 @@@ S:      Maintaine
  F:    drivers/usb/musb/
  
  MYRICOM MYRI-10G 10GbE DRIVER (MYRI10GE)
 -M:    Jon Mason <mason@myri.com>
  M:    Andrew Gallatin <gallatin@myri.com>
  L:    netdev@vger.kernel.org
  W:    http://www.myri.com/scs/download-Myri10GE.html
@@@ -4648,6 -4623,8 +4648,6 @@@ F:      net/sched/sch_netem.
  NETERION 10GbE DRIVERS (s2io/vxge)
  M:    Jon Mason <jdmason@kudzu.us>
  L:    netdev@vger.kernel.org
 -W:    http://trac.neterion.com/cgi-bin/trac.cgi/wiki/Linux?Anonymous
 -W:    http://trac.neterion.com/cgi-bin/trac.cgi/wiki/X3100Linux?Anonymous
  S:    Supported
  F:    Documentation/networking/s2io.txt
  F:    Documentation/networking/vxge.txt
@@@ -4663,8 -4640,8 +4663,8 @@@ L:      netfilter@vger.kernel.or
  L:    coreteam@netfilter.org
  W:    http://www.netfilter.org/
  W:    http://www.iptables.org/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf-2.6.git
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf-next-2.6.git
 +T:    git git://1984.lsi.us.es/nf
 +T:    git git://1984.lsi.us.es/nf-next
  S:    Supported
  F:    include/linux/netfilter*
  F:    include/linux/netfilter/
@@@ -4866,7 -4843,6 +4866,7 @@@ M:      Kevin Hilman <khilman@ti.com
  L:    linux-omap@vger.kernel.org
  S:    Maintained
  F:    arch/arm/*omap*/*pm*
 +F:    drivers/cpufreq/omap-cpufreq.c
  
  OMAP POWERDOMAIN/CLOCKDOMAIN SOC ADAPTATION LAYER SUPPORT
  M:    Rajendra Nayak <rnayak@ti.com>
@@@ -5058,7 -5034,7 +5058,7 @@@ F:      fs/ocfs2
  
  ORINOCO DRIVER
  L:    linux-wireless@vger.kernel.org
 -W:    http://linuxwireless.org/en/users/Drivers/orinoco
 +W:    http://wireless.kernel.org/en/users/Drivers/orinoco
  W:    http://www.nongnu.org/orinoco/
  S:    Orphan
  F:    drivers/net/wireless/orinoco/
@@@ -5180,7 -5156,7 +5180,7 @@@ F:      drivers/leds/leds-pca9532.
  F:    include/linux/leds-pca9532.h
  
  PCA9541 I2C BUS MASTER SELECTOR DRIVER
 -M:    Guenter Roeck <guenter.roeck@ericsson.com>
 +M:    Guenter Roeck <linux@roeck-us.net>
  L:    linux-i2c@vger.kernel.org
  S:    Maintained
  F:    drivers/i2c/muxes/i2c-mux-pca9541.c
@@@ -5200,7 -5176,7 +5200,7 @@@ S:      Maintaine
  F:    drivers/firmware/pcdp.*
  
  PCI ERROR RECOVERY
 -M:     Linas Vepstas <linasvepstas@gmail.com>
 +M:    Linas Vepstas <linasvepstas@gmail.com>
  L:    linux-pci@vger.kernel.org
  S:    Supported
  F:    Documentation/PCI/pci-error-recovery.txt
@@@ -5306,7 -5282,7 +5306,7 @@@ S:      Maintaine
  F:    drivers/pinctrl/
  
  PIN CONTROLLER - ST SPEAR
 -M:    Viresh Kumar <viresh.kumar@st.com>
 +M:     Viresh Kumar <viresh.linux@gmail.com>
  L:    spear-devel@list.st.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  W:    http://www.st.com/spear
@@@ -5330,7 -5306,7 +5330,7 @@@ F:      drivers/video/fb-puv3.
  F:    drivers/rtc/rtc-puv3.c
  
  PMBUS HARDWARE MONITORING DRIVERS
 -M:    Guenter Roeck <guenter.roeck@ericsson.com>
 +M:    Guenter Roeck <linux@roeck-us.net>
  L:    lm-sensors@lm-sensors.org
  W:    http://www.lm-sensors.org/
  W:    http://www.roeck-us.net/linux/drivers/
@@@ -5573,7 -5549,7 +5573,7 @@@ F:      Documentation/networking/LICENSE.qla
  F:    drivers/net/ethernet/qlogic/qla3xxx.*
  
  QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER
 -M:    Anirban Chakraborty <anirban.chakraborty@qlogic.com>
 +M:    Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
  M:    Sony Chacko <sony.chacko@qlogic.com>
  M:    linux-driver@qlogic.com
  L:    netdev@vger.kernel.org
@@@ -5581,6 -5557,7 +5581,6 @@@ S:      Supporte
  F:    drivers/net/ethernet/qlogic/qlcnic/
  
  QLOGIC QLGE 10Gb ETHERNET DRIVER
 -M:    Anirban Chakraborty <anirban.chakraborty@qlogic.com>
  M:    Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
  M:    Ron Mercer <ron.mercer@qlogic.com>
  M:    linux-driver@qlogic.com
@@@ -5725,9 -5702,6 +5725,9 @@@ F:      include/linux/remoteproc.
  RFKILL
  M:    Johannes Berg <johannes@sipsolutions.net>
  L:    linux-wireless@vger.kernel.org
 +W:    http://wireless.kernel.org/
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git
  S:    Maintained
  F:    Documentation/rfkill.txt
  F:    net/rfkill/
@@@ -5762,7 -5736,7 +5762,7 @@@ F:      net/rose
  RTL8180 WIRELESS DRIVER
  M:    "John W. Linville" <linville@tuxdriver.com>
  L:    linux-wireless@vger.kernel.org
 -W:    http://linuxwireless.org/
 +W:    http://wireless.kernel.org/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
  S:    Maintained
  F:    drivers/net/wireless/rtl818x/rtl8180/
@@@ -5772,7 -5746,7 +5772,7 @@@ M:      Herton Ronaldo Krzesinski <herton@ca
  M:    Hin-Tak Leung <htl10@users.sourceforge.net>
  M:    Larry Finger <Larry.Finger@lwfinger.net>
  L:    linux-wireless@vger.kernel.org
 -W:    http://linuxwireless.org/
 +W:    http://wireless.kernel.org/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
  S:    Maintained
  F:    drivers/net/wireless/rtl818x/rtl8187/
@@@ -5781,7 -5755,7 +5781,7 @@@ RTL8192CE WIRELESS DRIVE
  M:    Larry Finger <Larry.Finger@lwfinger.net>
  M:    Chaoming Li <chaoming_li@realsil.com.cn>
  L:    linux-wireless@vger.kernel.org
 -W:    http://linuxwireless.org/
 +W:    http://wireless.kernel.org/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
  S:    Maintained
  F:    drivers/net/wireless/rtlwifi/
@@@ -5882,7 -5856,7 +5882,7 @@@ S:      Maintaine
  F:    drivers/tty/serial
  
  SYNOPSYS DESIGNWARE DMAC DRIVER
 -M:    Viresh Kumar <viresh.kumar@st.com>
 +M:     Viresh Kumar <viresh.linux@gmail.com>
  S:    Maintained
  F:    include/linux/dw_dmac.h
  F:    drivers/dma/dw_dmac_regs.h
@@@ -5918,7 -5892,7 +5918,7 @@@ M:      Ingo Molnar <mingo@redhat.com
  M:    Peter Zijlstra <peterz@infradead.org>
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched/core
  S:    Maintained
 -F:    kernel/sched*
 +F:    kernel/sched/
  F:    include/linux/sched.h
  
  SCORE ARCHITECTURE
@@@ -6030,7 -6004,7 +6030,7 @@@ S:      Maintaine
  F:    drivers/mmc/host/sdhci-s3c.c
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) ST SPEAR DRIVER
 -M:    Viresh Kumar <viresh.kumar@st.com>
 +M:     Viresh Kumar <viresh.linux@gmail.com>
  L:    spear-devel@list.st.com
  L:    linux-mmc@vger.kernel.org
  S:    Maintained
@@@ -6220,15 -6194,6 +6220,15 @@@ T:    git git://git.kernel.org/pub/scm/lin
  F:    include/linux/srcu*
  F:    kernel/srcu*
  
 +SMACK SECURITY MODULE
 +M:    Casey Schaufler <casey@schaufler-ca.com>
 +L:    linux-security-module@vger.kernel.org
 +W:    http://schaufler-ca.com
 +T:    git git://git.gitorious.org/smack-next/kernel.git
 +S:    Maintained
 +F:    Documentation/security/Smack.txt
 +F:    security/smack/
 +
  SMC91x ETHERNET DRIVER
  M:    Nicolas Pitre <nico@fluxnic.net>
  S:    Odd Fixes
@@@ -6395,7 -6360,7 +6395,7 @@@ S:      Maintaine
  F:    include/linux/compiler.h
  
  SPEAR PLATFORM SUPPORT
 -M:    Viresh Kumar <viresh.kumar@st.com>
 +M:     Viresh Kumar <viresh.linux@gmail.com>
  M:    Shiraz Hashim <shiraz.hashim@st.com>
  L:    spear-devel@list.st.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -6404,7 -6369,7 +6404,7 @@@ S:      Maintaine
  F:    arch/arm/plat-spear/
  
  SPEAR13XX MACHINE SUPPORT
 -M:    Viresh Kumar <viresh.kumar@st.com>
 +M:     Viresh Kumar <viresh.linux@gmail.com>
  M:    Shiraz Hashim <shiraz.hashim@st.com>
  L:    spear-devel@list.st.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -6413,7 -6378,7 +6413,7 @@@ S:      Maintaine
  F:    arch/arm/mach-spear13xx/
  
  SPEAR3XX MACHINE SUPPORT
 -M:    Viresh Kumar <viresh.kumar@st.com>
 +M:     Viresh Kumar <viresh.linux@gmail.com>
  M:    Shiraz Hashim <shiraz.hashim@st.com>
  L:    spear-devel@list.st.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -6424,7 -6389,7 +6424,7 @@@ F:      arch/arm/mach-spear3xx
  SPEAR6XX MACHINE SUPPORT
  M:    Rajeev Kumar <rajeev-dlh.kumar@st.com>
  M:    Shiraz Hashim <shiraz.hashim@st.com>
 -M:    Viresh Kumar <viresh.kumar@st.com>
 +M:     Viresh Kumar <viresh.linux@gmail.com>
  L:    spear-devel@list.st.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  W:    http://www.st.com/spear
@@@ -6432,7 -6397,7 +6432,7 @@@ S:      Maintaine
  F:    arch/arm/mach-spear6xx/
  
  SPEAR CLOCK FRAMEWORK SUPPORT
 -M:    Viresh Kumar <viresh.kumar@st.com>
 +M:     Viresh Kumar <viresh.linux@gmail.com>
  L:    spear-devel@list.st.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  W:    http://www.st.com/spear
@@@ -6861,11 -6826,10 +6861,11 @@@ F:   include/linux/shmem_fs.
  F:    mm/shmem.c
  
  TPM DEVICE DRIVER
 -M:    Debora Velarde <debora@linux.vnet.ibm.com>
 -M:    Rajiv Andrade <srajiv@linux.vnet.ibm.com>
 +M:    Kent Yoder <key@linux.vnet.ibm.com>
 +M:    Rajiv Andrade <mail@srajiv.net>
  W:    http://tpmdd.sourceforge.net
 -M:    Marcel Selhorst <m.selhorst@sirrix.com>
 +M:    Marcel Selhorst <tpmdd@selhorst.net>
 +M:    Sirrix AG <tpmdd@sirrix.com>
  W:    http://www.sirrix.com
  L:    tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers)
  S:    Maintained
@@@ -7334,11 -7298,11 +7334,11 @@@ F:   Documentation/DocBook/uio-howto.tmp
  F:    drivers/uio/
  F:    include/linux/uio*.h
  
 -UTIL-LINUX-NG PACKAGE
 +UTIL-LINUX PACKAGE
  M:    Karel Zak <kzak@redhat.com>
 -L:    util-linux-ng@vger.kernel.org
 -W:    http://kernel.org/~kzak/util-linux-ng/
 -T:    git git://git.kernel.org/pub/scm/utils/util-linux-ng/util-linux-ng.git
 +L:    util-linux@vger.kernel.org
 +W:    http://en.wikipedia.org/wiki/Util-linux
 +T:    git git://git.kernel.org/pub/scm/utils/util-linux/util-linux.git
  S:    Maintained
  
  UVESAFB DRIVER
@@@ -7440,7 -7404,7 +7440,7 @@@ F:      include/linux/vlynq.
  
  VME SUBSYSTEM
  M:    Martyn Welch <martyn.welch@ge.com>
 -M:    Manohar Vanga <manohar.vanga@cern.ch>
 +M:    Manohar Vanga <manohar.vanga@gmail.com>
  M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  L:    devel@driverdev.osuosl.org
  S:    Maintained
index 0554ab062bdc555bdd1d28fb655519b8a39fcbe5,2aadb47efaec4952d1b9cab240339f4dd90d186d..e45c4947a772016031e943a7f457e1ce6dd8de95
@@@ -34,6 -34,8 +34,8 @@@ extern void __replay_interrupt(unsigne
  
  extern void timer_interrupt(struct pt_regs *);
  extern void performance_monitor_exception(struct pt_regs *regs);
+ extern void WatchdogException(struct pt_regs *regs);
+ extern void unknown_exception(struct pt_regs *regs);
  
  #ifdef CONFIG_PPC64
  #include <asm/paca.h>
@@@ -86,8 -88,8 +88,8 @@@ static inline bool arch_irqs_disabled(v
  }
  
  #ifdef CONFIG_PPC_BOOK3E
 -#define __hard_irq_enable()   asm volatile("wrteei 1" : : : "memory");
 -#define __hard_irq_disable()  asm volatile("wrteei 0" : : : "memory");
 +#define __hard_irq_enable()   asm volatile("wrteei 1" : : : "memory")
 +#define __hard_irq_disable()  asm volatile("wrteei 0" : : : "memory")
  #else
  #define __hard_irq_enable()   __mtmsrd(local_paca->kernel_msr | MSR_EE, 1)
  #define __hard_irq_disable()  __mtmsrd(local_paca->kernel_msr, 1)
@@@ -100,14 -102,6 +102,14 @@@ static inline void hard_irq_disable(voi
        get_paca()->irq_happened |= PACA_IRQ_HARD_DIS;
  }
  
 +/* include/linux/interrupt.h needs hard_irq_disable to be a macro */
 +#define hard_irq_disable      hard_irq_disable
 +
 +static inline bool lazy_irq_pending(void)
 +{
 +      return !!(get_paca()->irq_happened & ~PACA_IRQ_HARD_DIS);
 +}
 +
  /*
   * This is called by asynchronous interrupts to conditionally
   * re-enable hard interrupts when soft-disabled after having
@@@ -125,8 -119,6 +127,8 @@@ static inline bool arch_irq_disabled_re
        return !regs->softe;
  }
  
 +extern bool prep_irq_for_idle(void);
 +
  #else /* CONFIG_PPC64 */
  
  #define SET_MSR_EE(x) mtmsr(x)
index 02c167db6ba027fc0f895679b0a3320a5790b0d8,1c13307e030883dc80f15d917074c83b059642fb..867db1de8949571a152cd9559a5b36bb7c91e090
@@@ -31,6 -31,7 +31,7 @@@
  #include <asm/cacheflush.h>
  #include <asm/disassemble.h>
  #include <asm/ppc-opcode.h>
+ #include <asm/epapr_hcalls.h>
  
  #define KVM_MAGIC_PAGE                (-4096L)
  #define magic_var(x) KVM_MAGIC_PAGE + offsetof(struct kvm_vcpu_arch_shared, x)
@@@ -302,7 -303,7 +303,7 @@@ static void kvm_patch_ins_wrtee(u32 *in
  
        if (imm_one) {
                p[kvm_emulate_wrtee_reg_offs] =
 -                      KVM_INST_LI | __PPC_RT(30) | MSR_EE;
 +                      KVM_INST_LI | __PPC_RT(R30) | MSR_EE;
        } else {
                /* Make clobbered registers work too */
                switch (get_rt(rt)) {
@@@ -726,7 -727,7 +727,7 @@@ unsigned long kvm_hypercall(unsigned lo
        unsigned long register r11 asm("r11") = nr;
        unsigned long register r12 asm("r12");
  
-       asm volatile("bl        kvm_hypercall_start"
+       asm volatile("bl        epapr_hypercall_start"
                     : "=r"(r0), "=r"(r3), "=r"(r4), "=r"(r5), "=r"(r6),
                       "=r"(r7), "=r"(r8), "=r"(r9), "=r"(r10), "=r"(r11),
                       "=r"(r12)
  }
  EXPORT_SYMBOL_GPL(kvm_hypercall);
  
- static int kvm_para_setup(void)
- {
-       extern u32 kvm_hypercall_start;
-       struct device_node *hyper_node;
-       u32 *insts;
-       int len, i;
-       hyper_node = of_find_node_by_path("/hypervisor");
-       if (!hyper_node)
-               return -1;
-       insts = (u32*)of_get_property(hyper_node, "hcall-instructions", &len);
-       if (len % 4)
-               return -1;
-       if (len > (4 * 4))
-               return -1;
-       for (i = 0; i < (len / 4); i++)
-               kvm_patch_ins(&(&kvm_hypercall_start)[i], insts[i]);
-       return 0;
- }
  static __init void kvm_free_tmp(void)
  {
        unsigned long start, end;
@@@ -791,7 -769,7 +769,7 @@@ static int __init kvm_guest_init(void
        if (!kvm_para_available())
                goto free_tmp;
  
-       if (kvm_para_setup())
+       if (!epapr_paravirt_enabled)
                goto free_tmp;
  
        if (kvm_para_has_feature(KVM_FEATURE_MAGIC_PAGE))
index 3abe1b86e58344060361f3efe933b8e119c415e3,d084e412b3c53317d88fe59ac6f5f4baed70ba7a..83e929e66f9d8cb583ccf5564c9e7f846164f5fc
@@@ -56,7 -56,7 +56,7 @@@
  /* #define EXIT_DEBUG_INT */
  
  static void kvmppc_end_cede(struct kvm_vcpu *vcpu);
- static int kvmppc_hv_setup_rma(struct kvm_vcpu *vcpu);
+ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu);
  
  void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
  {
@@@ -268,45 -268,24 +268,45 @@@ static unsigned long do_h_register_vpa(
        return err;
  }
  
 -static void kvmppc_update_vpa(struct kvm *kvm, struct kvmppc_vpa *vpap)
 +static void kvmppc_update_vpa(struct kvm_vcpu *vcpu, struct kvmppc_vpa *vpap)
  {
 +      struct kvm *kvm = vcpu->kvm;
        void *va;
        unsigned long nb;
 +      unsigned long gpa;
  
 -      vpap->update_pending = 0;
 -      va = NULL;
 -      if (vpap->next_gpa) {
 -              va = kvmppc_pin_guest_page(kvm, vpap->next_gpa, &nb);
 -              if (nb < vpap->len) {
 -                      /*
 -                       * If it's now too short, it must be that userspace
 -                       * has changed the mappings underlying guest memory,
 -                       * so unregister the region.
 -                       */
 +      /*
 +       * We need to pin the page pointed to by vpap->next_gpa,
 +       * but we can't call kvmppc_pin_guest_page under the lock
 +       * as it does get_user_pages() and down_read().  So we
 +       * have to drop the lock, pin the page, then get the lock
 +       * again and check that a new area didn't get registered
 +       * in the meantime.
 +       */
 +      for (;;) {
 +              gpa = vpap->next_gpa;
 +              spin_unlock(&vcpu->arch.vpa_update_lock);
 +              va = NULL;
 +              nb = 0;
 +              if (gpa)
 +                      va = kvmppc_pin_guest_page(kvm, vpap->next_gpa, &nb);
 +              spin_lock(&vcpu->arch.vpa_update_lock);
 +              if (gpa == vpap->next_gpa)
 +                      break;
 +              /* sigh... unpin that one and try again */
 +              if (va)
                        kvmppc_unpin_guest_page(kvm, va);
 -                      va = NULL;
 -              }
 +      }
 +
 +      vpap->update_pending = 0;
 +      if (va && nb < vpap->len) {
 +              /*
 +               * If it's now too short, it must be that userspace
 +               * has changed the mappings underlying guest memory,
 +               * so unregister the region.
 +               */
 +              kvmppc_unpin_guest_page(kvm, va);
 +              va = NULL;
        }
        if (vpap->pinned_addr)
                kvmppc_unpin_guest_page(kvm, vpap->pinned_addr);
  
  static void kvmppc_update_vpas(struct kvm_vcpu *vcpu)
  {
 -      struct kvm *kvm = vcpu->kvm;
 -
        spin_lock(&vcpu->arch.vpa_update_lock);
        if (vcpu->arch.vpa.update_pending) {
 -              kvmppc_update_vpa(kvm, &vcpu->arch.vpa);
 +              kvmppc_update_vpa(vcpu, &vcpu->arch.vpa);
                init_vpa(vcpu, vcpu->arch.vpa.pinned_addr);
        }
        if (vcpu->arch.dtl.update_pending) {
 -              kvmppc_update_vpa(kvm, &vcpu->arch.dtl);
 +              kvmppc_update_vpa(vcpu, &vcpu->arch.dtl);
                vcpu->arch.dtl_ptr = vcpu->arch.dtl.pinned_addr;
                vcpu->arch.dtl_index = 0;
        }
        if (vcpu->arch.slb_shadow.update_pending)
 -              kvmppc_update_vpa(kvm, &vcpu->arch.slb_shadow);
 +              kvmppc_update_vpa(vcpu, &vcpu->arch.slb_shadow);
        spin_unlock(&vcpu->arch.vpa_update_lock);
  }
  
@@@ -819,39 -800,12 +819,39 @@@ static int kvmppc_run_core(struct kvmpp
        struct kvm_vcpu *vcpu, *vcpu0, *vnext;
        long ret;
        u64 now;
 -      int ptid, i;
 +      int ptid, i, need_vpa_update;
  
        /* don't start if any threads have a signal pending */
 -      list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list)
 +      need_vpa_update = 0;
 +      list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) {
                if (signal_pending(vcpu->arch.run_task))
                        return 0;
 +              need_vpa_update |= vcpu->arch.vpa.update_pending |
 +                      vcpu->arch.slb_shadow.update_pending |
 +                      vcpu->arch.dtl.update_pending;
 +      }
 +
 +      /*
 +       * Initialize *vc, in particular vc->vcore_state, so we can
 +       * drop the vcore lock if necessary.
 +       */
 +      vc->n_woken = 0;
 +      vc->nap_count = 0;
 +      vc->entry_exit_count = 0;
 +      vc->vcore_state = VCORE_RUNNING;
 +      vc->in_guest = 0;
 +      vc->napping_threads = 0;
 +
 +      /*
 +       * Updating any of the vpas requires calling kvmppc_pin_guest_page,
 +       * which can't be called with any spinlocks held.
 +       */
 +      if (need_vpa_update) {
 +              spin_unlock(&vc->lock);
 +              list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list)
 +                      kvmppc_update_vpas(vcpu);
 +              spin_lock(&vc->lock);
 +      }
  
        /*
         * Make sure we are running on thread 0, and that
                if (vcpu->arch.ceded)
                        vcpu->arch.ptid = ptid++;
  
 -      vc->n_woken = 0;
 -      vc->nap_count = 0;
 -      vc->entry_exit_count = 0;
 -      vc->vcore_state = VCORE_RUNNING;
        vc->stolen_tb += mftb() - vc->preempt_tb;
 -      vc->in_guest = 0;
        vc->pcpu = smp_processor_id();
 -      vc->napping_threads = 0;
        list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) {
                kvmppc_start_thread(vcpu);
 -              if (vcpu->arch.vpa.update_pending ||
 -                  vcpu->arch.slb_shadow.update_pending ||
 -                  vcpu->arch.dtl.update_pending)
 -                      kvmppc_update_vpas(vcpu);
                kvmppc_create_dtl_entry(vcpu, vc);
        }
        /* Grab any remaining hw threads so they can't go into the kernel */
@@@ -1104,11 -1068,15 +1104,15 @@@ int kvmppc_vcpu_run(struct kvm_run *run
                return -EINTR;
        }
  
-       /* On the first time here, set up VRMA or RMA */
+       atomic_inc(&vcpu->kvm->arch.vcpus_running);
+       /* Order vcpus_running vs. rma_setup_done, see kvmppc_alloc_reset_hpt */
+       smp_mb();
+       /* On the first time here, set up HTAB and VRMA or RMA */
        if (!vcpu->kvm->arch.rma_setup_done) {
-               r = kvmppc_hv_setup_rma(vcpu);
+               r = kvmppc_hv_setup_htab_rma(vcpu);
                if (r)
-                       return r;
+                       goto out;
        }
  
        flush_fp_to_thread(current);
                        kvmppc_core_prepare_to_enter(vcpu);
                }
        } while (r == RESUME_GUEST);
+  out:
+       atomic_dec(&vcpu->kvm->arch.vcpus_running);
        return r;
  }
  
@@@ -1341,7 -1312,7 +1348,7 @@@ void kvmppc_core_commit_memory_region(s
  {
  }
  
- static int kvmppc_hv_setup_rma(struct kvm_vcpu *vcpu)
+ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu)
  {
        int err = 0;
        struct kvm *kvm = vcpu->kvm;
        if (kvm->arch.rma_setup_done)
                goto out;       /* another vcpu beat us to it */
  
+       /* Allocate hashed page table (if not done already) and reset it */
+       if (!kvm->arch.hpt_virt) {
+               err = kvmppc_alloc_hpt(kvm, NULL);
+               if (err) {
+                       pr_err("KVM: Couldn't alloc HPT\n");
+                       goto out;
+               }
+       }
        /* Look up the memslot for guest physical address 0 */
        memslot = gfn_to_memslot(kvm, 0);
  
  
  int kvmppc_core_init_vm(struct kvm *kvm)
  {
-       long r;
-       unsigned long lpcr;
+       unsigned long lpcr, lpid;
  
-       /* Allocate hashed page table */
-       r = kvmppc_alloc_hpt(kvm);
-       if (r)
-               return r;
+       /* Allocate the guest's logical partition ID */
+       lpid = kvmppc_alloc_lpid();
+       if (lpid < 0)
+               return -ENOMEM;
+       kvm->arch.lpid = lpid;
  
        INIT_LIST_HEAD(&kvm->arch.spapr_tce_tables);
  
  
        if (cpu_has_feature(CPU_FTR_ARCH_201)) {
                /* PPC970; HID4 is effectively the LPCR */
-               unsigned long lpid = kvm->arch.lpid;
                kvm->arch.host_lpid = 0;
                kvm->arch.host_lpcr = lpcr = mfspr(SPRN_HID4);
                lpcr &= ~((3 << HID4_LPID1_SH) | (0xful << HID4_LPID5_SH));
index 8fd4b2a0911b76ba60f1c5c35c3ed2cd9f84a49c,09456c4719f3b0e81a563255a82e9cb3d4211b48..bb46b32f9813966724b0d59e8ea0b84923c7eb2c
@@@ -25,6 -25,8 +25,6 @@@
  #include <asm/page.h>
  #include <asm/asm-offsets.h>
  
 -#define VCPU_GPR(n)     (VCPU_GPRS + (n * 4))
 -
  /* The host stack layout: */
  #define HOST_R1         0 /* Implied by stwu. */
  #define HOST_CALLEE_LR  4
@@@ -34,9 -36,8 +34,9 @@@
  #define HOST_R2         12
  #define HOST_CR         16
  #define HOST_NV_GPRS    20
 -#define HOST_NV_GPR(n)  (HOST_NV_GPRS + ((n - 14) * 4))
 -#define HOST_MIN_STACK_SIZE (HOST_NV_GPR(31) + 4)
 +#define __HOST_NV_GPR(n)  (HOST_NV_GPRS + ((n - 14) * 4))
 +#define HOST_NV_GPR(n)  __HOST_NV_GPR(__REG_##n)
 +#define HOST_MIN_STACK_SIZE (HOST_NV_GPR(R31) + 4)
  #define HOST_STACK_SIZE (((HOST_MIN_STACK_SIZE + 15) / 16) * 16) /* Align. */
  #define HOST_STACK_LR   (HOST_STACK_SIZE + 4) /* In caller stack frame. */
  
                         (1<<BOOKE_INTERRUPT_PROGRAM) | \
                         (1<<BOOKE_INTERRUPT_DTLB_MISS))
  
- .macro KVM_HANDLER ivor_nr
+ .macro KVM_HANDLER ivor_nr scratch srr0
  _GLOBAL(kvmppc_handler_\ivor_nr)
        /* Get pointer to vcpu and record exit number. */
-       mtspr   SPRN_SPRG_WSCRATCH0, r4
+       mtspr   \scratch , r4
        mfspr   r4, SPRN_SPRG_RVCPU
 -      stw     r3, VCPU_GPR(r3)(r4)
 -      stw     r5, VCPU_GPR(r5)(r4)
 -      stw     r6, VCPU_GPR(r6)(r4)
++      stw     r3, VCPU_GPR(R3)(r4)
 +      stw     r5, VCPU_GPR(R5)(r4)
 +      stw     r6, VCPU_GPR(R6)(r4)
+       mfspr   r3, \scratch
        mfctr   r5
-       lis     r6, kvmppc_resume_host@h
 -      stw     r3, VCPU_GPR(r4)(r4)
++      stw     r3, VCPU_GPR(R4)(r4)
        stw     r5, VCPU_CTR(r4)
+       mfspr   r3, \srr0
+       lis     r6, kvmppc_resume_host@h
+       stw     r3, VCPU_PC(r4)
        li      r5, \ivor_nr
        ori     r6, r6, kvmppc_resume_host@l
        mtctr   r6
  .endm
  
  _GLOBAL(kvmppc_handlers_start)
- KVM_HANDLER BOOKE_INTERRUPT_CRITICAL
- KVM_HANDLER BOOKE_INTERRUPT_MACHINE_CHECK
- KVM_HANDLER BOOKE_INTERRUPT_DATA_STORAGE
- KVM_HANDLER BOOKE_INTERRUPT_INST_STORAGE
- KVM_HANDLER BOOKE_INTERRUPT_EXTERNAL
- KVM_HANDLER BOOKE_INTERRUPT_ALIGNMENT
- KVM_HANDLER BOOKE_INTERRUPT_PROGRAM
- KVM_HANDLER BOOKE_INTERRUPT_FP_UNAVAIL
- KVM_HANDLER BOOKE_INTERRUPT_SYSCALL
- KVM_HANDLER BOOKE_INTERRUPT_AP_UNAVAIL
- KVM_HANDLER BOOKE_INTERRUPT_DECREMENTER
- KVM_HANDLER BOOKE_INTERRUPT_FIT
- KVM_HANDLER BOOKE_INTERRUPT_WATCHDOG
- KVM_HANDLER BOOKE_INTERRUPT_DTLB_MISS
- KVM_HANDLER BOOKE_INTERRUPT_ITLB_MISS
- KVM_HANDLER BOOKE_INTERRUPT_DEBUG
- KVM_HANDLER BOOKE_INTERRUPT_SPE_UNAVAIL
- KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_DATA
- KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_ROUND
+ KVM_HANDLER BOOKE_INTERRUPT_CRITICAL SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0
+ KVM_HANDLER BOOKE_INTERRUPT_MACHINE_CHECK  SPRN_SPRG_RSCRATCH_MC SPRN_MCSRR0
+ KVM_HANDLER BOOKE_INTERRUPT_DATA_STORAGE SPRN_SPRG_RSCRATCH0 SPRN_SRR0
+ KVM_HANDLER BOOKE_INTERRUPT_INST_STORAGE SPRN_SPRG_RSCRATCH0 SPRN_SRR0
+ KVM_HANDLER BOOKE_INTERRUPT_EXTERNAL SPRN_SPRG_RSCRATCH0 SPRN_SRR0
+ KVM_HANDLER BOOKE_INTERRUPT_ALIGNMENT SPRN_SPRG_RSCRATCH0 SPRN_SRR0
+ KVM_HANDLER BOOKE_INTERRUPT_PROGRAM SPRN_SPRG_RSCRATCH0 SPRN_SRR0
+ KVM_HANDLER BOOKE_INTERRUPT_FP_UNAVAIL SPRN_SPRG_RSCRATCH0 SPRN_SRR0
+ KVM_HANDLER BOOKE_INTERRUPT_SYSCALL SPRN_SPRG_RSCRATCH0 SPRN_SRR0
+ KVM_HANDLER BOOKE_INTERRUPT_AP_UNAVAIL SPRN_SPRG_RSCRATCH0 SPRN_SRR0
+ KVM_HANDLER BOOKE_INTERRUPT_DECREMENTER SPRN_SPRG_RSCRATCH0 SPRN_SRR0
+ KVM_HANDLER BOOKE_INTERRUPT_FIT SPRN_SPRG_RSCRATCH0 SPRN_SRR0
+ KVM_HANDLER BOOKE_INTERRUPT_WATCHDOG SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0
+ KVM_HANDLER BOOKE_INTERRUPT_DTLB_MISS SPRN_SPRG_RSCRATCH0 SPRN_SRR0
+ KVM_HANDLER BOOKE_INTERRUPT_ITLB_MISS SPRN_SPRG_RSCRATCH0 SPRN_SRR0
+ KVM_HANDLER BOOKE_INTERRUPT_DEBUG SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0
+ KVM_HANDLER BOOKE_INTERRUPT_SPE_UNAVAIL SPRN_SPRG_RSCRATCH0 SPRN_SRR0
+ KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_DATA SPRN_SPRG_RSCRATCH0 SPRN_SRR0
+ KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_ROUND SPRN_SPRG_RSCRATCH0 SPRN_SRR0
  
  _GLOBAL(kvmppc_handler_len)
        .long kvmppc_handler_1 - kvmppc_handler_0
  
  /* Registers:
   *  SPRG_SCRATCH0: guest r4
   *  r4: vcpu pointer
   *  r5: KVM exit number
   */
  _GLOBAL(kvmppc_resume_host)
-       stw     r3, VCPU_GPR(R3)(r4)
        mfcr    r3
        stw     r3, VCPU_CR(r4)
 -      stw     r7, VCPU_GPR(r7)(r4)
 -      stw     r8, VCPU_GPR(r8)(r4)
 -      stw     r9, VCPU_GPR(r9)(r4)
 +      stw     r7, VCPU_GPR(R7)(r4)
 +      stw     r8, VCPU_GPR(R8)(r4)
 +      stw     r9, VCPU_GPR(R9)(r4)
  
        li      r6, 1
        slw     r6, r6, r5
        isync
        stw     r9, VCPU_LAST_INST(r4)
  
 -      stw     r15, VCPU_GPR(r15)(r4)
 -      stw     r16, VCPU_GPR(r16)(r4)
 -      stw     r17, VCPU_GPR(r17)(r4)
 -      stw     r18, VCPU_GPR(r18)(r4)
 -      stw     r19, VCPU_GPR(r19)(r4)
 -      stw     r20, VCPU_GPR(r20)(r4)
 -      stw     r21, VCPU_GPR(r21)(r4)
 -      stw     r22, VCPU_GPR(r22)(r4)
 -      stw     r23, VCPU_GPR(r23)(r4)
 -      stw     r24, VCPU_GPR(r24)(r4)
 -      stw     r25, VCPU_GPR(r25)(r4)
 -      stw     r26, VCPU_GPR(r26)(r4)
 -      stw     r27, VCPU_GPR(r27)(r4)
 -      stw     r28, VCPU_GPR(r28)(r4)
 -      stw     r29, VCPU_GPR(r29)(r4)
 -      stw     r30, VCPU_GPR(r30)(r4)
 -      stw     r31, VCPU_GPR(r31)(r4)
 +      stw     r15, VCPU_GPR(R15)(r4)
 +      stw     r16, VCPU_GPR(R16)(r4)
 +      stw     r17, VCPU_GPR(R17)(r4)
 +      stw     r18, VCPU_GPR(R18)(r4)
 +      stw     r19, VCPU_GPR(R19)(r4)
 +      stw     r20, VCPU_GPR(R20)(r4)
 +      stw     r21, VCPU_GPR(R21)(r4)
 +      stw     r22, VCPU_GPR(R22)(r4)
 +      stw     r23, VCPU_GPR(R23)(r4)
 +      stw     r24, VCPU_GPR(R24)(r4)
 +      stw     r25, VCPU_GPR(R25)(r4)
 +      stw     r26, VCPU_GPR(R26)(r4)
 +      stw     r27, VCPU_GPR(R27)(r4)
 +      stw     r28, VCPU_GPR(R28)(r4)
 +      stw     r29, VCPU_GPR(R29)(r4)
 +      stw     r30, VCPU_GPR(R30)(r4)
 +      stw     r31, VCPU_GPR(R31)(r4)
  ..skip_inst_copy:
  
        /* Also grab DEAR and ESR before the host can clobber them. */
  ..skip_esr:
  
        /* Save remaining volatile guest register state to vcpu. */
 -      stw     r0, VCPU_GPR(r0)(r4)
 -      stw     r1, VCPU_GPR(r1)(r4)
 -      stw     r2, VCPU_GPR(r2)(r4)
 -      stw     r10, VCPU_GPR(r10)(r4)
 -      stw     r11, VCPU_GPR(r11)(r4)
 -      stw     r12, VCPU_GPR(r12)(r4)
 -      stw     r13, VCPU_GPR(r13)(r4)
 -      stw     r14, VCPU_GPR(r14)(r4) /* We need a NV GPR below. */
 +      stw     r0, VCPU_GPR(R0)(r4)
 +      stw     r1, VCPU_GPR(R1)(r4)
 +      stw     r2, VCPU_GPR(R2)(r4)
 +      stw     r10, VCPU_GPR(R10)(r4)
 +      stw     r11, VCPU_GPR(R11)(r4)
 +      stw     r12, VCPU_GPR(R12)(r4)
 +      stw     r13, VCPU_GPR(R13)(r4)
 +      stw     r14, VCPU_GPR(R14)(r4) /* We need a NV GPR below. */
        mflr    r3
        stw     r3, VCPU_LR(r4)
        mfxer   r3
        stw     r3, VCPU_XER(r4)
-       mfspr   r3, SPRN_SPRG_RSCRATCH0
-       stw     r3, VCPU_GPR(R4)(r4)
-       mfspr   r3, SPRN_SRR0
-       stw     r3, VCPU_PC(r4)
  
        /* Restore host stack pointer and PID before IVPR, since the host
         * exception handlers use them. */
  
        /* Restore vcpu pointer and the nonvolatiles we used. */
        mr      r4, r14
 -      lwz     r14, VCPU_GPR(r14)(r4)
 +      lwz     r14, VCPU_GPR(R14)(r4)
  
        /* Sometimes instruction emulation must restore complete GPR state. */
        andi.   r5, r3, RESUME_FLAG_NV
        beq     ..skip_nv_load
 -      lwz     r15, VCPU_GPR(r15)(r4)
 -      lwz     r16, VCPU_GPR(r16)(r4)
 -      lwz     r17, VCPU_GPR(r17)(r4)
 -      lwz     r18, VCPU_GPR(r18)(r4)
 -      lwz     r19, VCPU_GPR(r19)(r4)
 -      lwz     r20, VCPU_GPR(r20)(r4)
 -      lwz     r21, VCPU_GPR(r21)(r4)
 -      lwz     r22, VCPU_GPR(r22)(r4)
 -      lwz     r23, VCPU_GPR(r23)(r4)
 -      lwz     r24, VCPU_GPR(r24)(r4)
 -      lwz     r25, VCPU_GPR(r25)(r4)
 -      lwz     r26, VCPU_GPR(r26)(r4)
 -      lwz     r27, VCPU_GPR(r27)(r4)
 -      lwz     r28, VCPU_GPR(r28)(r4)
 -      lwz     r29, VCPU_GPR(r29)(r4)
 -      lwz     r30, VCPU_GPR(r30)(r4)
 -      lwz     r31, VCPU_GPR(r31)(r4)
 +      lwz     r15, VCPU_GPR(R15)(r4)
 +      lwz     r16, VCPU_GPR(R16)(r4)
 +      lwz     r17, VCPU_GPR(R17)(r4)
 +      lwz     r18, VCPU_GPR(R18)(r4)
 +      lwz     r19, VCPU_GPR(R19)(r4)
 +      lwz     r20, VCPU_GPR(R20)(r4)
 +      lwz     r21, VCPU_GPR(R21)(r4)
 +      lwz     r22, VCPU_GPR(R22)(r4)
 +      lwz     r23, VCPU_GPR(R23)(r4)
 +      lwz     r24, VCPU_GPR(R24)(r4)
 +      lwz     r25, VCPU_GPR(R25)(r4)
 +      lwz     r26, VCPU_GPR(R26)(r4)
 +      lwz     r27, VCPU_GPR(R27)(r4)
 +      lwz     r28, VCPU_GPR(R28)(r4)
 +      lwz     r29, VCPU_GPR(R29)(r4)
 +      lwz     r30, VCPU_GPR(R30)(r4)
 +      lwz     r31, VCPU_GPR(R31)(r4)
  ..skip_nv_load:
  
        /* Should we return to the guest? */
@@@ -256,43 -256,43 +255,43 @@@ heavyweight_exit
  
        /* We already saved guest volatile register state; now save the
         * non-volatiles. */
 -      stw     r15, VCPU_GPR(r15)(r4)
 -      stw     r16, VCPU_GPR(r16)(r4)
 -      stw     r17, VCPU_GPR(r17)(r4)
 -      stw     r18, VCPU_GPR(r18)(r4)
 -      stw     r19, VCPU_GPR(r19)(r4)
 -      stw     r20, VCPU_GPR(r20)(r4)
 -      stw     r21, VCPU_GPR(r21)(r4)
 -      stw     r22, VCPU_GPR(r22)(r4)
 -      stw     r23, VCPU_GPR(r23)(r4)
 -      stw     r24, VCPU_GPR(r24)(r4)
 -      stw     r25, VCPU_GPR(r25)(r4)
 -      stw     r26, VCPU_GPR(r26)(r4)
 -      stw     r27, VCPU_GPR(r27)(r4)
 -      stw     r28, VCPU_GPR(r28)(r4)
 -      stw     r29, VCPU_GPR(r29)(r4)
 -      stw     r30, VCPU_GPR(r30)(r4)
 -      stw     r31, VCPU_GPR(r31)(r4)
 +      stw     r15, VCPU_GPR(R15)(r4)
 +      stw     r16, VCPU_GPR(R16)(r4)
 +      stw     r17, VCPU_GPR(R17)(r4)
 +      stw     r18, VCPU_GPR(R18)(r4)
 +      stw     r19, VCPU_GPR(R19)(r4)
 +      stw     r20, VCPU_GPR(R20)(r4)
 +      stw     r21, VCPU_GPR(R21)(r4)
 +      stw     r22, VCPU_GPR(R22)(r4)
 +      stw     r23, VCPU_GPR(R23)(r4)
 +      stw     r24, VCPU_GPR(R24)(r4)
 +      stw     r25, VCPU_GPR(R25)(r4)
 +      stw     r26, VCPU_GPR(R26)(r4)
 +      stw     r27, VCPU_GPR(R27)(r4)
 +      stw     r28, VCPU_GPR(R28)(r4)
 +      stw     r29, VCPU_GPR(R29)(r4)
 +      stw     r30, VCPU_GPR(R30)(r4)
 +      stw     r31, VCPU_GPR(R31)(r4)
  
        /* Load host non-volatile register state from host stack. */
 -      lwz     r14, HOST_NV_GPR(r14)(r1)
 -      lwz     r15, HOST_NV_GPR(r15)(r1)
 -      lwz     r16, HOST_NV_GPR(r16)(r1)
 -      lwz     r17, HOST_NV_GPR(r17)(r1)
 -      lwz     r18, HOST_NV_GPR(r18)(r1)
 -      lwz     r19, HOST_NV_GPR(r19)(r1)
 -      lwz     r20, HOST_NV_GPR(r20)(r1)
 -      lwz     r21, HOST_NV_GPR(r21)(r1)
 -      lwz     r22, HOST_NV_GPR(r22)(r1)
 -      lwz     r23, HOST_NV_GPR(r23)(r1)
 -      lwz     r24, HOST_NV_GPR(r24)(r1)
 -      lwz     r25, HOST_NV_GPR(r25)(r1)
 -      lwz     r26, HOST_NV_GPR(r26)(r1)
 -      lwz     r27, HOST_NV_GPR(r27)(r1)
 -      lwz     r28, HOST_NV_GPR(r28)(r1)
 -      lwz     r29, HOST_NV_GPR(r29)(r1)
 -      lwz     r30, HOST_NV_GPR(r30)(r1)
 -      lwz     r31, HOST_NV_GPR(r31)(r1)
 +      lwz     r14, HOST_NV_GPR(R14)(r1)
 +      lwz     r15, HOST_NV_GPR(R15)(r1)
 +      lwz     r16, HOST_NV_GPR(R16)(r1)
 +      lwz     r17, HOST_NV_GPR(R17)(r1)
 +      lwz     r18, HOST_NV_GPR(R18)(r1)
 +      lwz     r19, HOST_NV_GPR(R19)(r1)
 +      lwz     r20, HOST_NV_GPR(R20)(r1)
 +      lwz     r21, HOST_NV_GPR(R21)(r1)
 +      lwz     r22, HOST_NV_GPR(R22)(r1)
 +      lwz     r23, HOST_NV_GPR(R23)(r1)
 +      lwz     r24, HOST_NV_GPR(R24)(r1)
 +      lwz     r25, HOST_NV_GPR(R25)(r1)
 +      lwz     r26, HOST_NV_GPR(R26)(r1)
 +      lwz     r27, HOST_NV_GPR(R27)(r1)
 +      lwz     r28, HOST_NV_GPR(R28)(r1)
 +      lwz     r29, HOST_NV_GPR(R29)(r1)
 +      lwz     r30, HOST_NV_GPR(R30)(r1)
 +      lwz     r31, HOST_NV_GPR(R31)(r1)
  
        /* Return to kvm_vcpu_run(). */
        lwz     r4, HOST_STACK_LR(r1)
@@@ -320,44 -320,44 +319,44 @@@ _GLOBAL(__kvmppc_vcpu_run
        stw     r5, HOST_CR(r1)
  
        /* Save host non-volatile register state to stack. */
 -      stw     r14, HOST_NV_GPR(r14)(r1)
 -      stw     r15, HOST_NV_GPR(r15)(r1)
 -      stw     r16, HOST_NV_GPR(r16)(r1)
 -      stw     r17, HOST_NV_GPR(r17)(r1)
 -      stw     r18, HOST_NV_GPR(r18)(r1)
 -      stw     r19, HOST_NV_GPR(r19)(r1)
 -      stw     r20, HOST_NV_GPR(r20)(r1)
 -      stw     r21, HOST_NV_GPR(r21)(r1)
 -      stw     r22, HOST_NV_GPR(r22)(r1)
 -      stw     r23, HOST_NV_GPR(r23)(r1)
 -      stw     r24, HOST_NV_GPR(r24)(r1)
 -      stw     r25, HOST_NV_GPR(r25)(r1)
 -      stw     r26, HOST_NV_GPR(r26)(r1)
 -      stw     r27, HOST_NV_GPR(r27)(r1)
 -      stw     r28, HOST_NV_GPR(r28)(r1)
 -      stw     r29, HOST_NV_GPR(r29)(r1)
 -      stw     r30, HOST_NV_GPR(r30)(r1)
 -      stw     r31, HOST_NV_GPR(r31)(r1)
 +      stw     r14, HOST_NV_GPR(R14)(r1)
 +      stw     r15, HOST_NV_GPR(R15)(r1)
 +      stw     r16, HOST_NV_GPR(R16)(r1)
 +      stw     r17, HOST_NV_GPR(R17)(r1)
 +      stw     r18, HOST_NV_GPR(R18)(r1)
 +      stw     r19, HOST_NV_GPR(R19)(r1)
 +      stw     r20, HOST_NV_GPR(R20)(r1)
 +      stw     r21, HOST_NV_GPR(R21)(r1)
 +      stw     r22, HOST_NV_GPR(R22)(r1)
 +      stw     r23, HOST_NV_GPR(R23)(r1)
 +      stw     r24, HOST_NV_GPR(R24)(r1)
 +      stw     r25, HOST_NV_GPR(R25)(r1)
 +      stw     r26, HOST_NV_GPR(R26)(r1)
 +      stw     r27, HOST_NV_GPR(R27)(r1)
 +      stw     r28, HOST_NV_GPR(R28)(r1)
 +      stw     r29, HOST_NV_GPR(R29)(r1)
 +      stw     r30, HOST_NV_GPR(R30)(r1)
 +      stw     r31, HOST_NV_GPR(R31)(r1)
  
        /* Load guest non-volatiles. */
 -      lwz     r14, VCPU_GPR(r14)(r4)
 -      lwz     r15, VCPU_GPR(r15)(r4)
 -      lwz     r16, VCPU_GPR(r16)(r4)
 -      lwz     r17, VCPU_GPR(r17)(r4)
 -      lwz     r18, VCPU_GPR(r18)(r4)
 -      lwz     r19, VCPU_GPR(r19)(r4)
 -      lwz     r20, VCPU_GPR(r20)(r4)
 -      lwz     r21, VCPU_GPR(r21)(r4)
 -      lwz     r22, VCPU_GPR(r22)(r4)
 -      lwz     r23, VCPU_GPR(r23)(r4)
 -      lwz     r24, VCPU_GPR(r24)(r4)
 -      lwz     r25, VCPU_GPR(r25)(r4)
 -      lwz     r26, VCPU_GPR(r26)(r4)
 -      lwz     r27, VCPU_GPR(r27)(r4)
 -      lwz     r28, VCPU_GPR(r28)(r4)
 -      lwz     r29, VCPU_GPR(r29)(r4)
 -      lwz     r30, VCPU_GPR(r30)(r4)
 -      lwz     r31, VCPU_GPR(r31)(r4)
 +      lwz     r14, VCPU_GPR(R14)(r4)
 +      lwz     r15, VCPU_GPR(R15)(r4)
 +      lwz     r16, VCPU_GPR(R16)(r4)
 +      lwz     r17, VCPU_GPR(R17)(r4)
 +      lwz     r18, VCPU_GPR(R18)(r4)
 +      lwz     r19, VCPU_GPR(R19)(r4)
 +      lwz     r20, VCPU_GPR(R20)(r4)
 +      lwz     r21, VCPU_GPR(R21)(r4)
 +      lwz     r22, VCPU_GPR(R22)(r4)
 +      lwz     r23, VCPU_GPR(R23)(r4)
 +      lwz     r24, VCPU_GPR(R24)(r4)
 +      lwz     r25, VCPU_GPR(R25)(r4)
 +      lwz     r26, VCPU_GPR(R26)(r4)
 +      lwz     r27, VCPU_GPR(R27)(r4)
 +      lwz     r28, VCPU_GPR(R28)(r4)
 +      lwz     r29, VCPU_GPR(R29)(r4)
 +      lwz     r30, VCPU_GPR(R30)(r4)
 +      lwz     r31, VCPU_GPR(R31)(r4)
  
  #ifdef CONFIG_SPE
        /* save host SPEFSCR and load guest SPEFSCR */
@@@ -385,13 -385,13 +384,13 @@@ lightweight_exit
  #endif
  
        /* Load some guest volatiles. */
 -      lwz     r0, VCPU_GPR(r0)(r4)
 -      lwz     r2, VCPU_GPR(r2)(r4)
 -      lwz     r9, VCPU_GPR(r9)(r4)
 -      lwz     r10, VCPU_GPR(r10)(r4)
 -      lwz     r11, VCPU_GPR(r11)(r4)
 -      lwz     r12, VCPU_GPR(r12)(r4)
 -      lwz     r13, VCPU_GPR(r13)(r4)
 +      lwz     r0, VCPU_GPR(R0)(r4)
 +      lwz     r2, VCPU_GPR(R2)(r4)
 +      lwz     r9, VCPU_GPR(R9)(r4)
 +      lwz     r10, VCPU_GPR(R10)(r4)
 +      lwz     r11, VCPU_GPR(R11)(r4)
 +      lwz     r12, VCPU_GPR(R12)(r4)
 +      lwz     r13, VCPU_GPR(R13)(r4)
        lwz     r3, VCPU_LR(r4)
        mtlr    r3
        lwz     r3, VCPU_XER(r4)
  
        /* Can't switch the stack pointer until after IVPR is switched,
         * because host interrupt handlers would get confused. */
 -      lwz     r1, VCPU_GPR(r1)(r4)
 +      lwz     r1, VCPU_GPR(R1)(r4)
  
        /*
         * Host interrupt handlers may have clobbered these
        mtcr    r5
        mtsrr0  r6
        mtsrr1  r7
 -      lwz     r5, VCPU_GPR(r5)(r4)
 -      lwz     r6, VCPU_GPR(r6)(r4)
 -      lwz     r7, VCPU_GPR(r7)(r4)
 -      lwz     r8, VCPU_GPR(r8)(r4)
 +      lwz     r5, VCPU_GPR(R5)(r4)
 +      lwz     r6, VCPU_GPR(R6)(r4)
 +      lwz     r7, VCPU_GPR(R7)(r4)
 +      lwz     r8, VCPU_GPR(R8)(r4)
  
        /* Clear any debug events which occurred since we disabled MSR[DE].
         * XXX This gives us a 3-instruction window in which a breakpoint
        ori     r3, r3, 0xffff
        mtspr   SPRN_DBSR, r3
  
 -      lwz     r3, VCPU_GPR(r3)(r4)
 -      lwz     r4, VCPU_GPR(r4)(r4)
 +      lwz     r3, VCPU_GPR(R3)(r4)
 +      lwz     r4, VCPU_GPR(R4)(r4)
        rfi
  
  #ifdef CONFIG_SPE
index 1685dc43bcf286615b246eb83f163a3a183bb2c3,0fa2ef7df03683b0037361025f56f97873b865df..d28c2d43ac1bb421b58241262ce4dfe9bad46d37
@@@ -37,6 -37,7 +37,6 @@@
  
  #define LONGBYTES             (BITS_PER_LONG / 8)
  
 -#define VCPU_GPR(n)           (VCPU_GPRS + (n * LONGBYTES))
  #define VCPU_GUEST_SPRG(n)    (VCPU_GUEST_SPRGS + (n * LONGBYTES))
  
  /* The host stack layout: */
   */
  .macro kvm_handler_common intno, srr0, flags
        /* Restore host stack pointer */
 -      PPC_STL r1, VCPU_GPR(r1)(r4)
 -      PPC_STL r2, VCPU_GPR(r2)(r4)
 +      PPC_STL r1, VCPU_GPR(R1)(r4)
 +      PPC_STL r2, VCPU_GPR(R2)(r4)
        PPC_LL  r1, VCPU_HOST_STACK(r4)
        PPC_LL  r2, HOST_R2(r1)
  
        mfspr   r10, SPRN_PID
        lwz     r8, VCPU_HOST_PID(r4)
        PPC_LL  r11, VCPU_SHARED(r4)
 -      PPC_STL r14, VCPU_GPR(r14)(r4) /* We need a non-volatile GPR. */
 +      PPC_STL r14, VCPU_GPR(R14)(r4) /* We need a non-volatile GPR. */
        li      r14, \intno
  
        stw     r10, VCPU_GUEST_PID(r4)
         */
  
        mfspr   r3, SPRN_EPLC   /* will already have correct ELPID and EGS */
 -      PPC_STL r15, VCPU_GPR(r15)(r4)
 -      PPC_STL r16, VCPU_GPR(r16)(r4)
 -      PPC_STL r17, VCPU_GPR(r17)(r4)
 -      PPC_STL r18, VCPU_GPR(r18)(r4)
 -      PPC_STL r19, VCPU_GPR(r19)(r4)
 +      PPC_STL r15, VCPU_GPR(R15)(r4)
 +      PPC_STL r16, VCPU_GPR(R16)(r4)
 +      PPC_STL r17, VCPU_GPR(R17)(r4)
 +      PPC_STL r18, VCPU_GPR(R18)(r4)
 +      PPC_STL r19, VCPU_GPR(R19)(r4)
        mr      r8, r3
 -      PPC_STL r20, VCPU_GPR(r20)(r4)
 +      PPC_STL r20, VCPU_GPR(R20)(r4)
        rlwimi  r8, r6, EPC_EAS_SHIFT - MSR_IR_LG, EPC_EAS
 -      PPC_STL r21, VCPU_GPR(r21)(r4)
 +      PPC_STL r21, VCPU_GPR(R21)(r4)
        rlwimi  r8, r6, EPC_EPR_SHIFT - MSR_PR_LG, EPC_EPR
 -      PPC_STL r22, VCPU_GPR(r22)(r4)
 +      PPC_STL r22, VCPU_GPR(R22)(r4)
        rlwimi  r8, r10, EPC_EPID_SHIFT, EPC_EPID
 -      PPC_STL r23, VCPU_GPR(r23)(r4)
 -      PPC_STL r24, VCPU_GPR(r24)(r4)
 -      PPC_STL r25, VCPU_GPR(r25)(r4)
 -      PPC_STL r26, VCPU_GPR(r26)(r4)
 -      PPC_STL r27, VCPU_GPR(r27)(r4)
 -      PPC_STL r28, VCPU_GPR(r28)(r4)
 -      PPC_STL r29, VCPU_GPR(r29)(r4)
 -      PPC_STL r30, VCPU_GPR(r30)(r4)
 -      PPC_STL r31, VCPU_GPR(r31)(r4)
 +      PPC_STL r23, VCPU_GPR(R23)(r4)
 +      PPC_STL r24, VCPU_GPR(R24)(r4)
 +      PPC_STL r25, VCPU_GPR(R25)(r4)
 +      PPC_STL r26, VCPU_GPR(R26)(r4)
 +      PPC_STL r27, VCPU_GPR(R27)(r4)
 +      PPC_STL r28, VCPU_GPR(R28)(r4)
 +      PPC_STL r29, VCPU_GPR(R29)(r4)
 +      PPC_STL r30, VCPU_GPR(R30)(r4)
 +      PPC_STL r31, VCPU_GPR(R31)(r4)
        mtspr   SPRN_EPLC, r8
  
        /* disable preemption, so we are sure we hit the fixup handler */
 -#ifdef CONFIG_PPC64
 -      clrrdi  r8,r1,THREAD_SHIFT
 -#else
 -      rlwinm  r8,r1,0,0,31-THREAD_SHIFT       /* current thread_info */
 -#endif
 +      CURRENT_THREAD_INFO(r8, r1)
        li      r7, 1
        stw     r7, TI_PREEMPT(r8)
  
  .macro kvm_handler intno srr0, srr1, flags
  _GLOBAL(kvmppc_handler_\intno\()_\srr1)
        GET_VCPU(r11, r10)
 -      PPC_STL r3, VCPU_GPR(r3)(r11)
 +      PPC_STL r3, VCPU_GPR(R3)(r11)
        mfspr   r3, SPRN_SPRG_RSCRATCH0
 -      PPC_STL r4, VCPU_GPR(r4)(r11)
 +      PPC_STL r4, VCPU_GPR(R4)(r11)
        PPC_LL  r4, THREAD_NORMSAVE(0)(r10)
 -      PPC_STL r5, VCPU_GPR(r5)(r11)
 +      PPC_STL r5, VCPU_GPR(R5)(r11)
        stw     r13, VCPU_CR(r11)
        mfspr   r5, \srr0
 -      PPC_STL r3, VCPU_GPR(r10)(r11)
 +      PPC_STL r3, VCPU_GPR(R10)(r11)
        PPC_LL  r3, THREAD_NORMSAVE(2)(r10)
 -      PPC_STL r6, VCPU_GPR(r6)(r11)
 -      PPC_STL r4, VCPU_GPR(r11)(r11)
 +      PPC_STL r6, VCPU_GPR(R6)(r11)
 +      PPC_STL r4, VCPU_GPR(R11)(r11)
        mfspr   r6, \srr1
 -      PPC_STL r7, VCPU_GPR(r7)(r11)
 -      PPC_STL r8, VCPU_GPR(r8)(r11)
 -      PPC_STL r9, VCPU_GPR(r9)(r11)
 -      PPC_STL r3, VCPU_GPR(r13)(r11)
 +      PPC_STL r7, VCPU_GPR(R7)(r11)
 +      PPC_STL r8, VCPU_GPR(R8)(r11)
 +      PPC_STL r9, VCPU_GPR(R9)(r11)
 +      PPC_STL r3, VCPU_GPR(R13)(r11)
        mfctr   r7
 -      PPC_STL r12, VCPU_GPR(r12)(r11)
 +      PPC_STL r12, VCPU_GPR(R12)(r11)
        PPC_STL r7, VCPU_CTR(r11)
        mr      r4, r11
        kvm_handler_common \intno, \srr0, \flags
  _GLOBAL(kvmppc_handler_\intno\()_\srr1)
        mfspr   r10, SPRN_SPRG_THREAD
        GET_VCPU(r11, r10)
 -      PPC_STL r3, VCPU_GPR(r3)(r11)
 +      PPC_STL r3, VCPU_GPR(R3)(r11)
        mfspr   r3, \scratch
 -      PPC_STL r4, VCPU_GPR(r4)(r11)
 +      PPC_STL r4, VCPU_GPR(R4)(r11)
        PPC_LL  r4, GPR9(r8)
 -      PPC_STL r5, VCPU_GPR(r5)(r11)
 +      PPC_STL r5, VCPU_GPR(R5)(r11)
        stw     r9, VCPU_CR(r11)
        mfspr   r5, \srr0
 -      PPC_STL r3, VCPU_GPR(r8)(r11)
 +      PPC_STL r3, VCPU_GPR(R8)(r11)
        PPC_LL  r3, GPR10(r8)
 -      PPC_STL r6, VCPU_GPR(r6)(r11)
 -      PPC_STL r4, VCPU_GPR(r9)(r11)
 +      PPC_STL r6, VCPU_GPR(R6)(r11)
 +      PPC_STL r4, VCPU_GPR(R9)(r11)
        mfspr   r6, \srr1
        PPC_LL  r4, GPR11(r8)
 -      PPC_STL r7, VCPU_GPR(r7)(r11)
 -      PPC_STL r3, VCPU_GPR(r10)(r11)
 +      PPC_STL r7, VCPU_GPR(R7)(r11)
 +      PPC_STL r3, VCPU_GPR(R10)(r11)
        mfctr   r7
 -      PPC_STL r12, VCPU_GPR(r12)(r11)
 -      PPC_STL r13, VCPU_GPR(r13)(r11)
 -      PPC_STL r4, VCPU_GPR(r11)(r11)
 +      PPC_STL r12, VCPU_GPR(R12)(r11)
 +      PPC_STL r13, VCPU_GPR(R13)(r11)
 +      PPC_STL r4, VCPU_GPR(R11)(r11)
        PPC_STL r7, VCPU_CTR(r11)
        mr      r4, r11
        kvm_handler_common \intno, \srr0, \flags
@@@ -262,7 -267,7 +262,7 @@@ kvm_lvl_handler BOOKE_INTERRUPT_CRITICA
  kvm_lvl_handler BOOKE_INTERRUPT_MACHINE_CHECK, \
        SPRN_SPRG_RSCRATCH_MC, SPRN_MCSRR0, SPRN_MCSRR1, 0
  kvm_handler BOOKE_INTERRUPT_DATA_STORAGE, \
-       SPRN_SRR0, SPRN_SRR1, (NEED_EMU | NEED_DEAR)
+       SPRN_SRR0, SPRN_SRR1, (NEED_EMU | NEED_DEAR | NEED_ESR)
  kvm_handler BOOKE_INTERRUPT_INST_STORAGE, SPRN_SRR0, SPRN_SRR1, NEED_ESR
  kvm_handler BOOKE_INTERRUPT_EXTERNAL, SPRN_SRR0, SPRN_SRR1, 0
  kvm_handler BOOKE_INTERRUPT_ALIGNMENT, \
@@@ -305,7 -310,7 +305,7 @@@ kvm_lvl_handler BOOKE_INTERRUPT_DEBUG, 
  _GLOBAL(kvmppc_resume_host)
        /* Save remaining volatile guest register state to vcpu. */
        mfspr   r3, SPRN_VRSAVE
 -      PPC_STL r0, VCPU_GPR(r0)(r4)
 +      PPC_STL r0, VCPU_GPR(R0)(r4)
        mflr    r5
        mfspr   r6, SPRN_SPRG4
        PPC_STL r5, VCPU_LR(r4)
  
        /* Restore vcpu pointer and the nonvolatiles we used. */
        mr      r4, r14
 -      PPC_LL  r14, VCPU_GPR(r14)(r4)
 +      PPC_LL  r14, VCPU_GPR(R14)(r4)
  
        andi.   r5, r3, RESUME_FLAG_NV
        beq     skip_nv_load
 -      PPC_LL  r15, VCPU_GPR(r15)(r4)
 -      PPC_LL  r16, VCPU_GPR(r16)(r4)
 -      PPC_LL  r17, VCPU_GPR(r17)(r4)
 -      PPC_LL  r18, VCPU_GPR(r18)(r4)
 -      PPC_LL  r19, VCPU_GPR(r19)(r4)
 -      PPC_LL  r20, VCPU_GPR(r20)(r4)
 -      PPC_LL  r21, VCPU_GPR(r21)(r4)
 -      PPC_LL  r22, VCPU_GPR(r22)(r4)
 -      PPC_LL  r23, VCPU_GPR(r23)(r4)
 -      PPC_LL  r24, VCPU_GPR(r24)(r4)
 -      PPC_LL  r25, VCPU_GPR(r25)(r4)
 -      PPC_LL  r26, VCPU_GPR(r26)(r4)
 -      PPC_LL  r27, VCPU_GPR(r27)(r4)
 -      PPC_LL  r28, VCPU_GPR(r28)(r4)
 -      PPC_LL  r29, VCPU_GPR(r29)(r4)
 -      PPC_LL  r30, VCPU_GPR(r30)(r4)
 -      PPC_LL  r31, VCPU_GPR(r31)(r4)
 +      PPC_LL  r15, VCPU_GPR(R15)(r4)
 +      PPC_LL  r16, VCPU_GPR(R16)(r4)
 +      PPC_LL  r17, VCPU_GPR(R17)(r4)
 +      PPC_LL  r18, VCPU_GPR(R18)(r4)
 +      PPC_LL  r19, VCPU_GPR(R19)(r4)
 +      PPC_LL  r20, VCPU_GPR(R20)(r4)
 +      PPC_LL  r21, VCPU_GPR(R21)(r4)
 +      PPC_LL  r22, VCPU_GPR(R22)(r4)
 +      PPC_LL  r23, VCPU_GPR(R23)(r4)
 +      PPC_LL  r24, VCPU_GPR(R24)(r4)
 +      PPC_LL  r25, VCPU_GPR(R25)(r4)
 +      PPC_LL  r26, VCPU_GPR(R26)(r4)
 +      PPC_LL  r27, VCPU_GPR(R27)(r4)
 +      PPC_LL  r28, VCPU_GPR(R28)(r4)
 +      PPC_LL  r29, VCPU_GPR(R29)(r4)
 +      PPC_LL  r30, VCPU_GPR(R30)(r4)
 +      PPC_LL  r31, VCPU_GPR(R31)(r4)
  skip_nv_load:
        /* Should we return to the guest? */
        andi.   r5, r3, RESUME_FLAG_HOST
@@@ -391,23 -396,23 +391,23 @@@ heavyweight_exit
         * non-volatiles.
         */
  
 -      PPC_STL r15, VCPU_GPR(r15)(r4)
 -      PPC_STL r16, VCPU_GPR(r16)(r4)
 -      PPC_STL r17, VCPU_GPR(r17)(r4)
 -      PPC_STL r18, VCPU_GPR(r18)(r4)
 -      PPC_STL r19, VCPU_GPR(r19)(r4)
 -      PPC_STL r20, VCPU_GPR(r20)(r4)
 -      PPC_STL r21, VCPU_GPR(r21)(r4)
 -      PPC_STL r22, VCPU_GPR(r22)(r4)
 -      PPC_STL r23, VCPU_GPR(r23)(r4)
 -      PPC_STL r24, VCPU_GPR(r24)(r4)
 -      PPC_STL r25, VCPU_GPR(r25)(r4)
 -      PPC_STL r26, VCPU_GPR(r26)(r4)
 -      PPC_STL r27, VCPU_GPR(r27)(r4)
 -      PPC_STL r28, VCPU_GPR(r28)(r4)
 -      PPC_STL r29, VCPU_GPR(r29)(r4)
 -      PPC_STL r30, VCPU_GPR(r30)(r4)
 -      PPC_STL r31, VCPU_GPR(r31)(r4)
 +      PPC_STL r15, VCPU_GPR(R15)(r4)
 +      PPC_STL r16, VCPU_GPR(R16)(r4)
 +      PPC_STL r17, VCPU_GPR(R17)(r4)
 +      PPC_STL r18, VCPU_GPR(R18)(r4)
 +      PPC_STL r19, VCPU_GPR(R19)(r4)
 +      PPC_STL r20, VCPU_GPR(R20)(r4)
 +      PPC_STL r21, VCPU_GPR(R21)(r4)
 +      PPC_STL r22, VCPU_GPR(R22)(r4)
 +      PPC_STL r23, VCPU_GPR(R23)(r4)
 +      PPC_STL r24, VCPU_GPR(R24)(r4)
 +      PPC_STL r25, VCPU_GPR(R25)(r4)
 +      PPC_STL r26, VCPU_GPR(R26)(r4)
 +      PPC_STL r27, VCPU_GPR(R27)(r4)
 +      PPC_STL r28, VCPU_GPR(R28)(r4)
 +      PPC_STL r29, VCPU_GPR(R29)(r4)
 +      PPC_STL r30, VCPU_GPR(R30)(r4)
 +      PPC_STL r31, VCPU_GPR(R31)(r4)
  
        /* Load host non-volatile register state from host stack. */
        PPC_LL  r14, HOST_NV_GPR(r14)(r1)
@@@ -473,24 -478,24 +473,24 @@@ _GLOBAL(__kvmppc_vcpu_run
        PPC_STL r31, HOST_NV_GPR(r31)(r1)
  
        /* Load guest non-volatiles. */
 -      PPC_LL  r14, VCPU_GPR(r14)(r4)
 -      PPC_LL  r15, VCPU_GPR(r15)(r4)
 -      PPC_LL  r16, VCPU_GPR(r16)(r4)
 -      PPC_LL  r17, VCPU_GPR(r17)(r4)
 -      PPC_LL  r18, VCPU_GPR(r18)(r4)
 -      PPC_LL  r19, VCPU_GPR(r19)(r4)
 -      PPC_LL  r20, VCPU_GPR(r20)(r4)
 -      PPC_LL  r21, VCPU_GPR(r21)(r4)
 -      PPC_LL  r22, VCPU_GPR(r22)(r4)
 -      PPC_LL  r23, VCPU_GPR(r23)(r4)
 -      PPC_LL  r24, VCPU_GPR(r24)(r4)
 -      PPC_LL  r25, VCPU_GPR(r25)(r4)
 -      PPC_LL  r26, VCPU_GPR(r26)(r4)
 -      PPC_LL  r27, VCPU_GPR(r27)(r4)
 -      PPC_LL  r28, VCPU_GPR(r28)(r4)
 -      PPC_LL  r29, VCPU_GPR(r29)(r4)
 -      PPC_LL  r30, VCPU_GPR(r30)(r4)
 -      PPC_LL  r31, VCPU_GPR(r31)(r4)
 +      PPC_LL  r14, VCPU_GPR(R14)(r4)
 +      PPC_LL  r15, VCPU_GPR(R15)(r4)
 +      PPC_LL  r16, VCPU_GPR(R16)(r4)
 +      PPC_LL  r17, VCPU_GPR(R17)(r4)
 +      PPC_LL  r18, VCPU_GPR(R18)(r4)
 +      PPC_LL  r19, VCPU_GPR(R19)(r4)
 +      PPC_LL  r20, VCPU_GPR(R20)(r4)
 +      PPC_LL  r21, VCPU_GPR(R21)(r4)
 +      PPC_LL  r22, VCPU_GPR(R22)(r4)
 +      PPC_LL  r23, VCPU_GPR(R23)(r4)
 +      PPC_LL  r24, VCPU_GPR(R24)(r4)
 +      PPC_LL  r25, VCPU_GPR(R25)(r4)
 +      PPC_LL  r26, VCPU_GPR(R26)(r4)
 +      PPC_LL  r27, VCPU_GPR(R27)(r4)
 +      PPC_LL  r28, VCPU_GPR(R28)(r4)
 +      PPC_LL  r29, VCPU_GPR(R29)(r4)
 +      PPC_LL  r30, VCPU_GPR(R30)(r4)
 +      PPC_LL  r31, VCPU_GPR(R31)(r4)
  
  
  lightweight_exit:
        lwz     r7, VCPU_CR(r4)
        PPC_LL  r8, VCPU_PC(r4)
        PPC_LD(r9, VCPU_SHARED_MSR, r11)
 -      PPC_LL  r0, VCPU_GPR(r0)(r4)
 -      PPC_LL  r1, VCPU_GPR(r1)(r4)
 -      PPC_LL  r2, VCPU_GPR(r2)(r4)
 -      PPC_LL  r10, VCPU_GPR(r10)(r4)
 -      PPC_LL  r11, VCPU_GPR(r11)(r4)
 -      PPC_LL  r12, VCPU_GPR(r12)(r4)
 -      PPC_LL  r13, VCPU_GPR(r13)(r4)
 +      PPC_LL  r0, VCPU_GPR(R0)(r4)
 +      PPC_LL  r1, VCPU_GPR(R1)(r4)
 +      PPC_LL  r2, VCPU_GPR(R2)(r4)
 +      PPC_LL  r10, VCPU_GPR(R10)(r4)
 +      PPC_LL  r11, VCPU_GPR(R11)(r4)
 +      PPC_LL  r12, VCPU_GPR(R12)(r4)
 +      PPC_LL  r13, VCPU_GPR(R13)(r4)
        mtlr    r3
        mtxer   r5
        mtctr   r6
        mtcr    r7
  
        /* Finish loading guest volatiles and jump to guest. */
 -      PPC_LL  r5, VCPU_GPR(r5)(r4)
 -      PPC_LL  r6, VCPU_GPR(r6)(r4)
 -      PPC_LL  r7, VCPU_GPR(r7)(r4)
 -      PPC_LL  r8, VCPU_GPR(r8)(r4)
 -      PPC_LL  r9, VCPU_GPR(r9)(r4)
 -
 -      PPC_LL  r3, VCPU_GPR(r3)(r4)
 -      PPC_LL  r4, VCPU_GPR(r4)(r4)
 +      PPC_LL  r5, VCPU_GPR(R5)(r4)
 +      PPC_LL  r6, VCPU_GPR(R6)(r4)
 +      PPC_LL  r7, VCPU_GPR(R7)(r4)
 +      PPC_LL  r8, VCPU_GPR(R8)(r4)
 +      PPC_LL  r9, VCPU_GPR(R9)(r4)
 +
 +      PPC_LL  r3, VCPU_GPR(R3)(r4)
 +      PPC_LL  r4, VCPU_GPR(R4)(r4)
        rfi
index 8685d1fb8b75104b6fbb761247f26b543a65a7e6,173f07aaeb2b3cd2a2ea0e48e9c85e7048aa7d2f..e62a555557ee459df20a4b370bce690a75158820
@@@ -1,4 -1,6 +1,4 @@@
  /*
 - *  include/asm-s390/sclp.h
 - *
   *    Copyright IBM Corp. 2007
   *    Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>
   */
@@@ -53,5 -55,7 +53,7 @@@ int sclp_chp_configure(struct chp_id ch
  int sclp_chp_deconfigure(struct chp_id chpid);
  int sclp_chp_read_info(struct sclp_chp_info *info);
  void sclp_get_ipl_info(struct sclp_ipl_info *info);
+ bool sclp_has_linemode(void);
+ bool sclp_has_vt220(void);
  
  #endif /* _ASM_S390_SCLP_H */
diff --combined arch/s390/kernel/setup.c
index 34d75b50526c471380744c1cf99718c6130e6132,e86bca6f975c51f9ef2c2512c4535a2a36272bc3..743c0f32fe3beb0c508a02e81bf775f075242d08
@@@ -1,6 -1,8 +1,6 @@@
  /*
 - *  arch/s390/kernel/setup.c
 - *
   *  S390 version
 - *    Copyright (C) IBM Corp. 1999,2012
 + *    Copyright IBM Corp. 1999, 2012
   *    Author(s): Hartmut Penner (hp@de.ibm.com),
   *               Martin Schwidefsky (schwidefsky@de.ibm.com)
   *
@@@ -61,6 -63,7 +61,7 @@@
  #include <asm/kvm_virtio.h>
  #include <asm/diag.h>
  #include <asm/os_info.h>
+ #include <asm/sclp.h>
  #include "entry.h"
  
  long psw_kernel_bits  = PSW_DEFAULT_KEY | PSW_MASK_BASE | PSW_ASC_PRIMARY |
@@@ -136,9 -139,14 +137,14 @@@ __setup("condev=", condev_setup)
  
  static void __init set_preferred_console(void)
  {
-       if (MACHINE_IS_KVM)
-               add_preferred_console("hvc", 0, NULL);
-       else if (CONSOLE_IS_3215 || CONSOLE_IS_SCLP)
+       if (MACHINE_IS_KVM) {
+               if (sclp_has_vt220())
+                       add_preferred_console("ttyS", 1, NULL);
+               else if (sclp_has_linemode())
+                       add_preferred_console("ttyS", 0, NULL);
+               else
+                       add_preferred_console("hvc", 0, NULL);
+       } else if (CONSOLE_IS_3215 || CONSOLE_IS_SCLP)
                add_preferred_console("ttyS", 0, NULL);
        else if (CONSOLE_IS_3270)
                add_preferred_console("tty3270", 0, NULL);
@@@ -428,11 -436,10 +434,11 @@@ static void __init setup_lowcore(void
        lc->restart_source = -1UL;
  
        /* Setup absolute zero lowcore */
 -      memcpy_absolute(&S390_lowcore.restart_stack, &lc->restart_stack,
 -                      4 * sizeof(unsigned long));
 -      memcpy_absolute(&S390_lowcore.restart_psw, &lc->restart_psw,
 -                      sizeof(lc->restart_psw));
 +      mem_assign_absolute(S390_lowcore.restart_stack, lc->restart_stack);
 +      mem_assign_absolute(S390_lowcore.restart_fn, lc->restart_fn);
 +      mem_assign_absolute(S390_lowcore.restart_data, lc->restart_data);
 +      mem_assign_absolute(S390_lowcore.restart_source, lc->restart_source);
 +      mem_assign_absolute(S390_lowcore.restart_psw, lc->restart_psw);
  
        set_prefix((u32)(unsigned long) lc);
        lowcore_ptr[0] = lc;
@@@ -597,7 -604,9 +603,7 @@@ static void __init setup_memory_end(voi
  static void __init setup_vmcoreinfo(void)
  {
  #ifdef CONFIG_KEXEC
 -      unsigned long ptr = paddr_vmcoreinfo_note();
 -
 -      memcpy_absolute(&S390_lowcore.vmcore_info, &ptr, sizeof(ptr));
 +      mem_assign_absolute(S390_lowcore.vmcore_info, paddr_vmcoreinfo_note());
  #endif
  }
  
diff --combined arch/s390/kvm/kvm-s390.c
index c552d1f4103f772561ee3e5fac5a35c90cc7520a,ace93603d86100f5d1e04cc39cd4e5fd87d0bebd..d470ccbfabae02e015e206f833a93ec0820941fa
@@@ -1,7 -1,7 +1,7 @@@
  /*
 - * s390host.c --  hosting zSeries kernel virtual machines
 + * hosting zSeries kernel virtual machines
   *
 - * Copyright IBM Corp. 2008,2009
 + * Copyright IBM Corp. 2008, 2009
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License (version 2 only)
@@@ -347,6 -347,7 +347,7 @@@ static void kvm_s390_vcpu_initial_reset
        vcpu->arch.guest_fpregs.fpc = 0;
        asm volatile("lfpc %0" : : "Q" (vcpu->arch.guest_fpregs.fpc));
        vcpu->arch.sie_block->gbea = 1;
+       atomic_set_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags);
  }
  
  int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
diff --combined arch/s390/kvm/sigp.c
index 1ab2ce1611c5e46e71d12d25671f39a7b2f9aa78,6ed8175ca7e76a52d6b576294dc7da53be011604..56f80e1f98f7b1955e23d07bb80497ac3b33dca7
@@@ -1,7 -1,7 +1,7 @@@
  /*
 - * sigp.c - handlinge interprocessor communication
 + * handling interprocessor communication
   *
 - * Copyright IBM Corp. 2008,2009
 + * Copyright IBM Corp. 2008, 2009
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License (version 2 only)
@@@ -26,19 -26,23 +26,23 @@@ static int __sigp_sense(struct kvm_vcp
        int rc;
  
        if (cpu_addr >= KVM_MAX_VCPUS)
-               return 3; /* not operational */
+               return SIGP_CC_NOT_OPERATIONAL;
  
        spin_lock(&fi->lock);
        if (fi->local_int[cpu_addr] == NULL)
-               rc = 3; /* not operational */
+               rc = SIGP_CC_NOT_OPERATIONAL;
        else if (!(atomic_read(fi->local_int[cpu_addr]->cpuflags)
-                 & CPUSTAT_STOPPED)) {
-               *reg &= 0xffffffff00000000UL;
-               rc = 1; /* status stored */
-       } else {
+                  & (CPUSTAT_ECALL_PEND | CPUSTAT_STOPPED)))
+               rc = SIGP_CC_ORDER_CODE_ACCEPTED;
+       else {
                *reg &= 0xffffffff00000000UL;
-               *reg |= SIGP_STATUS_STOPPED;
-               rc = 1; /* status stored */
+               if (atomic_read(fi->local_int[cpu_addr]->cpuflags)
+                   & CPUSTAT_ECALL_PEND)
+                       *reg |= SIGP_STATUS_EXT_CALL_PENDING;
+               if (atomic_read(fi->local_int[cpu_addr]->cpuflags)
+                   & CPUSTAT_STOPPED)
+                       *reg |= SIGP_STATUS_STOPPED;
+               rc = SIGP_CC_STATUS_STORED;
        }
        spin_unlock(&fi->lock);
  
@@@ -54,7 -58,7 +58,7 @@@ static int __sigp_emergency(struct kvm_
        int rc;
  
        if (cpu_addr >= KVM_MAX_VCPUS)
-               return 3; /* not operational */
+               return SIGP_CC_NOT_OPERATIONAL;
  
        inti = kzalloc(sizeof(*inti), GFP_KERNEL);
        if (!inti)
@@@ -66,7 -70,7 +70,7 @@@
        spin_lock(&fi->lock);
        li = fi->local_int[cpu_addr];
        if (li == NULL) {
-               rc = 3; /* not operational */
+               rc = SIGP_CC_NOT_OPERATIONAL;
                kfree(inti);
                goto unlock;
        }
@@@ -77,7 -81,7 +81,7 @@@
        if (waitqueue_active(&li->wq))
                wake_up_interruptible(&li->wq);
        spin_unlock_bh(&li->lock);
-       rc = 0; /* order accepted */
+       rc = SIGP_CC_ORDER_CODE_ACCEPTED;
        VCPU_EVENT(vcpu, 4, "sent sigp emerg to cpu %x", cpu_addr);
  unlock:
        spin_unlock(&fi->lock);
@@@ -92,7 -96,7 +96,7 @@@ static int __sigp_external_call(struct 
        int rc;
  
        if (cpu_addr >= KVM_MAX_VCPUS)
-               return 3; /* not operational */
+               return SIGP_CC_NOT_OPERATIONAL;
  
        inti = kzalloc(sizeof(*inti), GFP_KERNEL);
        if (!inti)
        spin_lock(&fi->lock);
        li = fi->local_int[cpu_addr];
        if (li == NULL) {
-               rc = 3; /* not operational */
+               rc = SIGP_CC_NOT_OPERATIONAL;
                kfree(inti);
                goto unlock;
        }
        if (waitqueue_active(&li->wq))
                wake_up_interruptible(&li->wq);
        spin_unlock_bh(&li->lock);
-       rc = 0; /* order accepted */
+       rc = SIGP_CC_ORDER_CODE_ACCEPTED;
        VCPU_EVENT(vcpu, 4, "sent sigp ext call to cpu %x", cpu_addr);
  unlock:
        spin_unlock(&fi->lock);
@@@ -143,7 -147,7 +147,7 @@@ static int __inject_sigp_stop(struct kv
  out:
        spin_unlock_bh(&li->lock);
  
-       return 0; /* order accepted */
+       return SIGP_CC_ORDER_CODE_ACCEPTED;
  }
  
  static int __sigp_stop(struct kvm_vcpu *vcpu, u16 cpu_addr, int action)
        int rc;
  
        if (cpu_addr >= KVM_MAX_VCPUS)
-               return 3; /* not operational */
+               return SIGP_CC_NOT_OPERATIONAL;
  
        spin_lock(&fi->lock);
        li = fi->local_int[cpu_addr];
        if (li == NULL) {
-               rc = 3; /* not operational */
+               rc = SIGP_CC_NOT_OPERATIONAL;
                goto unlock;
        }
  
@@@ -182,11 -186,11 +186,11 @@@ static int __sigp_set_arch(struct kvm_v
  
        switch (parameter & 0xff) {
        case 0:
-               rc = 3; /* not operational */
+               rc = SIGP_CC_NOT_OPERATIONAL;
                break;
        case 1:
        case 2:
-               rc = 0; /* order accepted */
+               rc = SIGP_CC_ORDER_CODE_ACCEPTED;
                break;
        default:
                rc = -EOPNOTSUPP;
@@@ -207,21 -211,23 +211,23 @@@ static int __sigp_set_prefix(struct kvm
        address = address & 0x7fffe000u;
        if (copy_from_guest_absolute(vcpu, &tmp, address, 1) ||
           copy_from_guest_absolute(vcpu, &tmp, address + PAGE_SIZE, 1)) {
+               *reg &= 0xffffffff00000000UL;
                *reg |= SIGP_STATUS_INVALID_PARAMETER;
-               return 1; /* invalid parameter */
+               return SIGP_CC_STATUS_STORED;
        }
  
        inti = kzalloc(sizeof(*inti), GFP_KERNEL);
        if (!inti)
-               return 2; /* busy */
+               return SIGP_CC_BUSY;
  
        spin_lock(&fi->lock);
        if (cpu_addr < KVM_MAX_VCPUS)
                li = fi->local_int[cpu_addr];
  
        if (li == NULL) {
-               rc = 1; /* incorrect state */
-               *reg &= SIGP_STATUS_INCORRECT_STATE;
+               *reg &= 0xffffffff00000000UL;
+               *reg |= SIGP_STATUS_INCORRECT_STATE;
+               rc = SIGP_CC_STATUS_STORED;
                kfree(inti);
                goto out_fi;
        }
        spin_lock_bh(&li->lock);
        /* cpu must be in stopped state */
        if (!(atomic_read(li->cpuflags) & CPUSTAT_STOPPED)) {
-               rc = 1; /* incorrect state */
-               *reg &= SIGP_STATUS_INCORRECT_STATE;
+               *reg &= 0xffffffff00000000UL;
+               *reg |= SIGP_STATUS_INCORRECT_STATE;
+               rc = SIGP_CC_STATUS_STORED;
                kfree(inti);
                goto out_li;
        }
        atomic_set(&li->active, 1);
        if (waitqueue_active(&li->wq))
                wake_up_interruptible(&li->wq);
-       rc = 0; /* order accepted */
+       rc = SIGP_CC_ORDER_CODE_ACCEPTED;
  
        VCPU_EVENT(vcpu, 4, "set prefix of cpu %02x to %x", cpu_addr, address);
  out_li:
@@@ -259,21 -266,21 +266,21 @@@ static int __sigp_sense_running(struct 
        struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int;
  
        if (cpu_addr >= KVM_MAX_VCPUS)
-               return 3; /* not operational */
+               return SIGP_CC_NOT_OPERATIONAL;
  
        spin_lock(&fi->lock);
        if (fi->local_int[cpu_addr] == NULL)
-               rc = 3; /* not operational */
+               rc = SIGP_CC_NOT_OPERATIONAL;
        else {
                if (atomic_read(fi->local_int[cpu_addr]->cpuflags)
                    & CPUSTAT_RUNNING) {
                        /* running */
-                       rc = 1;
+                       rc = SIGP_CC_ORDER_CODE_ACCEPTED;
                } else {
                        /* not running */
                        *reg &= 0xffffffff00000000UL;
                        *reg |= SIGP_STATUS_NOT_RUNNING;
-                       rc = 0;
+                       rc = SIGP_CC_STATUS_STORED;
                }
        }
        spin_unlock(&fi->lock);
  
  static int __sigp_restart(struct kvm_vcpu *vcpu, u16 cpu_addr)
  {
-       int rc = 0;
        struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int;
        struct kvm_s390_local_interrupt *li;
+       int rc = SIGP_CC_ORDER_CODE_ACCEPTED;
  
        if (cpu_addr >= KVM_MAX_VCPUS)
-               return 3; /* not operational */
+               return SIGP_CC_NOT_OPERATIONAL;
  
        spin_lock(&fi->lock);
        li = fi->local_int[cpu_addr];
        if (li == NULL) {
-               rc = 3; /* not operational */
+               rc = SIGP_CC_NOT_OPERATIONAL;
                goto out;
        }
  
        spin_lock_bh(&li->lock);
        if (li->action_bits & ACTION_STOP_ON_STOP)
-               rc = 2; /* busy */
+               rc = SIGP_CC_BUSY;
        else
                VCPU_EVENT(vcpu, 4, "sigp restart %x to handle userspace",
                        cpu_addr);
@@@ -377,7 -384,7 +384,7 @@@ int kvm_s390_handle_sigp(struct kvm_vcp
        case SIGP_RESTART:
                vcpu->stat.instruction_sigp_restart++;
                rc = __sigp_restart(vcpu, cpu_addr);
-               if (rc == 2) /* busy */
+               if (rc == SIGP_CC_BUSY)
                        break;
                /* user space must know about restart */
        default:
index 88093c1d44fd4c99064315eff9f169a8ef33235a,839b8f58a272ef74f190a994395ffc517937ab05..3ea51a84a0e447a1644851500c3470cfd99a46c2
@@@ -306,8 -306,7 +306,8 @@@ struct apic 
        unsigned long (*check_apicid_used)(physid_mask_t *map, int apicid);
        unsigned long (*check_apicid_present)(int apicid);
  
 -      void (*vector_allocation_domain)(int cpu, struct cpumask *retmask);
 +      void (*vector_allocation_domain)(int cpu, struct cpumask *retmask,
 +                                       const struct cpumask *mask);
        void (*init_apic_ldr)(void);
  
        void (*ioapic_phys_id_map)(physid_mask_t *phys_map, physid_mask_t *retmap);
        unsigned long (*set_apic_id)(unsigned int id);
        unsigned long apic_id_mask;
  
 -      unsigned int (*cpu_mask_to_apicid)(const struct cpumask *cpumask);
 -      unsigned int (*cpu_mask_to_apicid_and)(const struct cpumask *cpumask,
 -                                             const struct cpumask *andmask);
 +      int (*cpu_mask_to_apicid_and)(const struct cpumask *cpumask,
 +                                    const struct cpumask *andmask,
 +                                    unsigned int *apicid);
  
        /* ipi */
        void (*send_IPI_mask)(const struct cpumask *mask, int vector);
@@@ -465,6 -464,8 +465,8 @@@ static inline u32 safe_apic_wait_icr_id
        return apic->safe_wait_icr_idle();
  }
  
+ extern void __init apic_set_eoi_write(void (*eoi_write)(u32 reg, u32 v));
  #else /* CONFIG_X86_LOCAL_APIC */
  
  static inline u32 apic_read(u32 reg) { return 0; }
@@@ -474,6 -475,7 +476,7 @@@ static inline u64 apic_icr_read(void) 
  static inline void apic_icr_write(u32 low, u32 high) { }
  static inline void apic_wait_icr_idle(void) { }
  static inline u32 safe_apic_wait_icr_idle(void) { return 0; }
+ static inline void apic_set_eoi_write(void (*eoi_write)(u32 reg, u32 v)) {}
  
  #endif /* CONFIG_X86_LOCAL_APIC */
  
@@@ -538,11 -540,6 +541,11 @@@ static inline const struct cpumask *def
  #endif
  }
  
 +static inline const struct cpumask *online_target_cpus(void)
 +{
 +      return cpu_online_mask;
 +}
 +
  DECLARE_EARLY_PER_CPU(u16, x86_bios_cpu_apicid);
  
  
@@@ -592,50 -589,21 +595,50 @@@ static inline int default_phys_pkg_id(i
  
  #endif
  
 -static inline unsigned int
 -default_cpu_mask_to_apicid(const struct cpumask *cpumask)
 +static inline int
 +flat_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
 +                          const struct cpumask *andmask,
 +                          unsigned int *apicid)
  {
 -      return cpumask_bits(cpumask)[0] & APIC_ALL_CPUS;
 +      unsigned long cpu_mask = cpumask_bits(cpumask)[0] &
 +                               cpumask_bits(andmask)[0] &
 +                               cpumask_bits(cpu_online_mask)[0] &
 +                               APIC_ALL_CPUS;
 +
 +      if (likely(cpu_mask)) {
 +              *apicid = (unsigned int)cpu_mask;
 +              return 0;
 +      } else {
 +              return -EINVAL;
 +      }
  }
  
 -static inline unsigned int
 +extern int
  default_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
 -                             const struct cpumask *andmask)
 +                             const struct cpumask *andmask,
 +                             unsigned int *apicid);
 +
 +static inline void
 +flat_vector_allocation_domain(int cpu, struct cpumask *retmask,
 +                            const struct cpumask *mask)
  {
 -      unsigned long mask1 = cpumask_bits(cpumask)[0];
 -      unsigned long mask2 = cpumask_bits(andmask)[0];
 -      unsigned long mask3 = cpumask_bits(cpu_online_mask)[0];
 +      /* Careful. Some cpus do not strictly honor the set of cpus
 +       * specified in the interrupt destination when using lowest
 +       * priority interrupt delivery mode.
 +       *
 +       * In particular there was a hyperthreading cpu observed to
 +       * deliver interrupts to the wrong hyperthread when only one
 +       * hyperthread was specified in the interrupt desitination.
 +       */
 +      cpumask_clear(retmask);
 +      cpumask_bits(retmask)[0] = APIC_ALL_CPUS;
 +}
  
 -      return (unsigned int)(mask1 & mask2 & mask3);
 +static inline void
 +default_vector_allocation_domain(int cpu, struct cpumask *retmask,
 +                               const struct cpumask *mask)
 +{
 +      cpumask_copy(retmask, cpumask_of(cpu));
  }
  
  static inline unsigned long default_check_apicid_used(physid_mask_t *map, int apicid)
index 2da88c0cda1446f9e18a5ded4a64013e2a60dcbf,2c75b400e40ced970013c99694f6eaff5260c51d..09155d64cf7e6a560e3c6a1501e568918d9f2ed9
  
  #define CR3_PAE_RESERVED_BITS ((X86_CR3_PWT | X86_CR3_PCD) - 1)
  #define CR3_NONPAE_RESERVED_BITS ((PAGE_SIZE-1) & ~(X86_CR3_PWT | X86_CR3_PCD))
+ #define CR3_PCID_ENABLED_RESERVED_BITS 0xFFFFFF0000000000ULL
  #define CR3_L_MODE_RESERVED_BITS (CR3_NONPAE_RESERVED_BITS |  \
                                  0xFFFFFF0000000000ULL)
  #define CR4_RESERVED_BITS                                               \
        (~(unsigned long)(X86_CR4_VME | X86_CR4_PVI | X86_CR4_TSD | X86_CR4_DE\
                          | X86_CR4_PSE | X86_CR4_PAE | X86_CR4_MCE     \
-                         | X86_CR4_PGE | X86_CR4_PCE | X86_CR4_OSFXSR  \
+                         | X86_CR4_PGE | X86_CR4_PCE | X86_CR4_OSFXSR | X86_CR4_PCIDE \
                          | X86_CR4_OSXSAVE | X86_CR4_SMEP | X86_CR4_RDWRGSFS \
                          | X86_CR4_OSXMMEXCPT | X86_CR4_VMXE))
  
@@@ -175,6 -176,13 +176,13 @@@ enum 
  
  /* apic attention bits */
  #define KVM_APIC_CHECK_VAPIC  0
+ /*
+  * The following bit is set with PV-EOI, unset on EOI.
+  * We detect PV-EOI changes by guest by comparing
+  * this bit with PV-EOI in guest memory.
+  * See the implementation in apic_update_pv_eoi.
+  */
+ #define KVM_APIC_PV_EOI_PENDING       1
  
  /*
   * We don't want allocation failures within the mmu code, so we preallocate
@@@ -313,8 -321,8 +321,8 @@@ struct kvm_pmu 
        u64 counter_bitmask[2];
        u64 global_ctrl_mask;
        u8 version;
 -      struct kvm_pmc gp_counters[X86_PMC_MAX_GENERIC];
 -      struct kvm_pmc fixed_counters[X86_PMC_MAX_FIXED];
 +      struct kvm_pmc gp_counters[INTEL_PMC_MAX_GENERIC];
 +      struct kvm_pmc fixed_counters[INTEL_PMC_MAX_FIXED];
        struct irq_work irq_work;
        u64 reprogram_pmi;
  };
@@@ -484,6 -492,11 +492,11 @@@ struct kvm_vcpu_arch 
                u64 length;
                u64 status;
        } osvw;
+       struct {
+               u64 msr_val;
+               struct gfn_to_hva_cache data;
+       } pv_eoi;
  };
  
  struct kvm_lpage_info {
@@@ -661,6 -674,7 +674,7 @@@ struct kvm_x86_ops 
        u64 (*get_mt_mask)(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio);
        int (*get_lpage_level)(void);
        bool (*rdtscp_supported)(void);
+       bool (*invpcid_supported)(void);
        void (*adjust_tsc_offset)(struct kvm_vcpu *vcpu, s64 adjustment, bool host);
  
        void (*set_tdp_cr3)(struct kvm_vcpu *vcpu, unsigned long cr3);
@@@ -802,7 -816,20 +816,20 @@@ int kvm_read_guest_page_mmu(struct kvm_
  void kvm_propagate_fault(struct kvm_vcpu *vcpu, struct x86_exception *fault);
  bool kvm_require_cpl(struct kvm_vcpu *vcpu, int required_cpl);
  
- int kvm_pic_set_irq(void *opaque, int irq, int level);
+ static inline int __kvm_irq_line_state(unsigned long *irq_state,
+                                      int irq_source_id, int level)
+ {
+       /* Logical OR for level trig interrupt */
+       if (level)
+               __set_bit(irq_source_id, irq_state);
+       else
+               __clear_bit(irq_source_id, irq_state);
+       return !!(*irq_state);
+ }
+ int kvm_pic_set_irq(struct kvm_pic *pic, int irq, int irq_source_id, int level);
+ void kvm_pic_clear_all(struct kvm_pic *pic, int irq_source_id);
  
  void kvm_inject_nmi(struct kvm_vcpu *vcpu);
  
index c421512ca5eb33ceb79de6ce3b4284a96356ede4,c7520b6184efbbe3f09d60cfa95e552d1969da43..98e24131ff3a831fce89d957fe8b3cb9740264dd
@@@ -2123,25 -2123,23 +2123,42 @@@ void default_init_apic_ldr(void
        apic_write(APIC_LDR, val);
  }
  
 +int default_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
 +                                 const struct cpumask *andmask,
 +                                 unsigned int *apicid)
 +{
 +      unsigned int cpu;
 +
 +      for_each_cpu_and(cpu, cpumask, andmask) {
 +              if (cpumask_test_cpu(cpu, cpu_online_mask))
 +                      break;
 +      }
 +
 +      if (likely(cpu < nr_cpu_ids)) {
 +              *apicid = per_cpu(x86_cpu_to_apicid, cpu);
 +              return 0;
 +      }
 +
 +      return -EINVAL;
 +}
 +
+ /*
+  * Override the generic EOI implementation with an optimized version.
+  * Only called during early boot when only one CPU is active and with
+  * interrupts disabled, so we know this does not race with actual APIC driver
+  * use.
+  */
+ void __init apic_set_eoi_write(void (*eoi_write)(u32 reg, u32 v))
+ {
+       struct apic **drv;
+       for (drv = __apicdrivers; drv < __apicdrivers_end; drv++) {
+               /* Should happen once for each apic */
+               WARN_ON((*drv)->eoi_write == eoi_write);
+               (*drv)->eoi_write = eoi_write;
+       }
+ }
  /*
   * Power management
   */
diff --combined arch/x86/kvm/mmu.c
index 57e168e27b5b865e187d5ee3d34413189a1c5905,28c8fbcc6763957a13d8eee288698ca213874ae7..01ca00423938515cfe43781403e90bfb84929fc3
@@@ -90,7 -90,7 +90,7 @@@ module_param(dbg, bool, 0644)
  
  #define PTE_PREFETCH_NUM              8
  
- #define PT_FIRST_AVAIL_BITS_SHIFT 9
+ #define PT_FIRST_AVAIL_BITS_SHIFT 10
  #define PT64_SECOND_AVAIL_BITS_SHIFT 52
  
  #define PT64_LEVEL_BITS 9
  #define CREATE_TRACE_POINTS
  #include "mmutrace.h"
  
- #define SPTE_HOST_WRITEABLE (1ULL << PT_FIRST_AVAIL_BITS_SHIFT)
+ #define SPTE_HOST_WRITEABLE   (1ULL << PT_FIRST_AVAIL_BITS_SHIFT)
+ #define SPTE_MMU_WRITEABLE    (1ULL << (PT_FIRST_AVAIL_BITS_SHIFT + 1))
  
  #define SHADOW_PT_INDEX(addr, level) PT64_INDEX(addr, level)
  
@@@ -188,6 -189,7 +189,7 @@@ static u64 __read_mostly shadow_dirty_m
  static u64 __read_mostly shadow_mmio_mask;
  
  static void mmu_spte_set(u64 *sptep, u64 spte);
+ static void mmu_free_roots(struct kvm_vcpu *vcpu);
  
  void kvm_mmu_set_mmio_spte_mask(u64 mmio_mask)
  {
@@@ -444,8 -446,22 +446,22 @@@ static bool __check_direct_spte_mmio_pf
  }
  #endif
  
+ static bool spte_is_locklessly_modifiable(u64 spte)
+ {
+       return !(~spte & (SPTE_HOST_WRITEABLE | SPTE_MMU_WRITEABLE));
+ }
  static bool spte_has_volatile_bits(u64 spte)
  {
+       /*
+        * Always atomicly update spte if it can be updated
+        * out of mmu-lock, it can ensure dirty bit is not lost,
+        * also, it can help us to get a stable is_writable_pte()
+        * to ensure tlb flush is not missed.
+        */
+       if (spte_is_locklessly_modifiable(spte))
+               return true;
        if (!shadow_accessed_mask)
                return false;
  
@@@ -478,34 -494,47 +494,47 @@@ static void mmu_spte_set(u64 *sptep, u6
  
  /* Rules for using mmu_spte_update:
   * Update the state bits, it means the mapped pfn is not changged.
+  *
+  * Whenever we overwrite a writable spte with a read-only one we
+  * should flush remote TLBs. Otherwise rmap_write_protect
+  * will find a read-only spte, even though the writable spte
+  * might be cached on a CPU's TLB, the return value indicates this
+  * case.
   */
- static void mmu_spte_update(u64 *sptep, u64 new_spte)
+ static bool mmu_spte_update(u64 *sptep, u64 new_spte)
  {
-       u64 mask, old_spte = *sptep;
+       u64 old_spte = *sptep;
+       bool ret = false;
  
        WARN_ON(!is_rmap_spte(new_spte));
  
-       if (!is_shadow_present_pte(old_spte))
-               return mmu_spte_set(sptep, new_spte);
-       new_spte |= old_spte & shadow_dirty_mask;
-       mask = shadow_accessed_mask;
-       if (is_writable_pte(old_spte))
-               mask |= shadow_dirty_mask;
+       if (!is_shadow_present_pte(old_spte)) {
+               mmu_spte_set(sptep, new_spte);
+               return ret;
+       }
  
-       if (!spte_has_volatile_bits(old_spte) || (new_spte & mask) == mask)
+       if (!spte_has_volatile_bits(old_spte))
                __update_clear_spte_fast(sptep, new_spte);
        else
                old_spte = __update_clear_spte_slow(sptep, new_spte);
  
+       /*
+        * For the spte updated out of mmu-lock is safe, since
+        * we always atomicly update it, see the comments in
+        * spte_has_volatile_bits().
+        */
+       if (is_writable_pte(old_spte) && !is_writable_pte(new_spte))
+               ret = true;
        if (!shadow_accessed_mask)
-               return;
+               return ret;
  
        if (spte_is_bit_cleared(old_spte, new_spte, shadow_accessed_mask))
                kvm_set_pfn_accessed(spte_to_pfn(old_spte));
        if (spte_is_bit_cleared(old_spte, new_spte, shadow_dirty_mask))
                kvm_set_pfn_dirty(spte_to_pfn(old_spte));
+       return ret;
  }
  
  /*
@@@ -652,8 -681,7 +681,7 @@@ static void mmu_free_memory_caches(stru
                                mmu_page_header_cache);
  }
  
- static void *mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc,
-                                   size_t size)
+ static void *mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc)
  {
        void *p;
  
  
  static struct pte_list_desc *mmu_alloc_pte_list_desc(struct kvm_vcpu *vcpu)
  {
-       return mmu_memory_cache_alloc(&vcpu->arch.mmu_pte_list_desc_cache,
-                                     sizeof(struct pte_list_desc));
+       return mmu_memory_cache_alloc(&vcpu->arch.mmu_pte_list_desc_cache);
  }
  
  static void mmu_free_pte_list_desc(struct pte_list_desc *pte_list_desc)
@@@ -1051,35 -1078,82 +1078,82 @@@ static void drop_spte(struct kvm *kvm, 
                rmap_remove(kvm, sptep);
  }
  
- static int __rmap_write_protect(struct kvm *kvm, unsigned long *rmapp, int level)
+ static bool __drop_large_spte(struct kvm *kvm, u64 *sptep)
+ {
+       if (is_large_pte(*sptep)) {
+               WARN_ON(page_header(__pa(sptep))->role.level ==
+                       PT_PAGE_TABLE_LEVEL);
+               drop_spte(kvm, sptep);
+               --kvm->stat.lpages;
+               return true;
+       }
+       return false;
+ }
+ static void drop_large_spte(struct kvm_vcpu *vcpu, u64 *sptep)
+ {
+       if (__drop_large_spte(vcpu->kvm, sptep))
+               kvm_flush_remote_tlbs(vcpu->kvm);
+ }
+ /*
+  * Write-protect on the specified @sptep, @pt_protect indicates whether
+  * spte writ-protection is caused by protecting shadow page table.
+  * @flush indicates whether tlb need be flushed.
+  *
+  * Note: write protection is difference between drity logging and spte
+  * protection:
+  * - for dirty logging, the spte can be set to writable at anytime if
+  *   its dirty bitmap is properly set.
+  * - for spte protection, the spte can be writable only after unsync-ing
+  *   shadow page.
+  *
+  * Return true if the spte is dropped.
+  */
+ static bool
+ spte_write_protect(struct kvm *kvm, u64 *sptep, bool *flush, bool pt_protect)
+ {
+       u64 spte = *sptep;
+       if (!is_writable_pte(spte) &&
+             !(pt_protect && spte_is_locklessly_modifiable(spte)))
+               return false;
+       rmap_printk("rmap_write_protect: spte %p %llx\n", sptep, *sptep);
+       if (__drop_large_spte(kvm, sptep)) {
+               *flush |= true;
+               return true;
+       }
+       if (pt_protect)
+               spte &= ~SPTE_MMU_WRITEABLE;
+       spte = spte & ~PT_WRITABLE_MASK;
+       *flush |= mmu_spte_update(sptep, spte);
+       return false;
+ }
+ static bool __rmap_write_protect(struct kvm *kvm, unsigned long *rmapp,
+                                int level, bool pt_protect)
  {
        u64 *sptep;
        struct rmap_iterator iter;
-       int write_protected = 0;
+       bool flush = false;
  
        for (sptep = rmap_get_first(*rmapp, &iter); sptep;) {
                BUG_ON(!(*sptep & PT_PRESENT_MASK));
-               rmap_printk("rmap_write_protect: spte %p %llx\n", sptep, *sptep);
-               if (!is_writable_pte(*sptep)) {
-                       sptep = rmap_get_next(&iter);
-                       continue;
-               }
-               if (level == PT_PAGE_TABLE_LEVEL) {
-                       mmu_spte_update(sptep, *sptep & ~PT_WRITABLE_MASK);
-                       sptep = rmap_get_next(&iter);
-               } else {
-                       BUG_ON(!is_large_pte(*sptep));
-                       drop_spte(kvm, sptep);
-                       --kvm->stat.lpages;
+               if (spte_write_protect(kvm, sptep, &flush, pt_protect)) {
                        sptep = rmap_get_first(*rmapp, &iter);
+                       continue;
                }
  
-               write_protected = 1;
+               sptep = rmap_get_next(&iter);
        }
  
-       return write_protected;
+       return flush;
  }
  
  /**
@@@ -1100,26 -1174,26 +1174,26 @@@ void kvm_mmu_write_protect_pt_masked(st
  
        while (mask) {
                rmapp = &slot->rmap[gfn_offset + __ffs(mask)];
-               __rmap_write_protect(kvm, rmapp, PT_PAGE_TABLE_LEVEL);
+               __rmap_write_protect(kvm, rmapp, PT_PAGE_TABLE_LEVEL, false);
  
                /* clear the first set bit */
                mask &= mask - 1;
        }
  }
  
- static int rmap_write_protect(struct kvm *kvm, u64 gfn)
+ static bool rmap_write_protect(struct kvm *kvm, u64 gfn)
  {
        struct kvm_memory_slot *slot;
        unsigned long *rmapp;
        int i;
-       int write_protected = 0;
+       bool write_protected = false;
  
        slot = gfn_to_memslot(kvm, gfn);
  
        for (i = PT_PAGE_TABLE_LEVEL;
             i < PT_PAGE_TABLE_LEVEL + KVM_NR_PAGE_SIZES; ++i) {
                rmapp = __gfn_to_rmap(gfn, i, slot);
-               write_protected |= __rmap_write_protect(kvm, rmapp, i);
+               write_protected |= __rmap_write_protect(kvm, rmapp, i, true);
        }
  
        return write_protected;
@@@ -1238,11 -1312,12 +1312,12 @@@ static int kvm_age_rmapp(struct kvm *kv
                         unsigned long data)
  {
        u64 *sptep;
-       struct rmap_iterator iter;
+       struct rmap_iterator uninitialized_var(iter);
        int young = 0;
  
        /*
-        * Emulate the accessed bit for EPT, by checking if this page has
+        * In case of absence of EPT Access and Dirty Bits supports,
+        * emulate the accessed bit for EPT, by checking if this page has
         * an EPT mapping, and clearing it if it does. On the next access,
         * a new EPT mapping will be established.
         * This has some overhead, but not as much as the cost of swapping
  
        for (sptep = rmap_get_first(*rmapp, &iter); sptep;
             sptep = rmap_get_next(&iter)) {
-               BUG_ON(!(*sptep & PT_PRESENT_MASK));
+               BUG_ON(!is_shadow_present_pte(*sptep));
  
-               if (*sptep & PT_ACCESSED_MASK) {
+               if (*sptep & shadow_accessed_mask) {
                        young = 1;
-                       clear_bit(PT_ACCESSED_SHIFT, (unsigned long *)sptep);
+                       clear_bit((ffs(shadow_accessed_mask) - 1),
+                                (unsigned long *)sptep);
                }
        }
  
@@@ -1281,9 -1357,9 +1357,9 @@@ static int kvm_test_age_rmapp(struct kv
  
        for (sptep = rmap_get_first(*rmapp, &iter); sptep;
             sptep = rmap_get_next(&iter)) {
-               BUG_ON(!(*sptep & PT_PRESENT_MASK));
+               BUG_ON(!is_shadow_present_pte(*sptep));
  
-               if (*sptep & PT_ACCESSED_MASK) {
+               if (*sptep & shadow_accessed_mask) {
                        young = 1;
                        break;
                }
@@@ -1401,12 -1477,10 +1477,10 @@@ static struct kvm_mmu_page *kvm_mmu_all
                                               u64 *parent_pte, int direct)
  {
        struct kvm_mmu_page *sp;
-       sp = mmu_memory_cache_alloc(&vcpu->arch.mmu_page_header_cache,
-                                       sizeof *sp);
-       sp->spt = mmu_memory_cache_alloc(&vcpu->arch.mmu_page_cache, PAGE_SIZE);
+       sp = mmu_memory_cache_alloc(&vcpu->arch.mmu_page_header_cache);
+       sp->spt = mmu_memory_cache_alloc(&vcpu->arch.mmu_page_cache);
        if (!direct)
-               sp->gfns = mmu_memory_cache_alloc(&vcpu->arch.mmu_page_cache,
-                                                 PAGE_SIZE);
+               sp->gfns = mmu_memory_cache_alloc(&vcpu->arch.mmu_page_cache);
        set_page_private(virt_to_page(sp->spt), (unsigned long)sp);
        list_add(&sp->link, &vcpu->kvm->arch.active_mmu_pages);
        bitmap_zero(sp->slot_bitmap, KVM_MEM_SLOTS_NUM);
@@@ -1701,7 -1775,7 +1775,7 @@@ static void mmu_sync_children(struct kv
  
        kvm_mmu_pages_init(parent, &parents, &pages);
        while (mmu_unsync_walk(parent, &pages)) {
-               int protected = 0;
+               bool protected = false;
  
                for_each_sp(pages, sp, parents, i)
                        protected |= rmap_write_protect(vcpu->kvm, sp->gfn);
@@@ -1866,15 -1940,6 +1940,6 @@@ static void link_shadow_page(u64 *sptep
        mmu_spte_set(sptep, spte);
  }
  
- static void drop_large_spte(struct kvm_vcpu *vcpu, u64 *sptep)
- {
-       if (is_large_pte(*sptep)) {
-               drop_spte(vcpu->kvm, sptep);
-               --vcpu->kvm->stat.lpages;
-               kvm_flush_remote_tlbs(vcpu->kvm);
-       }
- }
  static void validate_direct_spte(struct kvm_vcpu *vcpu, u64 *sptep,
                                   unsigned direct_access)
  {
@@@ -2243,7 -2308,7 +2308,7 @@@ static int set_spte(struct kvm_vcpu *vc
                    gfn_t gfn, pfn_t pfn, bool speculative,
                    bool can_unsync, bool host_writable)
  {
-       u64 spte, entry = *sptep;
+       u64 spte;
        int ret = 0;
  
        if (set_mmio_spte(sptep, gfn, pfn, pte_access))
                spte |= shadow_x_mask;
        else
                spte |= shadow_nx_mask;
        if (pte_access & ACC_USER_MASK)
                spte |= shadow_user_mask;
        if (level > PT_PAGE_TABLE_LEVEL)
                spte |= PT_PAGE_SIZE_MASK;
        if (tdp_enabled)
                        goto done;
                }
  
-               spte |= PT_WRITABLE_MASK;
+               spte |= PT_WRITABLE_MASK | SPTE_MMU_WRITEABLE;
  
                if (!vcpu->arch.mmu.direct_map
                    && !(pte_access & ACC_WRITE_MASK)) {
                                 __func__, gfn);
                        ret = 1;
                        pte_access &= ~ACC_WRITE_MASK;
-                       if (is_writable_pte(spte))
-                               spte &= ~PT_WRITABLE_MASK;
+                       spte &= ~(PT_WRITABLE_MASK | SPTE_MMU_WRITEABLE);
                }
        }
  
                mark_page_dirty(vcpu->kvm, gfn);
  
  set_pte:
-       mmu_spte_update(sptep, spte);
-       /*
-        * If we overwrite a writable spte with a read-only one we
-        * should flush remote TLBs. Otherwise rmap_write_protect
-        * will find a read-only spte, even though the writable spte
-        * might be cached on a CPU's TLB.
-        */
-       if (is_writable_pte(entry) && !is_writable_pte(*sptep))
+       if (mmu_spte_update(sptep, spte))
                kvm_flush_remote_tlbs(vcpu->kvm);
  done:
        return ret;
@@@ -2403,6 -2462,7 +2462,7 @@@ static void mmu_set_spte(struct kvm_vcp
  
  static void nonpaging_new_cr3(struct kvm_vcpu *vcpu)
  {
+       mmu_free_roots(vcpu);
  }
  
  static pfn_t pte_prefetch_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn,
        return ret;
  }
  
+ static bool page_fault_can_be_fast(struct kvm_vcpu *vcpu, u32 error_code)
+ {
+       /*
+        * #PF can be fast only if the shadow page table is present and it
+        * is caused by write-protect, that means we just need change the
+        * W bit of the spte which can be done out of mmu-lock.
+        */
+       if (!(error_code & PFERR_PRESENT_MASK) ||
+             !(error_code & PFERR_WRITE_MASK))
+               return false;
+       return true;
+ }
+ static bool
+ fast_pf_fix_direct_spte(struct kvm_vcpu *vcpu, u64 *sptep, u64 spte)
+ {
+       struct kvm_mmu_page *sp = page_header(__pa(sptep));
+       gfn_t gfn;
+       WARN_ON(!sp->role.direct);
+       /*
+        * The gfn of direct spte is stable since it is calculated
+        * by sp->gfn.
+        */
+       gfn = kvm_mmu_page_get_gfn(sp, sptep - sp->spt);
+       if (cmpxchg64(sptep, spte, spte | PT_WRITABLE_MASK) == spte)
+               mark_page_dirty(vcpu->kvm, gfn);
+       return true;
+ }
+ /*
+  * Return value:
+  * - true: let the vcpu to access on the same address again.
+  * - false: let the real page fault path to fix it.
+  */
+ static bool fast_page_fault(struct kvm_vcpu *vcpu, gva_t gva, int level,
+                           u32 error_code)
+ {
+       struct kvm_shadow_walk_iterator iterator;
+       bool ret = false;
+       u64 spte = 0ull;
+       if (!page_fault_can_be_fast(vcpu, error_code))
+               return false;
+       walk_shadow_page_lockless_begin(vcpu);
+       for_each_shadow_entry_lockless(vcpu, gva, iterator, spte)
+               if (!is_shadow_present_pte(spte) || iterator.level < level)
+                       break;
+       /*
+        * If the mapping has been changed, let the vcpu fault on the
+        * same address again.
+        */
+       if (!is_rmap_spte(spte)) {
+               ret = true;
+               goto exit;
+       }
+       if (!is_last_spte(spte, level))
+               goto exit;
+       /*
+        * Check if it is a spurious fault caused by TLB lazily flushed.
+        *
+        * Need not check the access of upper level table entries since
+        * they are always ACC_ALL.
+        */
+        if (is_writable_pte(spte)) {
+               ret = true;
+               goto exit;
+       }
+       /*
+        * Currently, to simplify the code, only the spte write-protected
+        * by dirty-log can be fast fixed.
+        */
+       if (!spte_is_locklessly_modifiable(spte))
+               goto exit;
+       /*
+        * Currently, fast page fault only works for direct mapping since
+        * the gfn is not stable for indirect shadow page.
+        * See Documentation/virtual/kvm/locking.txt to get more detail.
+        */
+       ret = fast_pf_fix_direct_spte(vcpu, iterator.sptep, spte);
+ exit:
+       trace_fast_page_fault(vcpu, gva, error_code, iterator.sptep,
+                             spte, ret);
+       walk_shadow_page_lockless_end(vcpu);
+       return ret;
+ }
  static bool try_async_pf(struct kvm_vcpu *vcpu, bool prefault, gfn_t gfn,
                         gva_t gva, pfn_t *pfn, bool write, bool *writable);
  
- static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, int write, gfn_t gfn,
-                        bool prefault)
+ static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, u32 error_code,
+                        gfn_t gfn, bool prefault)
  {
        int r;
        int level;
        int force_pt_level;
        pfn_t pfn;
        unsigned long mmu_seq;
-       bool map_writable;
+       bool map_writable, write = error_code & PFERR_WRITE_MASK;
  
        force_pt_level = mapping_level_dirty_bitmap(vcpu, gfn);
        if (likely(!force_pt_level)) {
        } else
                level = PT_PAGE_TABLE_LEVEL;
  
+       if (fast_page_fault(vcpu, v, level, error_code))
+               return 0;
        mmu_seq = vcpu->kvm->mmu_notifier_seq;
        smp_rmb();
  
@@@ -3041,7 -3202,7 +3202,7 @@@ static int nonpaging_page_fault(struct 
        gfn = gva >> PAGE_SHIFT;
  
        return nonpaging_map(vcpu, gva & PAGE_MASK,
-                            error_code & PFERR_WRITE_MASK, gfn, prefault);
+                            error_code, gfn, prefault);
  }
  
  static int kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn)
@@@ -3121,6 -3282,9 +3282,9 @@@ static int tdp_page_fault(struct kvm_vc
        } else
                level = PT_PAGE_TABLE_LEVEL;
  
+       if (fast_page_fault(vcpu, gpa, level, error_code))
+               return 0;
        mmu_seq = vcpu->kvm->mmu_notifier_seq;
        smp_rmb();
  
@@@ -3885,6 -4049,7 +4049,7 @@@ int kvm_mmu_setup(struct kvm_vcpu *vcpu
  void kvm_mmu_slot_remove_write_access(struct kvm *kvm, int slot)
  {
        struct kvm_mmu_page *sp;
+       bool flush = false;
  
        list_for_each_entry(sp, &kvm->arch.active_mmu_pages, link) {
                int i;
                              !is_last_spte(pt[i], sp->role.level))
                                continue;
  
-                       if (is_large_pte(pt[i])) {
-                               drop_spte(kvm, &pt[i]);
-                               --kvm->stat.lpages;
-                               continue;
-                       }
-                       /* avoid RMW */
-                       if (is_writable_pte(pt[i]))
-                               mmu_spte_update(&pt[i],
-                                               pt[i] & ~PT_WRITABLE_MASK);
+                       spte_write_protect(kvm, &pt[i], &flush, false);
                }
        }
        kvm_flush_remote_tlbs(kvm);
@@@ -3934,9 -4090,6 +4090,9 @@@ static void kvm_mmu_remove_some_alloc_m
  {
        struct kvm_mmu_page *page;
  
 +      if (list_empty(&kvm->arch.active_mmu_pages))
 +              return;
 +
        page = container_of(kvm->arch.active_mmu_pages.prev,
                            struct kvm_mmu_page, link);
        kvm_mmu_prepare_zap_page(kvm, page, invalid_list);
  static int mmu_shrink(struct shrinker *shrink, struct shrink_control *sc)
  {
        struct kvm *kvm;
-       struct kvm *kvm_freed = NULL;
        int nr_to_scan = sc->nr_to_scan;
  
        if (nr_to_scan == 0)
                int idx;
                LIST_HEAD(invalid_list);
  
+               /*
+                * n_used_mmu_pages is accessed without holding kvm->mmu_lock
+                * here. We may skip a VM instance errorneosly, but we do not
+                * want to shrink a VM that only started to populate its MMU
+                * anyway.
+                */
+               if (kvm->arch.n_used_mmu_pages > 0) {
+                       if (!nr_to_scan--)
+                               break;
+                       continue;
+               }
                idx = srcu_read_lock(&kvm->srcu);
                spin_lock(&kvm->mmu_lock);
-               if (!kvm_freed && nr_to_scan > 0 &&
-                   kvm->arch.n_used_mmu_pages > 0) {
-                       kvm_mmu_remove_some_alloc_mmu_pages(kvm,
-                                                           &invalid_list);
-                       kvm_freed = kvm;
-               }
-               nr_to_scan--;
  
+               kvm_mmu_remove_some_alloc_mmu_pages(kvm, &invalid_list);
                kvm_mmu_commit_zap_page(kvm, &invalid_list);
                spin_unlock(&kvm->mmu_lock);
                srcu_read_unlock(&kvm->srcu, idx);
+               list_move_tail(&kvm->vm_list, &vm_list);
+               break;
        }
-       if (kvm_freed)
-               list_move_tail(&kvm_freed->vm_list, &vm_list);
  
        raw_spin_unlock(&kvm_lock);
  
diff --combined arch/x86/kvm/trace.h
index 62d02e3c3ed625ec6d0a5f89ceb325ee1eab7236,851914e207fc5291ea54177cd4f6a3c38817e434..a71faf727ff397da903549cb00d3b238934a252a
@@@ -517,6 -517,40 +517,40 @@@ TRACE_EVENT(kvm_apic_accept_irq
                  __entry->coalesced ? " (coalesced)" : "")
  );
  
+ TRACE_EVENT(kvm_eoi,
+           TP_PROTO(struct kvm_lapic *apic, int vector),
+           TP_ARGS(apic, vector),
+       TP_STRUCT__entry(
+               __field(        __u32,          apicid          )
+               __field(        int,            vector          )
+       ),
+       TP_fast_assign(
+               __entry->apicid         = apic->vcpu->vcpu_id;
+               __entry->vector         = vector;
+       ),
+       TP_printk("apicid %x vector %d", __entry->apicid, __entry->vector)
+ );
+ TRACE_EVENT(kvm_pv_eoi,
+           TP_PROTO(struct kvm_lapic *apic, int vector),
+           TP_ARGS(apic, vector),
+       TP_STRUCT__entry(
+               __field(        __u32,          apicid          )
+               __field(        int,            vector          )
+       ),
+       TP_fast_assign(
+               __entry->apicid         = apic->vcpu->vcpu_id;
+               __entry->vector         = vector;
+       ),
+       TP_printk("apicid %x vector %d", __entry->apicid, __entry->vector)
+ );
  /*
   * Tracepoint for nested VMRUN
   */
@@@ -710,6 -744,16 +744,6 @@@ TRACE_EVENT(kvm_skinit
                  __entry->rip, __entry->slb)
  );
  
 -#define __print_insn(insn, ilen) ({                            \
 -      int i;                                                   \
 -      const char *ret = p->buffer + p->len;                    \
 -                                                               \
 -      for (i = 0; i < ilen; ++i)                               \
 -              trace_seq_printf(p, " %02x", insn[i]);           \
 -      trace_seq_printf(p, "%c", 0);                            \
 -      ret;                                                     \
 -      })
 -
  #define KVM_EMUL_INSN_F_CR0_PE (1 << 0)
  #define KVM_EMUL_INSN_F_EFL_VM (1 << 1)
  #define KVM_EMUL_INSN_F_CS_D   (1 << 2)
@@@ -776,7 -820,7 +810,7 @@@ TRACE_EVENT(kvm_emulate_insn
  
        TP_printk("%x:%llx:%s (%s)%s",
                  __entry->csbase, __entry->rip,
 -                __print_insn(__entry->insn, __entry->len),
 +                __print_hex(__entry->insn, __entry->len),
                  __print_symbolic(__entry->flags,
                                   kvm_trace_symbol_emul_flags),
                  __entry->failed ? " failed" : ""
index b67ee04082677ad46d1495effb234d7a7c1df0d9,d3bdae49512f75a638a51777623274775fb1dc18..47cccd52aae8d15b1f064fe016b9eacbd3f16203
@@@ -1,5 -1,5 +1,5 @@@
  /*
 - * kvm_virtio.c - virtio for kvm on s390
 + * virtio for kvm on s390
   *
   * Copyright IBM Corp. 2008
   *
@@@ -25,6 -25,7 +25,7 @@@
  #include <asm/io.h>
  #include <asm/kvm_para.h>
  #include <asm/kvm_virtio.h>
+ #include <asm/sclp.h>
  #include <asm/setup.h>
  #include <asm/irq.h>
  
@@@ -468,7 -469,7 +469,7 @@@ static __init int early_put_chars(u32 v
  
  static int __init s390_virtio_console_init(void)
  {
-       if (!MACHINE_IS_KVM)
+       if (sclp_has_vt220() || sclp_has_linemode())
                return -ENODEV;
        return virtio_cons_early_init(early_put_chars);
  }
diff --combined include/linux/kvm_host.h
index 96c158a37d3e5ead53765e4bfa2280a82c79be5e,e3c86f8c86c9f20a3e0ff791da0db8e8643bfd2b..b70b48b01098c569b00cebc4a80cc2dbd691cdaf
@@@ -306,7 -306,7 +306,7 @@@ struct kvm 
        struct hlist_head irq_ack_notifier_list;
  #endif
  
- #ifdef KVM_ARCH_WANT_MMU_NOTIFIER
+ #if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)
        struct mmu_notifier mmu_notifier;
        unsigned long mmu_notifier_seq;
        long mmu_notifier_count;
        long tlbs_dirty;
  };
  
- /* The guest did something we don't support. */
- #define pr_unimpl(vcpu, fmt, ...)                                     \
-       pr_err_ratelimited("kvm: %i: cpu%i " fmt,                       \
-                          current->tgid, (vcpu)->vcpu_id , ## __VA_ARGS__)
+ #define kvm_err(fmt, ...) \
+       pr_err("kvm [%i]: " fmt, task_pid_nr(current), ## __VA_ARGS__)
+ #define kvm_info(fmt, ...) \
+       pr_info("kvm [%i]: " fmt, task_pid_nr(current), ## __VA_ARGS__)
+ #define kvm_debug(fmt, ...) \
+       pr_debug("kvm [%i]: " fmt, task_pid_nr(current), ## __VA_ARGS__)
+ #define kvm_pr_unimpl(fmt, ...) \
+       pr_err_ratelimited("kvm [%i]: " fmt, \
+                          task_tgid_nr(current), ## __VA_ARGS__)
  
- #define kvm_printf(kvm, fmt ...) printk(KERN_DEBUG fmt)
- #define vcpu_printf(vcpu, fmt...) kvm_printf(vcpu->kvm, fmt)
+ /* The guest did something we don't support. */
+ #define vcpu_unimpl(vcpu, fmt, ...)                                   \
+       kvm_pr_unimpl("vcpu%i " fmt, (vcpu)->vcpu_id, ## __VA_ARGS__)
  
  static inline struct kvm_vcpu *kvm_get_vcpu(struct kvm *kvm, int i)
  {
@@@ -535,6 -541,9 +541,9 @@@ int kvm_arch_vcpu_should_kick(struct kv
  
  void kvm_free_physmem(struct kvm *kvm);
  
+ void *kvm_kvzalloc(unsigned long size);
+ void kvm_kvfree(const void *addr);
  #ifndef __KVM_HAVE_ARCH_VM_ALLOC
  static inline struct kvm *kvm_arch_alloc_vm(void)
  {
@@@ -771,7 -780,7 +780,7 @@@ struct kvm_stats_debugfs_item 
  extern struct kvm_stats_debugfs_item debugfs_entries[];
  extern struct dentry *kvm_debugfs_dir;
  
- #ifdef KVM_ARCH_WANT_MMU_NOTIFIER
+ #if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)
  static inline int mmu_notifier_retry(struct kvm_vcpu *vcpu, unsigned long mmu_seq)
  {
        if (unlikely(vcpu->kvm->mmu_notifier_count))
  }
  #endif
  
- #ifdef CONFIG_HAVE_KVM_IRQCHIP
+ #ifdef KVM_CAP_IRQ_ROUTING
  
  #define KVM_MAX_IRQ_ROUTES 1024
  
@@@ -815,7 -824,7 +824,7 @@@ static inline void kvm_free_irq_routing
  #ifdef CONFIG_HAVE_KVM_EVENTFD
  
  void kvm_eventfd_init(struct kvm *kvm);
 -int kvm_irqfd(struct kvm *kvm, int fd, int gsi, int flags);
 +int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args);
  void kvm_irqfd_release(struct kvm *kvm);
  void kvm_irq_routing_update(struct kvm *, struct kvm_irq_routing_table *);
  int kvm_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args);
  
  static inline void kvm_eventfd_init(struct kvm *kvm) {}
  
 -static inline int kvm_irqfd(struct kvm *kvm, int fd, int gsi, int flags)
 +static inline int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args)
  {
        return -EINVAL;
  }
diff --combined virt/kvm/irq_comm.c
index 5afb43114020a82e0f3275d94e78d0d8fcba470c,cc59c68da032bc4d1b4fd2e7e4e02607e3c650c9..83402d74a767bec214d2c2467cceb3a271a6be44
  
  #include "ioapic.h"
  
- static inline int kvm_irq_line_state(unsigned long *irq_state,
-                                    int irq_source_id, int level)
- {
-       /* Logical OR for level trig interrupt */
-       if (level)
-               set_bit(irq_source_id, irq_state);
-       else
-               clear_bit(irq_source_id, irq_state);
-       return !!(*irq_state);
- }
  static int kvm_set_pic_irq(struct kvm_kernel_irq_routing_entry *e,
                           struct kvm *kvm, int irq_source_id, int level)
  {
  #ifdef CONFIG_X86
        struct kvm_pic *pic = pic_irqchip(kvm);
-       level = kvm_irq_line_state(&pic->irq_states[e->irqchip.pin],
-                                  irq_source_id, level);
-       return kvm_pic_set_irq(pic, e->irqchip.pin, level);
+       return kvm_pic_set_irq(pic, e->irqchip.pin, irq_source_id, level);
  #else
        return -1;
  #endif
@@@ -62,10 -48,7 +48,7 @@@ static int kvm_set_ioapic_irq(struct kv
                              struct kvm *kvm, int irq_source_id, int level)
  {
        struct kvm_ioapic *ioapic = kvm->arch.vioapic;
-       level = kvm_irq_line_state(&ioapic->irq_states[e->irqchip.pin],
-                                  irq_source_id, level);
-       return kvm_ioapic_set_irq(ioapic, e->irqchip.pin, level);
+       return kvm_ioapic_set_irq(ioapic, e->irqchip.pin, irq_source_id, level);
  }
  
  inline static bool kvm_is_dm_lowest_prio(struct kvm_lapic_irq *irq)
@@@ -249,8 -232,6 +232,6 @@@ unlock
  
  void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id)
  {
-       int i;
        ASSERT(irq_source_id != KVM_USERSPACE_IRQ_SOURCE_ID);
  
        mutex_lock(&kvm->irq_lock);
        if (!irqchip_in_kernel(kvm))
                goto unlock;
  
-       for (i = 0; i < KVM_IOAPIC_NUM_PINS; i++) {
-               clear_bit(irq_source_id, &kvm->arch.vioapic->irq_states[i]);
-               if (i >= 16)
-                       continue;
+       kvm_ioapic_clear_all(kvm->arch.vioapic, irq_source_id);
  #ifdef CONFIG_X86
-               clear_bit(irq_source_id, &pic_irqchip(kvm)->irq_states[i]);
+       kvm_pic_clear_all(pic_irqchip(kvm), irq_source_id);
  #endif
-       }
  unlock:
        mutex_unlock(&kvm->irq_lock);
  }
@@@ -332,7 -309,6 +309,7 @@@ static int setup_routing_entry(struct k
         */
        hlist_for_each_entry(ei, n, &rt->map[ue->gsi], link)
                if (ei->type == KVM_IRQ_ROUTING_MSI ||
 +                  ue->type == KVM_IRQ_ROUTING_MSI ||
                    ue->u.irqchip.irqchip == ei->irqchip.irqchip)
                        return r;
  
diff --combined virt/kvm/kvm_main.c
index 44ee7124b16dae1820ca1ca1c79f2a099979da12,b3ce91c623e25640c5c736a18ed53b69c3b5f0a1..246852397e301ee86ac5c40f653e4695eae659a8
@@@ -516,16 -516,32 +516,32 @@@ out_err_nodisable
        return ERR_PTR(r);
  }
  
+ /*
+  * Avoid using vmalloc for a small buffer.
+  * Should not be used when the size is statically known.
+  */
+ void *kvm_kvzalloc(unsigned long size)
+ {
+       if (size > PAGE_SIZE)
+               return vzalloc(size);
+       else
+               return kzalloc(size, GFP_KERNEL);
+ }
+ void kvm_kvfree(const void *addr)
+ {
+       if (is_vmalloc_addr(addr))
+               vfree(addr);
+       else
+               kfree(addr);
+ }
  static void kvm_destroy_dirty_bitmap(struct kvm_memory_slot *memslot)
  {
        if (!memslot->dirty_bitmap)
                return;
  
-       if (2 * kvm_dirty_bitmap_bytes(memslot) > PAGE_SIZE)
-               vfree(memslot->dirty_bitmap);
-       else
-               kfree(memslot->dirty_bitmap);
+       kvm_kvfree(memslot->dirty_bitmap);
        memslot->dirty_bitmap = NULL;
  }
  
@@@ -617,11 -633,7 +633,7 @@@ static int kvm_create_dirty_bitmap(stru
  #ifndef CONFIG_S390
        unsigned long dirty_bytes = 2 * kvm_dirty_bitmap_bytes(memslot);
  
-       if (dirty_bytes > PAGE_SIZE)
-               memslot->dirty_bitmap = vzalloc(dirty_bytes);
-       else
-               memslot->dirty_bitmap = kzalloc(dirty_bytes, GFP_KERNEL);
+       memslot->dirty_bitmap = kvm_kvzalloc(dirty_bytes);
        if (!memslot->dirty_bitmap)
                return -ENOMEM;
  
@@@ -1586,7 -1598,7 +1598,7 @@@ void kvm_vcpu_on_spin(struct kvm_vcpu *
         */
        for (pass = 0; pass < 2 && !yielded; pass++) {
                kvm_for_each_vcpu(i, vcpu, kvm) {
-                       if (!pass && i < last_boosted_vcpu) {
+                       if (!pass && i <= last_boosted_vcpu) {
                                i = last_boosted_vcpu;
                                continue;
                        } else if (pass && i > last_boosted_vcpu)
@@@ -2047,7 -2059,7 +2059,7 @@@ static long kvm_vm_ioctl(struct file *f
                r = -EFAULT;
                if (copy_from_user(&data, argp, sizeof data))
                        goto out;
 -              r = kvm_irqfd(kvm, data.fd, data.gsi, data.flags);
 +              r = kvm_irqfd(kvm, &data);
                break;
        }
        case KVM_IOEVENTFD: {
@@@ -2213,7 -2225,7 +2225,7 @@@ static long kvm_dev_ioctl_check_extensi
        case KVM_CAP_SIGNAL_MSI:
  #endif
                return 1;
- #ifdef CONFIG_HAVE_KVM_IRQCHIP
+ #ifdef KVM_CAP_IRQ_ROUTING
        case KVM_CAP_IRQ_ROUTING:
                return KVM_MAX_IRQ_ROUTES;
  #endif
@@@ -2845,7 -2857,6 +2857,7 @@@ void kvm_exit(void
        kvm_arch_hardware_unsetup();
        kvm_arch_exit();
        free_cpumask_var(cpus_hardware_enabled);
 +      __free_page(fault_page);
        __free_page(hwpoison_page);
        __free_page(bad_page);
  }