]> www.infradead.org Git - linux-platform-drivers-x86.git/commitdiff
powerpc/32: Call bad_page_fault() from do_page_fault()
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Fri, 12 Mar 2021 12:50:37 +0000 (12:50 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 29 Mar 2021 02:22:08 +0000 (13:22 +1100)
Now that non volatile registers are saved at all time, no
need to split bad_page_fault() out of do_page_fault().

Remove handle_page_fault() and use do_page_fault() directly.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/cfb95be8863204cc2bf45a22ea44dd1d0dc16b7f.1615552867.git.christophe.leroy@csgroup.eu
arch/powerpc/kernel/entry_32.S
arch/powerpc/kernel/head_40x.S
arch/powerpc/kernel/head_8xx.S
arch/powerpc/kernel/head_book3s_32.S
arch/powerpc/kernel/head_booke.h
arch/powerpc/kernel/head_fsl_booke.S
arch/powerpc/mm/fault.c

index e538ae73394d925bc2e0c3bf75a0a158327db8c2..76e1502b3e6f7355e82cdf45fab5d2f73f7eabfb 100644 (file)
@@ -220,22 +220,6 @@ ret_from_kernel_thread:
        li      r3,0
        b       ret_from_syscall
 
-/*
- * Top-level page fault handling.
- * This is in assembler because if do_page_fault tells us that
- * it is a bad kernel page fault, we want to save the non-volatile
- * registers before calling bad_page_fault.
- */
-       .globl  handle_page_fault
-handle_page_fault:
-       bl      do_page_fault
-       cmpwi   r3,0
-       beq+    ret_from_except
-       mr      r4,r3           /* err arg for bad_page_fault */
-       addi    r3,r1,STACK_FRAME_OVERHEAD
-       bl      __bad_page_fault
-       b       ret_from_except_full
-
 /*
  * This routine switches between two different tasks.  The process
  * state of one is saved on its kernel stack.  Then the state
index 08563d4170c6ddc27483662bb3be40b94b703e96..a657783807043d911d9e104b9e0f48dac4d12622 100644 (file)
@@ -207,7 +207,7 @@ _ASM_NOKPROBE_SYMBOL(\name\()_virt)
  */
        START_EXCEPTION(0x0300, DataStorage)
        EXCEPTION_PROLOG DataStorage handle_dar_dsisr=1
-       EXC_XFER_LITE(0x300, handle_page_fault)
+       EXC_XFER_LITE(0x300, do_page_fault)
 
 /*
  * 0x0400 - Instruction Storage Exception
@@ -218,7 +218,7 @@ _ASM_NOKPROBE_SYMBOL(\name\()_virt)
        li      r5,0
        stw     r5, _ESR(r11)           /* Zero ESR */
        stw     r12, _DEAR(r11)         /* SRR0 as DEAR */
-       EXC_XFER_LITE(0x400, handle_page_fault)
+       EXC_XFER_LITE(0x400, do_page_fault)
 
 /* 0x0500 - External Interrupt Exception */
        EXCEPTION(0x0500, HardwareInterrupt, do_IRQ, EXC_XFER_LITE)
index eb1d40a8f2c4e42833fc082a83fdca96ea768934..4078d0dc2f1893b8941d021b753848e744d32df5 100644 (file)
@@ -301,7 +301,7 @@ instruction_counter:
 .Litlbie:
        stw     r12, _DAR(r11)
        stw     r5, _DSISR(r11)
-       EXC_XFER_LITE(0x400, handle_page_fault)
+       EXC_XFER_LITE(0x400, do_page_fault)
 
 /* This is the data TLB error on the MPC8xx.  This could be due to
  * many reasons, including a dirty update to a pte.  We bail out to
@@ -322,7 +322,7 @@ DARFixed:/* Return from dcbx instruction bug workaround */
        tlbie   r4
 .Ldtlbie:
        /* 0x300 is DataAccess exception, needed by bad_page_fault() */
-       EXC_XFER_LITE(0x300, handle_page_fault)
+       EXC_XFER_LITE(0x300, do_page_fault)
 
 #ifdef CONFIG_VMAP_STACK
        vmap_stack_overflow_exception
index 453f6ea959f907d0295cfddf94c28ebabb78798d..e78b4a7c23af6e22811038cd05ea68179835c7f7 100644 (file)
@@ -299,7 +299,7 @@ ALT_MMU_FTR_SECTION_END_IFSET(MMU_FTR_HPTE_TABLE)
        lwz     r5, _DSISR(r11)
        andis.  r0, r5, DSISR_DABRMATCH@h
        bne-    1f
-       EXC_XFER_LITE(0x300, handle_page_fault)
+       EXC_XFER_LITE(0x300, do_page_fault)
 1:     EXC_XFER_STD(0x300, do_break)
 
 
@@ -328,7 +328,7 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_HPTE_TABLE)
        andis.  r5,r9,DSISR_SRR1_MATCH_32S@h /* Filter relevant SRR1 bits */
        stw     r5, _DSISR(r11)
        stw     r12, _DAR(r11)
