]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
powerpc/64s/kuap: Conditionally restore AMR in kuap_restore_amr asm
authorNicholas Piggin <npiggin@gmail.com>
Wed, 29 Apr 2020 06:56:54 +0000 (16:56 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 28 May 2020 13:24:37 +0000 (23:24 +1000)
Similar to the C code change, make the AMR restore conditional on
whether the register has changed.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200429065654.1677541-7-npiggin@gmail.com
arch/powerpc/include/asm/book3s/64/kup-radix.h
arch/powerpc/kernel/entry_64.S
arch/powerpc/kernel/exceptions-64s.S

index 820169bac6c4e336a62d7e15ffdfb4dbfb4cf0db..3ee1ec60be8442d4fd9d724eec8b9800d731a619 100644 (file)
 
 #ifdef __ASSEMBLY__
 
-.macro kuap_restore_amr        gpr
+.macro kuap_restore_amr        gpr1, gpr2
 #ifdef CONFIG_PPC_KUAP
        BEGIN_MMU_FTR_SECTION_NESTED(67)
-       ld      \gpr, STACK_REGS_KUAP(r1)
+       mfspr   \gpr1, SPRN_AMR
+       ld      \gpr2, STACK_REGS_KUAP(r1)
+       cmpd    \gpr1, \gpr2
+       beq     998f
        isync
-       mtspr   SPRN_AMR, \gpr
+       mtspr   SPRN_AMR, \gpr2
        /* No isync required, see kuap_restore_amr() */
+998:
        END_MMU_FTR_SECTION_NESTED_IFSET(MMU_FTR_RADIX_KUAP, 67)
 #endif
 .endm
index b3c9f15089b64c0be411c679cf2ec4eaddeba494..9d49338e0c85936982f523e50a5c278d7130919e 100644 (file)
@@ -479,11 +479,11 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
 fast_interrupt_return:
 _ASM_NOKPROBE_SYMBOL(fast_interrupt_return)
        kuap_check_amr r3, r4
-       ld      r4,_MSR(r1)
-       andi.   r0,r4,MSR_PR
+       ld      r5,_MSR(r1)
+       andi.   r0,r5,MSR_PR
        bne     .Lfast_user_interrupt_return
-       kuap_restore_amr r3
-       andi.   r0,r4,MSR_RI
+       kuap_restore_amr r3, r4
+       andi.   r0,r5,MSR_RI
        li      r3,0 /* 0 return value, no EMULATE_STACK_STORE */
        bne+    .Lfast_kernel_interrupt_return
        addi    r3,r1,STACK_FRAME_OVERHEAD
index 72036082dbaf154ecf30b5594f75b5b1b5a6a959..e70ebb5c318c315fc2ddc821611f0cdb8cd1a6d2 100644 (file)
@@ -971,7 +971,7 @@ EXC_COMMON_BEGIN(system_reset_common)
        ld      r10,SOFTE(r1)
        stb     r10,PACAIRQSOFTMASK(r13)
 
-       kuap_restore_amr r10
+       kuap_restore_amr r9, r10
        EXCEPTION_RESTORE_REGS
        RFI_TO_USER_OR_KERNEL
 
@@ -2784,7 +2784,7 @@ EXC_COMMON_BEGIN(soft_nmi_common)
        ld      r10,SOFTE(r1)
        stb     r10,PACAIRQSOFTMASK(r13)
 
-       kuap_restore_amr r10
+       kuap_restore_amr r9, r10
        EXCEPTION_RESTORE_REGS hsrr=0
        RFI_TO_KERNEL