mirror of https://gitee.com/openkylin/linux.git
powerpc/32: Call bad_page_fault() from do_page_fault()
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
This commit is contained in:
parent
e72915560b
commit
af6f2ce84b
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -462,7 +462,7 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_EMB_HV)
|
|||
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 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_EMB_HV)
|
|||
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) \
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue