Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 7 Aug 2014 18:35:30 +0000 (11:35 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 7 Aug 2014 18:35:30 +0000 (11:35 -0700)
Pull second round of KVM changes from Paolo Bonzini:
 "Here are the PPC and ARM changes for KVM, which I separated because
  they had small conflicts (respectively within KVM documentation, and
  with 3.16-rc changes).  Since they were all within the subsystem, I
  took care of them.

  Stephen Rothwell reported some snags in PPC builds, but they are all
  fixed now; the latest linux-next report was clean.

  New features for ARM include:
   - KVM VGIC v2 emulation on GICv3 hardware
   - Big-Endian support for arm/arm64 (guest and host)
   - Debug Architecture support for arm64 (arm32 is on Christoffer's todo list)

  And for PPC:
   - Book3S: Good number of LE host fixes, enable HV on LE
   - Book3S HV: Add in-guest debug support

  This release drops support for KVM on the PPC440.  As a result, the
  PPC merge removes more lines than it adds.  :)

  I also included an x86 change, since Davidlohr tied it to an
  independent bug report and the reporter quickly provided a Tested-by;
  there was no reason to wait for -rc2"

* tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (122 commits)
  KVM: Move more code under CONFIG_HAVE_KVM_IRQFD
  KVM: nVMX: fix "acknowledge interrupt on exit" when APICv is in use
  KVM: nVMX: Fix nested vmexit ack intr before load vmcs01
  KVM: PPC: Enable IRQFD support for the XICS interrupt controller
  KVM: Give IRQFD its own separate enabling Kconfig option
  KVM: Move irq notifier implementation into eventfd.c
  KVM: Move all accesses to kvm::irq_routing into irqchip.c
  KVM: irqchip: Provide and use accessors for irq routing table
  KVM: Don't keep reference to irq routing table in irqfd struct
  KVM: PPC: drop duplicate tracepoint
  arm64: KVM: fix 64bit CP15 VM access for 32bit guests
  KVM: arm64: GICv3: mandate page-aligned GICV region
  arm64: KVM: GICv3: move system register access to msr_s/mrs_s
  KVM: PPC: PR: Handle FSCR feature deselects
  KVM: PPC: HV: Remove generic instruction emulation
  KVM: PPC: BOOKEHV: rename e500hv_spr to bookehv_spr
  KVM: PPC: Remove DCR handling
  KVM: PPC: Expose helper functions for data/inst faults
  KVM: PPC: Separate loadstore emulation from priv emulation
  KVM: PPC: Handle magic page in kvmppc_ld/st
  ...

12 files changed:
1  2 
arch/arm/kernel/hyp-stub.S
arch/arm/kvm/guest.c
arch/arm/kvm/init.S
arch/powerpc/include/asm/kvm_asm.h
arch/powerpc/include/asm/ppc-opcode.h
arch/powerpc/include/asm/reg.h
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kvm/Makefile
arch/powerpc/kvm/book3s_64_mmu_hv.c
arch/powerpc/kvm/book3s_hv_builtin.c
arch/powerpc/kvm/book3s_hv_rmhandlers.S
arch/x86/kvm/x86.c

index 56ce6290c8318e4b56ac02c766180e2f6c72466c,7e666cfda6344fc88c087ca654be6bca7410fabf..2a55373f49bfb621987ad2a548271fe51d7923b5
@@@ -99,7 -99,7 +99,7 @@@ ENTRY(__hyp_stub_install_secondary
         * immediately.
         */
        compare_cpu_mode_with_primary   r4, r5, r6, r7
 -      movne   pc, lr
 +      retne   lr
  
        /*
         * Once we have given up on one CPU, we do not try to install the
         */
  
        cmp     r4, #HYP_MODE
 -      movne   pc, lr                  @ give up if the CPU is not in HYP mode
 +      retne   lr                      @ give up if the CPU is not in HYP mode
  
  /*
   * Configure HSCTLR to set correct exception endianness/instruction set
        mcr     p15, 4, r7, c1, c1, 3   @ HSTR
  
  THUMB(        orr     r7, #(1 << 30)  )       @ HSCTLR.TE
- #ifdef CONFIG_CPU_BIG_ENDIAN
-       orr     r7, #(1 << 9)           @ HSCTLR.EE
- #endif
+ ARM_BE8(orr   r7, r7, #(1 << 25))     @ HSCTLR.EE
        mcr     p15, 4, r7, c1, c0, 0   @ HSCTLR
  
        mrc     p15, 4, r7, c1, c1, 1   @ HDCR
@@@ -201,7 -199,7 +199,7 @@@ ENDPROC(__hyp_get_vectors
        @ fall through
  ENTRY(__hyp_set_vectors)
        __HVC(0)
 -      mov     pc, lr
 +      ret     lr
  ENDPROC(__hyp_set_vectors)
  
  #ifndef ZIMAGE
diff --combined arch/arm/kvm/guest.c
index 70bf49b8b2442ca5849cc544513a25ada24b6613,986e625b5dbd4ec5151f8f839c5b3dd56d107c19..813e492586909e006ccdcb1f3dc752729cc322ef
@@@ -124,16 -124,6 +124,6 @@@ static bool is_timer_reg(u64 index
        return false;
  }
  
- int kvm_arm_timer_set_reg(struct kvm_vcpu *vcpu, u64 regid, u64 value)
- {
-       return 0;
- }
- u64 kvm_arm_timer_get_reg(struct kvm_vcpu *vcpu, u64 regid)
- {
-       return 0;
- }
  #else
  
  #define NUM_TIMER_REGS 3
@@@ -274,7 -264,13 +264,7 @@@ int kvm_arch_vcpu_ioctl_set_sregs(struc
  
  int __attribute_const__ kvm_target_cpu(void)
  {
 -      unsigned long implementor = read_cpuid_implementor();
 -      unsigned long part_number = read_cpuid_part_number();
 -
 -      if (implementor != ARM_CPU_IMP_ARM)
 -              return -EINVAL;
 -
 -      switch (part_number) {
 +      switch (read_cpuid_part()) {
        case ARM_CPU_PART_CORTEX_A7:
                return KVM_ARM_TARGET_CORTEX_A7;
        case ARM_CPU_PART_CORTEX_A15:
diff --combined arch/arm/kvm/init.S
index b2d229f09c0777d3dedcf5e6cfc7fbe4ea19addc,2cc14dfad04991fb2670e0c9469462b2951eacc9..991415d978b6020a958ac44a886103ee83aa764c
@@@ -17,7 -17,6 +17,7 @@@
   */
  
  #include <linux/linkage.h>
 +#include <asm/assembler.h>
  #include <asm/unified.h>
  #include <asm/asm-offsets.h>
  #include <asm/kvm_asm.h>
@@@ -72,7 -71,7 +72,7 @@@ __do_hyp_init
        bne     phase2                  @ Yes, second stage init
  
        @ Set the HTTBR to point to the hypervisor PGD pointer passed
-       mcrr    p15, 4, r2, r3, c2
+       mcrr    p15, 4, rr_lo_hi(r2, r3), c2
  
        @ Set the HTCR and VTCR to the same shareability and cacheability
        @ settings as the non-secure TTBCR and with T0SZ == 0.
@@@ -135,10 -134,10 +135,10 @@@ phase2
        ldr     r0, =TRAMPOLINE_VA
        adr     r1, target
        bfi     r0, r1, #0, #PAGE_SHIFT
 -      mov     pc, r0
 +      ret     r0
  
  target:       @ We're now in the trampoline code, switch page tables
-       mcrr    p15, 4, r2, r3, c2
+       mcrr    p15, 4, rr_lo_hi(r2, r3), c2
        isb
  
        @ Invalidate the old TLBs
index ecf7e133a4f2e9d54298b51672a2491222075532,b8901c4a492273eb3223d791bbf26e4e9ccda00a..465dfcb82c92a809be5e13a46f7e1d6d287714c2
@@@ -33,7 -33,6 +33,6 @@@
  /* IVPR must be 64KiB-aligned. */
  #define VCPU_SIZE_ORDER 4
  #define VCPU_SIZE_LOG   (VCPU_SIZE_ORDER + 12)
- #define VCPU_TLB_PGSZ   PPC44x_TLB_64K
  #define VCPU_SIZE_BYTES (1<<VCPU_SIZE_LOG)
  
  #define BOOKE_INTERRUPT_CRITICAL 0
@@@ -98,7 -97,6 +97,7 @@@
  #define BOOK3S_INTERRUPT_H_DATA_STORAGE       0xe00
  #define BOOK3S_INTERRUPT_H_INST_STORAGE       0xe20
  #define BOOK3S_INTERRUPT_H_EMUL_ASSIST        0xe40
 +#define BOOK3S_INTERRUPT_HMI          0xe60
  #define BOOK3S_INTERRUPT_H_DOORBELL   0xe80
  #define BOOK3S_INTERRUPT_PERFMON      0xf00
  #define BOOK3S_INTERRUPT_ALTIVEC      0xf20
  #define BOOK3S_HFLAG_NATIVE_PS                        0x8
  #define BOOK3S_HFLAG_MULTI_PGSIZE             0x10
  #define BOOK3S_HFLAG_NEW_TLBIE                        0x20
+ #define BOOK3S_HFLAG_SPLIT_HACK                       0x40
  
  #define RESUME_FLAG_NV          (1<<0)  /* Reload guest nonvolatile state? */
  #define RESUME_FLAG_HOST        (1<<1)  /* Resume host? */
index e316dad6ba76ed17c74e3e024b77f77bdfe086a9,c636841fc77201565a2436584cf63a3f09c69151..6f8536208049f4c8f46708e45b4153927c36658a
  #define PPC_INST_ISEL                 0x7c00001e
  #define PPC_INST_ISEL_MASK            0xfc00003e
  #define PPC_INST_LDARX                        0x7c0000a8
+ #define PPC_INST_LOGMPP                       0x7c0007e4
  #define PPC_INST_LSWI                 0x7c0004aa
  #define PPC_INST_LSWX                 0x7c00042a
  #define PPC_INST_LWARX                        0x7c000028
  #define PPC_INST_MCRXR_MASK           0xfc0007fe
  #define PPC_INST_MFSPR_PVR            0x7c1f42a6
  #define PPC_INST_MFSPR_PVR_MASK               0xfc1fffff
 +#define PPC_INST_MFTMR                        0x7c0002dc
  #define PPC_INST_MSGSND                       0x7c00019c
  #define PPC_INST_MSGSNDP              0x7c00011c
 +#define PPC_INST_MTTMR                        0x7c0003dc
  #define PPC_INST_NOP                  0x60000000
  #define PPC_INST_POPCNTB              0x7c0000f4
  #define PPC_INST_POPCNTB_MASK         0xfc0007fe
  #define __PPC_EH(eh)  0
  #endif
  
+ /* POWER8 Micro Partition Prefetch (MPP) parameters */
+ /* Address mask is common for LOGMPP instruction and MPPR SPR */
+ #define PPC_MPPE_ADDRESS_MASK 0xffffffffc000
+ /* Bits 60 and 61 of MPP SPR should be set to one of the following */
+ /* Aborting the fetch is indeed setting 00 in the table size bits */
+ #define PPC_MPPR_FETCH_ABORT (0x0ULL << 60)
+ #define PPC_MPPR_FETCH_WHOLE_TABLE (0x2ULL << 60)
+ /* Bits 54 and 55 of register for LOGMPP instruction should be set to: */
+ #define PPC_LOGMPP_LOG_L2 (0x02ULL << 54)
+ #define PPC_LOGMPP_LOG_L2L3 (0x01ULL << 54)
+ #define PPC_LOGMPP_LOG_ABORT (0x03ULL << 54)
  /* Deal with instructions that older assemblers aren't aware of */
  #define       PPC_DCBAL(a, b)         stringify_in_c(.long PPC_INST_DCBAL | \
                                        __PPC_RA(a) | __PPC_RB(b))
  #define PPC_LDARX(t, a, b, eh)        stringify_in_c(.long PPC_INST_LDARX | \
                                        ___PPC_RT(t) | ___PPC_RA(a) | \
                                        ___PPC_RB(b) | __PPC_EH(eh))