-       EXC_XFER_LITE(0x400, handle_page_fault)
+       EXC_XFER_LITE(0x400, do_page_fault)
 
 /* External interrupt */
        EXCEPTION(0x500, HardwareInterrupt, do_IRQ, EXC_XFER_LITE)
index 009a56d70d76a7beb1eb0b2bddfd1f9c4aed67e2..036a69d1660599dfd611d0757cf17acb8b764026 100644 (file)
@@ -462,7 +462,7 @@ label:
        stw     r5,_ESR(r11);                                                 \
        mfspr   r4,SPRN_DEAR;           /* Grab the DEAR */                   \
        stw     r4, _DEAR(r11);                                               \
-       EXC_XFER_LITE(0x0300, handle_page_fault)
+       EXC_XFER_LITE(0x0300, do_page_fault)
 
 #define INSTRUCTION_STORAGE_EXCEPTION                                        \
        START_EXCEPTION(InstructionStorage)                                   \
@@ -470,7 +470,7 @@ label:
        mfspr   r5,SPRN_ESR;            /* Grab the ESR and save it */        \
        stw     r5,_ESR(r11);                                                 \
        stw     r12, _DEAR(r11);        /* Pass SRR0 as arg2 */               \
-       EXC_XFER_LITE(0x0400, handle_page_fault)
+       EXC_XFER_LITE(0x0400, do_page_fault)
 
 #define ALIGNMENT_EXCEPTION                                                  \
        START_EXCEPTION(Alignment)                                            \
index f51c66f747ad270ec04bcd2ca1dc64f532512b80..72e9aa45b99b7f35094a643b7d6055951ee1b51d 100644 (file)
@@ -370,7 +370,7 @@ interrupt_base:
        stw     r4, _DEAR(r11)
        andis.  r10,r5,(ESR_ILK|ESR_DLK)@h
        bne     1f
-       EXC_XFER_LITE(0x0300, handle_page_fault)
+       EXC_XFER_LITE(0x0300, do_page_fault)
 1:
        EXC_XFER_LITE(0x0300, CacheLockingException)
 
index bea13682c9092aecb4c7b2ae6490d1ed8ad60f1d..0d4e4ff77e03ac528773184160b8e55431f8bdd8 100644 (file)
@@ -557,7 +557,7 @@ static long __do_page_fault(struct pt_regs *regs)
        if (likely(entry)) {
                instruction_pointer_set(regs, extable_fixup(entry));
                return 0;
-       } else if (IS_ENABLED(CONFIG_PPC_BOOK3S_64)) {
+       } else if (!IS_ENABLED(CONFIG_PPC_BOOK3E_64)) {
                __bad_page_fault(regs, err);
                return 0;
        } else {