aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Piggin <npiggin@gmail.com>2019-03-29 03:42:57 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2019-04-08 07:46:11 -0400
commit7100e8704b61247649c50551b965e71d168df30b (patch)
tree9f11f315e15bcbb9a8d88ae9fa2b1648bbf34191
parentdd9a994fc68d196a052b73747e3366c57d14a09e (diff)
powerpc/64s/radix: Fix radix segment exception handling
Commit 48e7b76957 ("powerpc/64s/hash: Convert SLB miss handlers to C") broke the radix-mode segment exception handler. In radix mode, this is exception is not an SLB miss, rather it signals that the EA is outside the range translated by any page table. The commit lost the radix feature alternate code patch, which can cause faults to some EAs to kernel BUG at arch/powerpc/mm/slb.c:639! The original radix code would send faults to slb_miss_large_addr, which would end up faulting due to slb_addr_limit being 0. This patch sends radix directly to do_bad_slb_fault, which is a bit clearer. Fixes: 48e7b7695745 ("powerpc/64s/hash: Convert SLB miss handlers to C") Cc: stable@vger.kernel.org # v4.20+ Reported-by: Anton Blanchard <anton@samba.org> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Reviewed-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-rw-r--r--arch/powerpc/kernel/exceptions-64s.S12
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index a5b8fbae56a0..9481a117e242 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -656,11 +656,17 @@ EXC_COMMON_BEGIN(data_access_slb_common)
656 ld r4,PACA_EXSLB+EX_DAR(r13) 656 ld r4,PACA_EXSLB+EX_DAR(r13)
657 std r4,_DAR(r1) 657 std r4,_DAR(r1)
658 addi r3,r1,STACK_FRAME_OVERHEAD 658 addi r3,r1,STACK_FRAME_OVERHEAD
659BEGIN_MMU_FTR_SECTION
660 /* HPT case, do SLB fault */
659 bl do_slb_fault 661 bl do_slb_fault
660 cmpdi r3,0 662 cmpdi r3,0
661 bne- 1f 663 bne- 1f
662 b fast_exception_return 664 b fast_exception_return
6631: /* Error case */ 6651: /* Error case */
666MMU_FTR_SECTION_ELSE
667 /* Radix case, access is outside page table range */
668 li r3,-EFAULT
669ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
664 std r3,RESULT(r1) 670 std r3,RESULT(r1)
665 bl save_nvgprs 671 bl save_nvgprs
666 RECONCILE_IRQ_STATE(r10, r11) 672 RECONCILE_IRQ_STATE(r10, r11)
@@ -705,11 +711,17 @@ EXC_COMMON_BEGIN(instruction_access_slb_common)
705 EXCEPTION_PROLOG_COMMON(0x480, PACA_EXSLB) 711 EXCEPTION_PROLOG_COMMON(0x480, PACA_EXSLB)
706 ld r4,_NIP(r1) 712 ld r4,_NIP(r1)
707 addi r3,r1,STACK_FRAME_OVERHEAD 713 addi r3,r1,STACK_FRAME_OVERHEAD
714BEGIN_MMU_FTR_SECTION
715 /* HPT case, do SLB fault */
708 bl do_slb_fault 716 bl do_slb_fault
709 cmpdi r3,0 717 cmpdi r3,0
710 bne- 1f 718 bne- 1f
711 b fast_exception_return 719 b fast_exception_return
7121: /* Error case */ 7201: /* Error case */
721MMU_FTR_SECTION_ELSE
722 /* Radix case, access is outside page table range */
723 li r3,-EFAULT
724ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
713 std r3,RESULT(r1) 725 std r3,RESULT(r1)
714 bl save_nvgprs 726 bl save_nvgprs
715 RECONCILE_IRQ_STATE(r10, r11) 727 RECONCILE_IRQ_STATE(r10, r11)