+ #define PPC_LOGMPP(b)         stringify_in_c(.long PPC_INST_LOGMPP | \
+                                       __PPC_RB(b))
  #define PPC_LWARX(t, a, b, eh)        stringify_in_c(.long PPC_INST_LWARX | \
                                        ___PPC_RT(t) | ___PPC_RA(a) | \
                                        ___PPC_RB(b) | __PPC_EH(eh))
  #define TABORT(r)             stringify_in_c(.long PPC_INST_TABORT \
                                               | __PPC_RA(r))
  
 +/* book3e thread control instructions */
 +#define TMRN(x)                       ((((x) & 0x1f) << 16) | (((x) & 0x3e0) << 6))
 +#define MTTMR(tmr, r)         stringify_in_c(.long PPC_INST_MTTMR | \
 +                                             TMRN(tmr) | ___PPC_RS(r))
 +#define MFTMR(tmr, r)         stringify_in_c(.long PPC_INST_MFTMR | \
 +                                             TMRN(tmr) | ___PPC_RT(r))
 +
  #endif /* _ASM_POWERPC_PPC_OPCODE_H */
index f7b97b89570872e4729f05368178f582542db238,c547b26371b8a2d4147004105143647b8c0ae784..1c987bf794ef9454e359095a8db012443f913a45
  #define   CTRL_TE     0x00c00000      /* thread enable */
  #define   CTRL_RUNLATCH       0x1
  #define SPRN_DAWR     0xB4
+ #define SPRN_MPPR     0xB8    /* Micro Partition Prefetch Register */
  #define SPRN_RPR      0xBA    /* Relative Priority Register */
  #define SPRN_CIABR    0xBB
  #define   CIABR_PRIV          0x3
  #define   DSISR_PROTFAULT     0x08000000      /* protection fault */
  #define   DSISR_ISSTORE               0x02000000      /* access was a store */
  #define   DSISR_DABRMATCH     0x00400000      /* hit data breakpoint */
 -#define   DSISR_NOSEGMENT     0x00200000      /* STAB/SLB miss */
 +#define   DSISR_NOSEGMENT     0x00200000      /* SLB miss */
  #define   DSISR_KEYFAULT      0x00200000      /* Key fault */
  #define SPRN_TBRL     0x10C   /* Time Base Read Lower Register (user, R/O) */
  #define SPRN_TBRU     0x10D   /* Time Base Read Upper Register (user, R/O) */
   *      readable variant for reads, which can avoid a fault
   *      with KVM type virtualization.
   *
-  *      (*) Under KVM, the host SPRG1 is used to point to
-  *      the current VCPU data structure
-  *
   * 32-bit 8xx:
   *    - SPRG0 scratch for exception vectors
   *    - SPRG1 scratch for exception vectors
                                     : "r" ((unsigned long)(v)) \
                                     : "memory")
  
+ static inline unsigned long mfvtb (void)
+ {
+ #ifdef CONFIG_PPC_BOOK3S_64
+       if (cpu_has_feature(CPU_FTR_ARCH_207S))
+               return mfspr(SPRN_VTB);
+ #endif
+       return 0;
+ }
  #ifdef __powerpc64__
  #if defined(CONFIG_PPC_CELL) || defined(CONFIG_PPC_FSL_BOOK3E)
  #define mftb()                ({unsigned long rval;                           \
index e35054054c326e9c018102c5aefc69f2a99ac131,ab9ae0411e8f927887a05379ca9acc681a09bc17..9d7dede2847cd0618a21e3ca99c4835041efe1df
@@@ -216,6 -216,8 +216,6 @@@ int main(void
  #endif /* CONFIG_PPC_BOOK3E */
  
  #ifdef CONFIG_PPC_STD_MMU_64
 -      DEFINE(PACASTABREAL, offsetof(struct paca_struct, stab_real));
 -      DEFINE(PACASTABVIRT, offsetof(struct paca_struct, stab_addr));
        DEFINE(PACASLBCACHE, offsetof(struct paca_struct, slb_cache));
        DEFINE(PACASLBCACHEPTR, offsetof(struct paca_struct, slb_cache_ptr));
        DEFINE(PACAVMALLOCSLLP, offsetof(struct paca_struct, vmalloc_sllp));
        DEFINE(KVM_HOST_SDR1, offsetof(struct kvm, arch.host_sdr1));
        DEFINE(KVM_TLBIE_LOCK, offsetof(struct kvm, arch.tlbie_lock));
        DEFINE(KVM_NEED_FLUSH, offsetof(struct kvm, arch.need_tlb_flush.bits));
+       DEFINE(KVM_ENABLED_HCALLS, offsetof(struct kvm, arch.enabled_hcalls));
        DEFINE(KVM_LPCR, offsetof(struct kvm, arch.lpcr));
        DEFINE(KVM_RMOR, offsetof(struct kvm, arch.rmor));
        DEFINE(KVM_VRMA_SLB_V, offsetof(struct kvm, arch.vrma_slb_v));
        DEFINE(VCPU_LR, offsetof(struct kvm_vcpu, arch.lr));
        DEFINE(VCPU_CTR, offsetof(struct kvm_vcpu, arch.ctr));
        DEFINE(VCPU_PC, offsetof(struct kvm_vcpu, arch.pc));
+       DEFINE(VCPU_SPRG9, offsetof(struct kvm_vcpu, arch.sprg9));
        DEFINE(VCPU_LAST_INST, offsetof(struct kvm_vcpu, arch.last_inst));
        DEFINE(VCPU_FAULT_DEAR, offsetof(struct kvm_vcpu, arch.fault_dear));
        DEFINE(VCPU_FAULT_ESR, offsetof(struct kvm_vcpu, arch.fault_esr));
index 72905c30082e65a025398a69561d96728ae2714b,2d590dea54827b288b010c7e2e52436c75582ef9..0570eef83fba59f2e1613c0db8571bd92e2da992
@@@ -10,27 -10,17 +10,17 @@@ KVM := ../../../virt/kv
  common-objs-y = $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o \
                $(KVM)/eventfd.o
  
- CFLAGS_44x_tlb.o  := -I.
  CFLAGS_e500_mmu.o := -I.
  CFLAGS_e500_mmu_host.o := -I.
  CFLAGS_emulate.o  := -I.
+ CFLAGS_emulate_loadstore.o  := -I.
  
- common-objs-y += powerpc.o emulate.o
+ common-objs-y += powerpc.o emulate.o emulate_loadstore.o
  obj-$(CONFIG_KVM_EXIT_TIMING) += timing.o
  obj-$(CONFIG_KVM_BOOK3S_HANDLER) += book3s_exports.o
  
  AFLAGS_booke_interrupts.o := -I$(obj)
  
- kvm-440-objs := \
-       $(common-objs-y) \
-       booke.o \
-       booke_emulate.o \
-       booke_interrupts.o \
-       44x.o \
-       44x_tlb.o \
-       44x_emulate.o
- kvm-objs-$(CONFIG_KVM_440) := $(kvm-440-objs)
  kvm-e500-objs := \
        $(common-objs-y) \
        booke.o \
@@@ -58,6 -48,7 +48,7 @@@ kvm-book3s_64-builtin-objs-$(CONFIG_KVM
  
  kvm-pr-y := \
        fpu.o \
+       emulate.o \
        book3s_paired_singles.o \
        book3s_pr.o \
        book3s_pr_papr.o \
@@@ -90,6 -81,7 +81,6 @@@ kvm-book3s_64-builtin-objs-$(CONFIG_KVM
        book3s_hv_rm_mmu.o \
        book3s_hv_ras.o \
        book3s_hv_builtin.o \
 -      book3s_hv_cma.o \
        $(kvm-book3s_64-builtin-xics-objs-y)
  endif
  
@@@ -100,7 -92,7 +91,7 @@@ kvm-book3s_64-module-objs += 
        $(KVM)/kvm_main.o \
        $(KVM)/eventfd.o \
        powerpc.o \
-       emulate.o \
+       emulate_loadstore.o \
        book3s.o \
        book3s_64_vio.o \
        book3s_rtas.o \
@@@ -126,7 -118,6 +117,6 @@@ kvm-objs-$(CONFIG_HAVE_KVM_IRQ_ROUTING
  
  kvm-objs := $(kvm-objs-m) $(kvm-objs-y)
  
- obj-$(CONFIG_KVM_440) += kvm.o
  obj-$(CONFIG_KVM_E500V2) += kvm.o
  obj-$(CONFIG_KVM_E500MC) += kvm.o
  obj-$(CONFIG_KVM_BOOK3S_64) += kvm.o
index a01744fc3483160092d45c26764daeeaf2bfb041,e3d17f5710858296092b01c179a916c14d75b6ad..72c20bb16d266b4ed0aa2160382414f161ad0663
@@@ -37,6 -37,8 +37,6 @@@
  #include <asm/ppc-opcode.h>
  #include <asm/cputable.h>
  
 -#include "book3s_hv_cma.h"
 -
  /* POWER7 has 10-bit LPIDs, PPC970 has 6-bit LPIDs */
  #define MAX_LPID_970  63
  
@@@ -62,10 -64,10 +62,10 @@@ long kvmppc_alloc_hpt(struct kvm *kvm, 
        }
  
        kvm->arch.hpt_cma_alloc = 0;
 -      VM_BUG_ON(order < KVM_CMA_CHUNK_ORDER);
        page = kvm_alloc_hpt(1 << (order - PAGE_SHIFT));
        if (page) {
                hpt = (unsigned long)pfn_to_kaddr(page_to_pfn(page));
 +              memset((void *)hpt, 0, (1 << order));
                kvm->arch.hpt_cma_alloc = 1;
        }
  
@@@ -448,7 -450,7 +448,7 @@@ static int kvmppc_mmu_book3s_64_hv_xlat
        unsigned long slb_v;
        unsigned long pp, key;
        unsigned long v, gr;
-       unsigned long *hptep;
+       __be64 *hptep;
        int index;
        int virtmode = vcpu->arch.shregs.msr & (data ? MSR_DR : MSR_IR);
  
                preempt_enable();
                return -ENOENT;
        }
-       hptep = (unsigned long *)(kvm->arch.hpt_virt + (index << 4));
-       v = hptep[0] & ~HPTE_V_HVLOCK;
+       hptep = (__be64 *)(kvm->arch.hpt_virt + (index << 4));
+       v = be64_to_cpu(hptep[0]) & ~HPTE_V_HVLOCK;
        gr = kvm->arch.revmap[index].guest_rpte;
  
        /* Unlock the HPTE */
        asm volatile("lwsync" : : : "memory");
-       hptep[0] = v;
+       hptep[0] = cpu_to_be64(v);
        preempt_enable();
  
        gpte->eaddr = eaddr;
@@@ -528,21 -530,14 +528,14 @@@ static int instruction_is_store(unsigne
  static int kvmppc_hv_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu,
                                  unsigned long gpa, gva_t ea, int is_store)
  {
-       int ret;
        u32 last_inst;
-       unsigned long srr0 = kvmppc_get_pc(vcpu);
  
-       /* We try to load the last instruction.  We don't let
-        * emulate_instruction do it as it doesn't check what
-        * kvmppc_ld returns.
+       /*
         * If we fail, we just return to the guest and try executing it again.
         */
-       if (vcpu->arch.last_inst == KVM_INST_FETCH_FAILED) {
-               ret = kvmppc_ld(vcpu, &srr0, sizeof(u32), &last_inst, false);
-               if (ret != EMULATE_DONE || last_inst == KVM_INST_FETCH_FAILED)
-                       return RESUME_GUEST;
-               vcpu->arch.last_inst = last_inst;
-       }
+       if (kvmppc_get_last_inst(vcpu, INST_GENERIC, &last_inst) !=
+               EMULATE_DONE)
+               return RESUME_GUEST;
  
        /*
         * WARNING: We do not know for sure whether the instruction we just
         * we just return and retry the instruction.
         */
  
-       if (instruction_is_store(kvmppc_get_last_inst(vcpu)) != !!is_store)
+       if (instruction_is_store(last_inst) != !!is_store)
                return RESUME_GUEST;
  
        /*
@@@ -581,7 -576,8 +574,8 @@@ int kvmppc_book3s_hv_page_fault(struct 
                                unsigned long ea, unsigned long dsisr)
  {
        struct kvm *kvm = vcpu->kvm;
-       unsigned long *hptep, hpte[3], r;
+       unsigned long hpte[3], r;
+       __be64 *hptep;
        unsigned long mmu_seq, psize, pte_size;
        unsigned long gpa_base, gfn_base;
        unsigned long gpa, gfn, hva, pfn;
        if (ea != vcpu->arch.pgfault_addr)
                return RESUME_GUEST;
        index = vcpu->arch.pgfault_index;
-       hptep = (unsigned long *)(kvm->arch.hpt_virt + (index << 4));
+       hptep = (__be64 *)(kvm->arch.hpt_virt + (index << 4));
        rev = &kvm->arch.revmap[index];
        preempt_disable();
        while (!try_lock_hpte(hptep, HPTE_V_HVLOCK))
                cpu_relax();
-       hpte[0] = hptep[0] & ~HPTE_V_HVLOCK;
-       hpte[1] = hptep[1];
+       hpte[0] = be64_to_cpu(hptep[0]) & ~HPTE_V_HVLOCK;
+       hpte[1] = be64_to_cpu(hptep[1]);
        hpte[2] = r = rev->guest_rpte;
        asm volatile("lwsync" : : : "memory");
-       hptep[0] = hpte[0];
+       hptep[0] = cpu_to_be64(hpte[0]);
        preempt_enable();
  
        if (hpte[0] != vcpu->arch.pgfault_hpte[0] ||
        preempt_disable();
        while (!try_lock_hpte(hptep, HPTE_V_HVLOCK))
                cpu_relax();
-       if ((hptep[0] & ~HPTE_V_HVLOCK) != hpte[0] || hptep[1] != hpte[1] ||
-           rev->guest_rpte != hpte[2])
+       if ((be64_to_cpu(hptep[0]) & ~HPTE_V_HVLOCK) != hpte[0] ||
+               be64_to_cpu(hptep[1]) != hpte[1] ||
+               rev->guest_rpte != hpte[2])
                /* HPTE has been changed under us; let the guest retry */
                goto out_unlock;
        hpte[0] = (hpte[0] & ~HPTE_V_ABSENT) | HPTE_V_VALID;
        rcbits = *rmap >> KVMPPC_RMAP_RC_SHIFT;
        r &= rcbits | ~(HPTE_R_R | HPTE_R_C);
  
-       if (hptep[0] & HPTE_V_VALID) {
+       if (be64_to_cpu(hptep[0]) & HPTE_V_VALID) {
                /* HPTE was previously valid, so we need to invalidate it */
                unlock_rmap(rmap);
-               hptep[0] |= HPTE_V_ABSENT;
+               hptep[0] |= cpu_to_be64(HPTE_V_ABSENT);
                kvmppc_invalidate_hpte(kvm, hptep, index);
                /* don't lose previous R and C bits */
-               r |= hptep[1] & (HPTE_R_R | HPTE_R_C);
+               r |= be64_to_cpu(hptep[1]) & (HPTE_R_R | HPTE_R_C);
        } else {
                kvmppc_add_revmap_chain(kvm, rev, rmap, index, 0);
        }
  
-       hptep[1] = r;
+       hptep[1] = cpu_to_be64(r);
        eieio();
-       hptep[0] = hpte[0];
+       hptep[0] = cpu_to_be64(hpte[0]);
        asm volatile("ptesync" : : : "memory");
        preempt_enable();
        if (page && hpte_is_writable(r))
        return ret;
  
   out_unlock:
-       hptep[0] &= ~HPTE_V_HVLOCK;
+       hptep[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
        preempt_enable();
        goto out_put;
  }
@@@ -858,7 -855,7 +853,7 @@@ static int kvm_unmap_rmapp(struct kvm *
  {
        struct revmap_entry *rev = kvm->arch.revmap;
        unsigned long h, i, j;
-       unsigned long *hptep;
+       __be64 *hptep;
        unsigned long ptel, psize, rcbits;
  
        for (;;) {
                 * rmap chain lock.
                 */
                i = *rmapp & KVMPPC_RMAP_INDEX;
-               hptep = (unsigned long *) (kvm->arch.hpt_virt + (i << 4));
+               hptep = (__be64 *) (kvm->arch.hpt_virt + (i << 4));
                if (!try_lock_hpte(hptep, HPTE_V_HVLOCK)) {
                        /* unlock rmap before spinning on the HPTE lock */
                        unlock_rmap(rmapp);
-                       while (hptep[0] & HPTE_V_HVLOCK)
+                       while (be64_to_cpu(hptep[0]) & HPTE_V_HVLOCK)
                                cpu_relax();
                        continue;
                }
  
                /* Now check and modify the HPTE */
                ptel = rev[i].guest_rpte;
-               psize = hpte_page_size(hptep[0], ptel);
-               if ((hptep[0] & HPTE_V_VALID) &&
+               psize = hpte_page_size(be64_to_cpu(hptep[0]), ptel);
+               if ((be64_to_cpu(hptep[0]) & HPTE_V_VALID) &&
                    hpte_rpn(ptel, psize) == gfn) {
                        if (kvm->arch.using_mmu_notifiers)
-                               hptep[0] |= HPTE_V_ABSENT;
+                               hptep[0] |= cpu_to_be64(HPTE_V_ABSENT);
                        kvmppc_invalidate_hpte(kvm, hptep, i);
                        /* Harvest R and C */
-                       rcbits = hptep[1] & (HPTE_R_R | HPTE_R_C);
+                       rcbits = be64_to_cpu(hptep[1]) & (HPTE_R_R | HPTE_R_C);
                        *rmapp |= rcbits << KVMPPC_RMAP_RC_SHIFT;
                        if (rcbits & ~rev[i].guest_rpte) {
                                rev[i].guest_rpte = ptel | rcbits;
                        }
                }
                unlock_rmap(rmapp);
-               hptep[0] &= ~HPTE_V_HVLOCK;
+               hptep[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
        }
        return 0;
  }
@@@ -959,7 -956,7 +954,7 @@@ static int kvm_age_rmapp(struct kvm *kv
  {
        struct revmap_entry *rev = kvm->arch.revmap;
        unsigned long head, i, j;
-       unsigned long *hptep;
+       __be64 *hptep;
        int ret = 0;
  
   retry:
  
        i = head = *rmapp & KVMPPC_RMAP_INDEX;
        do {
-               hptep = (unsigned long *) (kvm->arch.hpt_virt + (i << 4));
+               hptep = (__be64 *) (kvm->arch.hpt_virt + (i << 4));
                j = rev[i].forw;
  
                /* If this HPTE isn't referenced, ignore it */
-               if (!(hptep[1] & HPTE_R_R))
+               if (!(be64_to_cpu(hptep[1]) & HPTE_R_R))
                        continue;
  
                if (!try_lock_hpte(hptep, HPTE_V_HVLOCK)) {
                        /* unlock rmap before spinning on the HPTE lock */
                        unlock_rmap(rmapp);
-                       while (hptep[0] & HPTE_V_HVLOCK)
+                       while (be64_to_cpu(hptep[0]) & HPTE_V_HVLOCK)
                                cpu_relax();
                        goto retry;
                }
  
                /* Now check and modify the HPTE */
-               if ((hptep[0] & HPTE_V_VALID) && (hptep[1] & HPTE_R_R)) {
+               if ((be64_to_cpu(hptep[0]) & HPTE_V_VALID) &&
+                   (be64_to_cpu(hptep[1]) & HPTE_R_R)) {
                        kvmppc_clear_ref_hpte(kvm, hptep, i);
                        if (!(rev[i].guest_rpte & HPTE_R_R)) {
                                rev[i].guest_rpte |= HPTE_R_R;
                        }
                        ret = 1;
                }
-               hptep[0] &= ~HPTE_V_HVLOCK;
+               hptep[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
        } while ((i = j) != head);
  
        unlock_rmap(rmapp);
@@@ -1033,7 -1031,7 +1029,7 @@@ static int kvm_test_age_rmapp(struct kv
                do {
                        hp = (unsigned long *)(kvm->arch.hpt_virt + (i << 4));
                        j = rev[i].forw;
-                       if (hp[1] & HPTE_R_R)
+                       if (be64_to_cpu(hp[1]) & HPTE_R_R)
                                goto out;
                } while ((i = j) != head);
        }
@@@ -1073,7 -1071,7 +1069,7 @@@ static int kvm_test_clear_dirty_npages(
        unsigned long head, i, j;
        unsigned long n;
        unsigned long v, r;
-       unsigned long *hptep;
+       __be64 *hptep;
        int npages_dirty = 0;
  
   retry:
  
        i = head = *rmapp & KVMPPC_RMAP_INDEX;
        do {
-               hptep = (unsigned long *) (kvm->arch.hpt_virt + (i << 4));
+               unsigned long hptep1;
+               hptep = (__be64 *) (kvm->arch.hpt_virt + (i << 4));
                j = rev[i].forw;
  
                /*
                 * Otherwise we need to do the tlbie even if C==0 in
                 * order to pick up any delayed writeback of C.
                 */
-               if (!(hptep[1] & HPTE_R_C) &&
-                   (!hpte_is_writable(hptep[1]) || vcpus_running(kvm)))
+               hptep1 = be64_to_cpu(hptep[1]);
+               if (!(hptep1 & HPTE_R_C) &&
+                   (!hpte_is_writable(hptep1) || vcpus_running(kvm)))
                        continue;
  
                if (!try_lock_hpte(hptep, HPTE_V_HVLOCK)) {
                        /* unlock rmap before spinning on the HPTE lock */
                        unlock_rmap(rmapp);
-                       while (hptep[0] & HPTE_V_HVLOCK)
+                       while (hptep[0] & cpu_to_be64(HPTE_V_HVLOCK))
                                cpu_relax();
                        goto retry;
                }
  
                /* Now check and modify the HPTE */
-               if (!(hptep[0] & HPTE_V_VALID))
+               if (!(hptep[0] & cpu_to_be64(HPTE_V_VALID)))
                        continue;
  
                /* need to make it temporarily absent so C is stable */
-               hptep[0] |= HPTE_V_ABSENT;
+               hptep[0] |= cpu_to_be64(HPTE_V_ABSENT);
                kvmppc_invalidate_hpte(kvm, hptep, i);
-               v = hptep[0];
-               r = hptep[1];
+               v = be64_to_cpu(hptep[0]);
+               r = be64_to_cpu(hptep[1]);
                if (r & HPTE_R_C) {
-                       hptep[1] = r & ~HPTE_R_C;
+                       hptep[1] = cpu_to_be64(r & ~HPTE_R_C);
                        if (!(rev[i].guest_rpte & HPTE_R_C)) {
                                rev[i].guest_rpte |= HPTE_R_C;
                                note_hpte_modification(kvm, &rev[i]);
                }
                v &= ~(HPTE_V_ABSENT | HPTE_V_HVLOCK);
                v |= HPTE_V_VALID;
-               hptep[0] = v;
+               hptep[0] = cpu_to_be64(v);
        } while ((i = j) != head);
  
        unlock_rmap(rmapp);
@@@ -1305,7 -1305,7 +1303,7 @@@ struct kvm_htab_ctx 
   * Returns 1 if this HPT entry has been modified or has pending
   * R/C bit changes.
   */
- static int hpte_dirty(struct revmap_entry *revp, unsigned long *hptp)
+ static int hpte_dirty(struct revmap_entry *revp, __be64 *hptp)
  {
        unsigned long rcbits_unset;
  
  
        /* Also need to consider changes in reference and changed bits */
        rcbits_unset = ~revp->guest_rpte & (HPTE_R_R | HPTE_R_C);
-       if ((hptp[0] & HPTE_V_VALID) && (hptp[1] & rcbits_unset))
+       if ((be64_to_cpu(hptp[0]) & HPTE_V_VALID) &&
+           (be64_to_cpu(hptp[1]) & rcbits_unset))
                return 1;
  
        return 0;
  }
  
- static long record_hpte(unsigned long flags, unsigned long *hptp,
+ static long record_hpte(unsigned long flags, __be64 *hptp,
                        unsigned long *hpte, struct revmap_entry *revp,
                        int want_valid, int first_pass)
  {
                return 0;
  
        valid = 0;
-       if (hptp[0] & (HPTE_V_VALID | HPTE_V_ABSENT)) {
+       if (be64_to_cpu(hptp[0]) & (HPTE_V_VALID | HPTE_V_ABSENT)) {
                valid = 1;
                if ((flags & KVM_GET_HTAB_BOLTED_ONLY) &&
-                   !(hptp[0] & HPTE_V_BOLTED))
+                   !(be64_to_cpu(hptp[0]) & HPTE_V_BOLTED))
                        valid = 0;
        }
        if (valid != want_valid)
                preempt_disable();
                while (!try_lock_hpte(hptp, HPTE_V_HVLOCK))
                        cpu_relax();
-               v = hptp[0];
+               v = be64_to_cpu(hptp[0]);
  
                /* re-evaluate valid and dirty from synchronized HPTE value */
                valid = !!(v & HPTE_V_VALID);
  
                /* Harvest R and C into guest view if necessary */
                rcbits_unset = ~revp->guest_rpte & (HPTE_R_R | HPTE_R_C);
-               if (valid && (rcbits_unset & hptp[1])) {
-                       revp->guest_rpte |= (hptp[1] & (HPTE_R_R | HPTE_R_C)) |
-                               HPTE_GR_MODIFIED;
+               if (valid && (rcbits_unset & be64_to_cpu(hptp[1]))) {
+                       revp->guest_rpte |= (be64_to_cpu(hptp[1]) &
+                               (HPTE_R_R | HPTE_R_C)) | HPTE_GR_MODIFIED;
                        dirty = 1;
                }
  
                        revp->guest_rpte = r;
                }
                asm volatile(PPC_RELEASE_BARRIER "" : : : "memory");
-               hptp[0] &= ~HPTE_V_HVLOCK;
+               hptp[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
                preempt_enable();
                if (!(valid == want_valid && (first_pass || dirty)))
                        ok = 0;
        }
-       hpte[0] = v;
-       hpte[1] = r;
+       hpte[0] = cpu_to_be64(v);
+       hpte[1] = cpu_to_be64(r);
        return ok;
  }
  
@@@ -1395,7 -1396,7 +1394,7 @@@ static ssize_t kvm_htab_read(struct fil
        struct kvm_htab_ctx *ctx = file->private_data;
        struct kvm *kvm = ctx->kvm;
        struct kvm_get_htab_header hdr;
-       unsigned long *hptp;
+       __be64 *hptp;
        struct revmap_entry *revp;
        unsigned long i, nb, nw;
        unsigned long __user *lbuf;
        flags = ctx->flags;
  
        i = ctx->index;
-       hptp = (unsigned long *)(kvm->arch.hpt_virt + (i * HPTE_SIZE));
+       hptp = (__be64 *)(kvm->arch.hpt_virt + (i * HPTE_SIZE));
        revp = kvm->arch.revmap + i;
        lbuf = (unsigned long __user *)buf;
  
@@@ -1495,7 -1496,7 +1494,7 @@@ static ssize_t kvm_htab_write(struct fi
        unsigned long i, j;
        unsigned long v, r;
        unsigned long __user *lbuf;
-       unsigned long *hptp;
+       __be64 *hptp;
        unsigned long tmp[2];
        ssize_t nb;
        long int err, ret;
                    i + hdr.n_valid + hdr.n_invalid > kvm->arch.hpt_npte)
                        break;
  
-               hptp = (unsigned long *)(kvm->arch.hpt_virt + (i * HPTE_SIZE));
+               hptp = (__be64 *)(kvm->arch.hpt_virt + (i * HPTE_SIZE));
                lbuf = (unsigned long __user *)buf;
                for (j = 0; j < hdr.n_valid; ++j) {
                        err = -EFAULT;
                        lbuf += 2;
                        nb += HPTE_SIZE;
  
-                       if (hptp[0] & (HPTE_V_VALID | HPTE_V_ABSENT))
+                       if (be64_to_cpu(hptp[0]) & (HPTE_V_VALID | HPTE_V_ABSENT))
                                kvmppc_do_h_remove(kvm, 0, i, 0, tmp);
                        err = -EIO;
                        ret = kvmppc_virtmode_do_h_enter(kvm, H_EXACT, i, v, r,
                }
  
                for (j = 0; j < hdr.n_invalid; ++j) {
-                       if (hptp[0] & (HPTE_V_VALID | HPTE_V_ABSENT))
+                       if (be64_to_cpu(hptp[0]) & (HPTE_V_VALID | HPTE_V_ABSENT))
                                kvmppc_do_h_remove(kvm, 0, i, 0, tmp);
                        ++i;
                        hptp += 2;
index 6cf498a9bc987d62ba335c2e10aabe00dc3f4384,3b41447482e54f595a498ef170895ccf0295f52c..329d7fdd0a6ab7be8b9e203ac53b1870c1d37b0c
  #include <linux/init.h>
  #include <linux/memblock.h>
  #include <linux/sizes.h>
 +#include <linux/cma.h>
  
  #include <asm/cputable.h>
  #include <asm/kvm_ppc.h>
  #include <asm/kvm_book3s.h>
  
 -#include "book3s_hv_cma.h"
 +#define KVM_CMA_CHUNK_ORDER   18
 +
  /*
   * Hash page table alignment on newer cpus(CPU_FTR_ARCH_206)
   * should be power of 2.
@@@ -45,8 -43,6 +45,8 @@@ static unsigned long kvm_cma_resv_rati
  unsigned long kvm_rma_pages = (1 << 27) >> PAGE_SHIFT;        /* 128MB */
  EXPORT_SYMBOL_GPL(kvm_rma_pages);
  
 +static struct cma *kvm_cma;
 +
  /* Work out RMLS (real mode limit selector) field value for a given RMA size.
     Assumes POWER7 or PPC970. */
  static inline int lpcr_rmls(unsigned long rma_size)
@@@ -101,7 -97,7 +101,7 @@@ struct kvm_rma_info *kvm_alloc_rma(
        ri = kmalloc(sizeof(struct kvm_rma_info), GFP_KERNEL);
        if (!ri)
                return NULL;
 -      page = kvm_alloc_cma(kvm_rma_pages, kvm_rma_pages);
 +      page = cma_alloc(kvm_cma, kvm_rma_pages, get_order(kvm_rma_pages));
        if (!page)
                goto err_out;
        atomic_set(&ri->use_count, 1);
@@@ -116,7 -112,7 +116,7 @@@ EXPORT_SYMBOL_GPL(kvm_alloc_rma)
  void kvm_release_rma(struct kvm_rma_info *ri)
  {
        if (atomic_dec_and_test(&ri->use_count)) {
 -              kvm_release_cma(pfn_to_page(ri->base_pfn), kvm_rma_pages);
 +              cma_release(kvm_cma, pfn_to_page(ri->base_pfn), kvm_rma_pages);
                kfree(ri);
        }
  }
@@@ -135,18 -131,16 +135,18 @@@ struct page *kvm_alloc_hpt(unsigned lon
  {
        unsigned long align_pages = HPT_ALIGN_PAGES;
  
 +      VM_BUG_ON(get_order(nr_pages) < KVM_CMA_CHUNK_ORDER - PAGE_SHIFT);
 +
        /* Old CPUs require HPT aligned on a multiple of its size */
        if (!cpu_has_feature(CPU_FTR_ARCH_206))
                align_pages = nr_pages;
 -      return kvm_alloc_cma(nr_pages, align_pages);
 +      return cma_alloc(kvm_cma, nr_pages, get_order(align_pages));
  }
  EXPORT_SYMBOL_GPL(kvm_alloc_hpt);
  
  void kvm_release_hpt(struct page *page, unsigned long nr_pages)
  {
 -      kvm_release_cma(page, nr_pages);
 +      cma_release(kvm_cma, page, nr_pages);
  }
  EXPORT_SYMBOL_GPL(kvm_release_hpt);
  
@@@ -185,8 -179,7 +185,8 @@@ void __init kvm_cma_reserve(void
                        align_size = HPT_ALIGN_PAGES << PAGE_SHIFT;
  
                align_size = max(kvm_rma_pages << PAGE_SHIFT, align_size);
 -              kvm_cma_declare_contiguous(selected_size, align_size);
 +              cma_declare_contiguous(0, selected_size, 0, align_size,
 +                      KVM_CMA_CHUNK_ORDER - PAGE_SHIFT, false, &kvm_cma);
        }
  }
  
@@@ -219,3 -212,16 +219,16 @@@ bool kvm_hv_mode_active(void
  {
        return atomic_read(&hv_vm_count) != 0;
  }
+ extern int hcall_real_table[], hcall_real_table_end[];
+ int kvmppc_hcall_impl_hv_realmode(unsigned long cmd)
+ {
+       cmd /= 4;
+       if (cmd < hcall_real_table_end - hcall_real_table &&
+           hcall_real_table[cmd])
+               return 1;
+       return 0;
+ }
+ EXPORT_SYMBOL_GPL(kvmppc_hcall_impl_hv_realmode);
index 7faf8fd057389298074e8f4a783ef152d0d5f9be,855521ef04e81eff0d13c66854d7297ba82c5e36..f0c4db7704c37d13a2a4a2ef82a7a69ec673f2f7
  
  #define VCPU_GPRS_TM(reg) (((reg) * ULONG_SIZE) + VCPU_GPR_TM)
  
- #ifdef __LITTLE_ENDIAN__
- #error Need to fix lppaca and SLB shadow accesses in little endian mode
- #endif
  /* Values in HSTATE_NAPPING(r13) */
  #define NAPPING_CEDE  1
  #define NAPPING_NOVCPU        2
@@@ -159,8 -155,6 +155,8 @@@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S
        cmpwi   r12, BOOK3S_INTERRUPT_EXTERNAL
  BEGIN_FTR_SECTION
        beq     11f
 +      cmpwi   cr2, r12, BOOK3S_INTERRUPT_HMI
 +      beq     cr2, 14f                        /* HMI check */
  END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206)
  
        /* RFI into the highmem handler, or branch to interrupt handler */
  
  13:   b       machine_check_fwnmi
  
 +14:   mtspr   SPRN_HSRR0, r8
 +      mtspr   SPRN_HSRR1, r7
 +      b       hmi_exception_after_realmode
 +
  kvmppc_primary_no_guest:
        /* We handle this much like a ceded vcpu */
        /* set our bit in napping_threads */
@@@ -601,9 -591,10 +597,10 @@@ kvmppc_got_guest
        ld      r3, VCPU_VPA(r4)
        cmpdi   r3, 0
        beq     25f
-       lwz     r5, LPPACA_YIELDCOUNT(r3)
+       li      r6, LPPACA_YIELDCOUNT
+       LWZX_BE r5, r3, r6
        addi    r5, r5, 1
-       stw     r5, LPPACA_YIELDCOUNT(r3)
+       STWX_BE r5, r3, r6
        li      r6, 1
        stb     r6, VCPU_VPA_DIRTY(r4)
  25:
@@@ -677,9 -668,9 +674,9 @@@ END_FTR_SECTION_IFCLR(CPU_FTR_TM
  
        mr      r31, r4
        addi    r3, r31, VCPU_FPRS_TM
-       bl      .load_fp_state
+       bl      load_fp_state
        addi    r3, r31, VCPU_VRS_TM
-       bl      .load_vr_state
+       bl      load_vr_state
        mr      r4, r31
        lwz     r7, VCPU_VRSAVE_TM(r4)
        mtspr   SPRN_VRSAVE, r7
@@@ -1423,9 -1414,9 +1420,9 @@@ END_FTR_SECTION_IFCLR(CPU_FTR_TM
  
        /* Save FP/VSX. */
        addi    r3, r9, VCPU_FPRS_TM
-       bl      .store_fp_state
+       bl      store_fp_state
        addi    r3, r9, VCPU_VRS_TM
-       bl      .store_vr_state
+       bl      store_vr_state
        mfspr   r6, SPRN_VRSAVE
        stw     r6, VCPU_VRSAVE_TM(r9)
  1:
        ld      r8, VCPU_VPA(r9)        /* do they have a VPA? */
        cmpdi   r8, 0
        beq     25f
-       lwz     r3, LPPACA_YIELDCOUNT(r8)
+       li      r4, LPPACA_YIELDCOUNT
+       LWZX_BE r3, r8, r4
        addi    r3, r3, 1
-       stw     r3, LPPACA_YIELDCOUNT(r8)
+       STWX_BE r3, r8, r4
        li      r3, 1
        stb     r3, VCPU_VPA_DIRTY(r9)
  25:
@@@ -1763,8 -1755,10 +1761,10 @@@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S
  33:   ld      r8,PACA_SLBSHADOWPTR(r13)
  
        .rept   SLB_NUM_BOLTED
-       ld      r5,SLBSHADOW_SAVEAREA(r8)
-       ld      r6,SLBSHADOW_SAVEAREA+8(r8)
+       li      r3, SLBSHADOW_SAVEAREA
+       LDX_BE  r5, r8, r3
+       addi    r3, r3, 8
+       LDX_BE  r6, r8, r3
        andis.  r7,r5,SLB_ESID_V@h
        beq     1f
        slbmte  r6,r5
@@@ -1915,12 -1909,23 +1915,23 @@@ hcall_try_real_mode
        clrrdi  r3,r3,2
        cmpldi  r3,hcall_real_table_end - hcall_real_table
        bge     guest_exit_cont
+       /* See if this hcall is enabled for in-kernel handling */
+       ld      r4, VCPU_KVM(r9)
+       srdi    r0, r3, 8       /* r0 = (r3 / 4) >> 6 */
+       sldi    r0, r0, 3       /* index into kvm->arch.enabled_hcalls[] */
+       add     r4, r4, r0
+       ld      r0, KVM_ENABLED_HCALLS(r4)
+       rlwinm  r4, r3, 32-2, 0x3f      /* r4 = (r3 / 4) & 0x3f */
+       srd     r0, r0, r4
+       andi.   r0, r0, 1
+       beq     guest_exit_cont
+       /* Get pointer to handler, if any, and call it */
        LOAD_REG_ADDR(r4, hcall_real_table)
        lwax    r3,r3,r4
        cmpwi   r3,0
        beq     guest_exit_cont
-       add     r3,r3,r4
-       mtctr   r3
+       add     r12,r3,r4
+       mtctr   r12
        mr      r3,r9           /* get vcpu pointer */
        ld      r4,VCPU_GPR(R4)(r9)
        bctrl
@@@ -2037,6 -2042,7 +2048,7 @@@ hcall_real_table
        .long   0               /* 0x12c */
        .long   0               /* 0x130 */
        .long   DOTSYM(kvmppc_h_set_xdabr) - hcall_real_table
+       .globl  hcall_real_table_end
  hcall_real_table_end:
  
  ignore_hdec:
@@@ -2344,7 -2350,18 +2356,18 @@@ kvmppc_read_intr
        cmpdi   r6, 0
        beq-    1f
        lwzcix  r0, r6, r7
-       rlwinm. r3, r0, 0, 0xffffff
+       /*
+        * Save XIRR for later. Since we get in in reverse endian on LE
+        * systems, save it byte reversed and fetch it back in host endian.
+        */
+       li      r3, HSTATE_SAVED_XIRR
+       STWX_BE r0, r3, r13
+ #ifdef __LITTLE_ENDIAN__
+       lwz     r3, HSTATE_SAVED_XIRR(r13)
+ #else
+       mr      r3, r0
+ #endif
+       rlwinm. r3, r3, 0, 0xffffff
        sync
        beq     1f                      /* if nothing pending in the ICP */
  
        li      r3, -1
  1:    blr
  
- 42:   /* It's not an IPI and it's for the host, stash it in the PACA
-        * before exit, it will be picked up by the host ICP driver
+ 42:   /* It's not an IPI and it's for the host. We saved a copy of XIRR in
+        * the PACA earlier, it will be picked up by the host ICP driver
         */
-       stw     r0, HSTATE_SAVED_XIRR(r13)
        li      r3, 1
        b       1b
  
@@@ -2414,11 -2430,11 +2436,11 @@@ END_FTR_SECTION_IFSET(CPU_FTR_VSX
        mtmsrd  r8
        isync
        addi    r3,r3,VCPU_FPRS
-       bl      .store_fp_state
+       bl      store_fp_state
  #ifdef CONFIG_ALTIVEC
  BEGIN_FTR_SECTION
        addi    r3,r31,VCPU_VRS
-       bl      .store_vr_state
+       bl      store_vr_state
  END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
  #endif
        mfspr   r6,SPRN_VRSAVE
@@@ -2450,11 -2466,11 +2472,11 @@@ END_FTR_SECTION_IFSET(CPU_FTR_VSX
        mtmsrd  r8
        isync
        addi    r3,r4,VCPU_FPRS
-       bl      .load_fp_state
+       bl      load_fp_state
  #ifdef CONFIG_ALTIVEC
  BEGIN_FTR_SECTION
        addi    r3,r31,VCPU_VRS
-       bl      .load_vr_state
+       bl      load_vr_state
  END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
  #endif
        lwz     r7,VCPU_VRSAVE(r31)
diff --combined arch/x86/kvm/x86.c
index ca3d760dd5817f45ab6ea87a33fa075105095e2d,204422de3fede58be444089d8f60a12c73ae14eb..8f1e22d3b286ccf03c90dc3bc28f120fe27a244b
@@@ -1020,8 -1020,9 +1020,8 @@@ struct pvclock_gtod_data 
                u32     shift;
        } clock;
  
 -      /* open coded 'struct timespec' */
 -      u64             monotonic_time_snsec;
 -      time_t          monotonic_time_sec;
 +      u64             boot_ns;
 +      u64             nsec_base;
  };
  
  static struct pvclock_gtod_data pvclock_gtod_data;
  static void update_pvclock_gtod(struct timekeeper *tk)
  {
        struct pvclock_gtod_data *vdata = &pvclock_gtod_data;
 +      u64 boot_ns;
 +
 +      boot_ns = ktime_to_ns(ktime_add(tk->tkr.base_mono, tk->offs_boot));
  
        write_seqcount_begin(&vdata->seq);
  
        /* copy pvclock gtod data */
 -      vdata->clock.vclock_mode        = tk->clock->archdata.vclock_mode;
 -      vdata->clock.cycle_last         = tk->clock->cycle_last;
 -      vdata->clock.mask               = tk->clock->mask;
 -      vdata->clock.mult               = tk->mult;
 -      vdata->clock.shift              = tk->shift;
 -
 -      vdata->monotonic_time_sec       = tk->xtime_sec
 -                                      + tk->wall_to_monotonic.tv_sec;
 -      vdata->monotonic_time_snsec     = tk->xtime_nsec
 -                                      + (tk->wall_to_monotonic.tv_nsec
 -                                              << tk->shift);
 -      while (vdata->monotonic_time_snsec >=
 -                                      (((u64)NSEC_PER_SEC) << tk->shift)) {
 -              vdata->monotonic_time_snsec -=
 -                                      ((u64)NSEC_PER_SEC) << tk->shift;
 -              vdata->monotonic_time_sec++;
 -      }
 +      vdata->clock.vclock_mode        = tk->tkr.clock->archdata.vclock_mode;
 +      vdata->clock.cycle_last         = tk->tkr.cycle_last;
 +      vdata->clock.mask               = tk->tkr.mask;
 +      vdata->clock.mult               = tk->tkr.mult;
 +      vdata->clock.shift              = tk->tkr.shift;
 +
 +      vdata->boot_ns                  = boot_ns;
 +      vdata->nsec_base                = tk->tkr.xtime_nsec;
  
        write_seqcount_end(&vdata->seq);
  }
@@@ -1138,7 -1145,11 +1138,7 @@@ static void kvm_get_time_scale(uint32_
  
  static inline u64 get_kernel_ns(void)
  {
 -      struct timespec ts;
 -
 -      ktime_get_ts(&ts);
 -      monotonic_to_bootbased(&ts);
 -      return timespec_to_ns(&ts);
 +      return ktime_get_boot_ns();
  }
  
  #ifdef CONFIG_X86_64
@@@ -1403,22 -1414,23 +1403,22 @@@ static inline u64 vgettsc(cycle_t *cycl
        return v * gtod->clock.mult;
  }
  
 -static int do_monotonic(struct timespec *ts, cycle_t *cycle_now)
 +static int do_monotonic_boot(s64 *t, cycle_t *cycle_now)
  {
 +      struct pvclock_gtod_data *gtod = &pvclock_gtod_data;
        unsigned long seq;
 -      u64 ns;
        int mode;
 -      struct pvclock_gtod_data *gtod = &pvclock_gtod_data;
 +      u64 ns;
  
 -      ts->tv_nsec = 0;
        do {
                seq = read_seqcount_begin(&gtod->seq);
                mode = gtod->clock.vclock_mode;
 -              ts->tv_sec = gtod->monotonic_time_sec;
 -              ns = gtod->monotonic_time_snsec;
 +              ns = gtod->nsec_base;
                ns += vgettsc(cycle_now);
                ns >>= gtod->clock.shift;
 +              ns += gtod->boot_ns;
        } while (unlikely(read_seqcount_retry(&gtod->seq, seq)));
 -      timespec_add_ns(ts, ns);
 +      *t = ns;
  
        return mode;
  }
  /* returns true if host is using tsc clocksource */
  static bool kvm_get_time_and_clockread(s64 *kernel_ns, cycle_t *cycle_now)
  {
 -      struct timespec ts;
 -
        /* checked again under seqlock below */
        if (pvclock_gtod_data.clock.vclock_mode != VCLOCK_TSC)
                return false;
  
 -      if (do_monotonic(&ts, cycle_now) != VCLOCK_TSC)
 -              return false;
 -
 -      monotonic_to_bootbased(&ts);
 -      *kernel_ns = timespec_to_ns(&ts);
 -
 -      return true;
 +      return do_monotonic_boot(kernel_ns, cycle_now) == VCLOCK_TSC;
  }
  #endif
  
@@@ -2636,7 -2656,7 +2636,7 @@@ out
        return r;
  }
  
- int kvm_dev_ioctl_check_extension(long ext)
+ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
  {
        int r;