KVM: PPC: Book3S HV: Don't use ASDR for real-mode HPT faults on POWER9
authorPaul Mackerras <paulus@ozlabs.org>
Tue, 28 Feb 2017 00:05:47 +0000 (11:05 +1100)
committerPaul Mackerras <paulus@ozlabs.org>
Wed, 1 Mar 2017 00:54:10 +0000 (11:54 +1100)
In HPT mode on POWER9, the ASDR register is supposed to record
segment information for hypervisor page faults.  It turns out that
POWER9 DD1 does not record the page size information in the ASDR
for faults in guest real mode.  We have the necessary information
in memory already, so by moving the checks for real mode that already
existed, we can use the in-memory copy.  Since a load is likely to
be faster than reading an SPR, we do this unconditionally (not just
for POWER9 DD1).

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
arch/powerpc/kvm/book3s_hv_rmhandlers.S

index 47414a6fe2dde85cfbe27a3fbc42ce22e5a801e8..7c6477d1840aab488cbec7ffe813696fd63f861f 100644 (file)
@@ -1787,12 +1787,12 @@ kvmppc_hdsi:
        /* HPTE not found fault or protection fault? */
        andis.  r0, r6, (DSISR_NOHPTE | DSISR_PROTFAULT)@h
        beq     1f                      /* if not, send it to the guest */
+       andi.   r0, r11, MSR_DR         /* data relocation enabled? */
+       beq     3f
 BEGIN_FTR_SECTION
        mfspr   r5, SPRN_ASDR           /* on POWER9, use ASDR to get VSID */
        b       4f
 END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
-       andi.   r0, r11, MSR_DR         /* data relocation enabled? */
-       beq     3f
        clrrdi  r0, r4, 28
        PPC_SLBFEE_DOT(R5, R0)          /* if so, look up SLB */
        li      r0, BOOK3S_INTERRUPT_DATA_SEGMENT
@@ -1879,12 +1879,12 @@ kvmppc_hisi:
        bne     .Lradix_hisi            /* for radix, just save ASDR */
        andis.  r0, r11, SRR1_ISI_NOPT@h
        beq     1f
+       andi.   r0, r11, MSR_IR         /* instruction relocation enabled? */
+       beq     3f
 BEGIN_FTR_SECTION
        mfspr   r5, SPRN_ASDR           /* on POWER9, use ASDR to get VSID */
        b       4f
 END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
-       andi.   r0, r11, MSR_IR         /* instruction relocation enabled? */
-       beq     3f
        clrrdi  r0, r10, 28
        PPC_SLBFEE_DOT(R5, R0)          /* if so, look up SLB */
        li      r0, BOOK3S_INTERRUPT_INST_SEGMENT