mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-06 06:37:59 +00:00
powerpc/32: Always enable data translation in exception prolog
If the code can use a stack in vm area, it can also use a stack in linear space. Simplify code by removing old non VMAP stack code on PPC32. That means the data translation is now re-enabled early in exception prolog in all cases, not only when using VMAP stacks. While we are touching EXCEPTION_PROLOG macros, remove the unused for_rtas parameter in EXCEPTION_PROLOG_1. Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/7cd6440c60a7e8f4f035b245c57720f51e225aae.1615552866.git.christophe.leroy@csgroup.eu
This commit is contained in:
parent
5747230645
commit
7aa8dd67f1
12 changed files with 17 additions and 216 deletions
|
@ -147,11 +147,9 @@ struct thread_struct {
|
|||
#ifdef CONFIG_PPC_RTAS
|
||||
unsigned long rtas_sp; /* stack pointer for when in RTAS */
|
||||
#endif
|
||||
#endif
|
||||
#if defined(CONFIG_PPC_BOOK3S_32) && defined(CONFIG_PPC_KUAP)
|
||||
unsigned long kuap; /* opened segments for user access */
|
||||
#endif
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
unsigned long srr0;
|
||||
unsigned long srr1;
|
||||
unsigned long dar;
|
||||
|
@ -160,7 +158,7 @@ struct thread_struct {
|
|||
unsigned long r0, r3, r4, r5, r6, r8, r9, r11;
|
||||
unsigned long lr, ctr;
|
||||
#endif
|
||||
#endif
|
||||
#endif /* CONFIG_PPC32 */
|
||||
/* Debug Registers */
|
||||
struct debug_reg debug;
|
||||
#ifdef CONFIG_PPC_FPU_REGS
|
||||
|
|
|
@ -131,7 +131,6 @@ int main(void)
|
|||
OFFSET(KSP_VSID, thread_struct, ksp_vsid);
|
||||
#else /* CONFIG_PPC64 */
|
||||
OFFSET(PGDIR, thread_struct, pgdir);
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
OFFSET(SRR0, thread_struct, srr0);
|
||||
OFFSET(SRR1, thread_struct, srr1);
|
||||
OFFSET(DAR, thread_struct, dar);
|
||||
|
@ -148,7 +147,6 @@ int main(void)
|
|||
OFFSET(THLR, thread_struct, lr);
|
||||
OFFSET(THCTR, thread_struct, ctr);
|
||||
#endif
|
||||
#endif
|
||||
#ifdef CONFIG_SPE
|
||||
OFFSET(THREAD_EVR0, thread_struct, evr[0]);
|
||||
OFFSET(THREAD_ACC, thread_struct, acc);
|
||||
|
|
|
@ -129,7 +129,7 @@ transfer_to_handler:
|
|||
stw r12,_CTR(r11)
|
||||
stw r2,_XER(r11)
|
||||
mfspr r12,SPRN_SPRG_THREAD
|
||||
tovirt_vmstack r12, r12
|
||||
tovirt(r12, r12)
|
||||
beq 2f /* if from user, fix up THREAD.regs */
|
||||
addi r2, r12, -THREAD
|
||||
addi r11,r1,STACK_FRAME_OVERHEAD
|
||||
|
@ -153,8 +153,7 @@ transfer_to_handler:
|
|||
transfer_to_handler_cont:
|
||||
3:
|
||||
mflr r9
|
||||
tovirt_novmstack r2, r2 /* set r2 to current */
|
||||
tovirt_vmstack r9, r9
|
||||
tovirt(r9, r9)
|
||||
lwz r11,0(r9) /* virtual address of handler */
|
||||
lwz r9,4(r9) /* where to go when done */
|
||||
#if defined(CONFIG_PPC_8xx) && defined(CONFIG_PERF_EVENTS)
|
||||
|
@ -933,7 +932,6 @@ _GLOBAL(enter_rtas)
|
|||
lis r6,1f@ha /* physical return address for rtas */
|
||||
addi r6,r6,1f@l
|
||||
tophys(r6,r6)
|
||||
tophys_novmstack r7, r1
|
||||
lwz r8,RTASENTRY(r4)
|
||||
lwz r4,RTASBASE(r4)
|
||||
mfmsr r9
|
||||
|
@ -942,22 +940,19 @@ _GLOBAL(enter_rtas)
|
|||
mtmsr r0 /* disable interrupts so SRR0/1 don't get trashed */
|
||||
li r9,MSR_KERNEL & ~(MSR_IR|MSR_DR)
|
||||
mtlr r6
|
||||
stw r7, THREAD + RTAS_SP(r2)
|
||||
stw r1, THREAD + RTAS_SP(r2)
|
||||
mtspr SPRN_SRR0,r8
|
||||
mtspr SPRN_SRR1,r9
|
||||
rfi
|
||||
1: tophys_novmstack r9, r1
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
1:
|
||||
li r0, MSR_KERNEL & ~MSR_IR /* can take DTLB miss */
|
||||
mtmsr r0
|
||||
isync
|
||||
#endif
|
||||
lwz r8,INT_FRAME_SIZE+4(r9) /* get return address */
|
||||
lwz r9,8(r9) /* original msr value */
|
||||
lwz r8,INT_FRAME_SIZE+4(r1) /* get return address */
|
||||
lwz r9,8(r1) /* original msr value */
|
||||
addi r1,r1,INT_FRAME_SIZE
|
||||
li r0,0
|
||||
tophys_novmstack r7, r2
|
||||
stw r0, THREAD + RTAS_SP(r7)
|
||||
stw r0, THREAD + RTAS_SP(r2)
|
||||
mtspr SPRN_SRR0,r8
|
||||
mtspr SPRN_SRR1,r9
|
||||
rfi /* return to caller */
|
||||
|
|
|
@ -92,9 +92,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX)
|
|||
/* enable use of FP after return */
|
||||
#ifdef CONFIG_PPC32
|
||||
mfspr r5,SPRN_SPRG_THREAD /* current task's THREAD (phys) */
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
tovirt(r5, r5)
|
||||
#endif
|
||||
lwz r4,THREAD_FPEXC_MODE(r5)
|
||||
ori r9,r9,MSR_FP /* enable FP for current */
|
||||
or r9,r9,r4
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
.macro EXCEPTION_PROLOG_0 handle_dar_dsisr=0
|
||||
mtspr SPRN_SPRG_SCRATCH0,r10
|
||||
mtspr SPRN_SPRG_SCRATCH1,r11
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
mfspr r10, SPRN_SPRG_THREAD
|
||||
.if \handle_dar_dsisr
|
||||
#ifdef CONFIG_40x
|
||||
|
@ -37,17 +36,13 @@
|
|||
.endif
|
||||
mfspr r11, SPRN_SRR0
|
||||
stw r11, SRR0(r10)
|
||||
#endif
|
||||
mfspr r11, SPRN_SRR1 /* check whether user or kernel */
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
stw r11, SRR1(r10)
|
||||
#endif
|
||||
mfcr r10
|
||||
andi. r11, r11, MSR_PR
|
||||
.endm
|
||||
|
||||
.macro EXCEPTION_PROLOG_1 for_rtas=0
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
.macro EXCEPTION_PROLOG_1
|
||||
mtspr SPRN_SPRG_SCRATCH2,r1
|
||||
subi r1, r1, INT_FRAME_SIZE /* use r1 if kernel */
|
||||
beq 1f
|
||||
|
@ -55,20 +50,13 @@
|
|||
lwz r1,TASK_STACK-THREAD(r1)
|
||||
addi r1, r1, THREAD_SIZE - INT_FRAME_SIZE
|
||||
1:
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
mtcrf 0x3f, r1
|
||||
bt 32 - THREAD_ALIGN_SHIFT, stack_overflow
|
||||
#else
|
||||
subi r11, r1, INT_FRAME_SIZE /* use r1 if kernel */
|
||||
beq 1f
|
||||
mfspr r11,SPRN_SPRG_THREAD
|
||||
lwz r11,TASK_STACK-THREAD(r11)
|
||||
addi r11, r11, THREAD_SIZE - INT_FRAME_SIZE
|
||||
1: tophys(r11, r11)
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro EXCEPTION_PROLOG_2 handle_dar_dsisr=0
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
LOAD_REG_IMMEDIATE(r11, MSR_KERNEL & ~(MSR_IR | MSR_RI)) /* can take DTLB miss */
|
||||
mtmsr r11
|
||||
isync
|
||||
|
@ -76,11 +64,6 @@
|
|||
stw r11,GPR1(r1)
|
||||
stw r11,0(r1)
|
||||
mr r11, r1
|
||||
#else
|
||||
stw r1,GPR1(r11)
|
||||
stw r1,0(r11)
|
||||
tovirt(r1, r11) /* set new kernel sp */
|
||||
#endif
|
||||
stw r10,_CCR(r11) /* save registers */
|
||||
stw r12,GPR12(r11)
|
||||
stw r9,GPR9(r11)
|
||||
|
@ -90,7 +73,6 @@
|
|||
stw r12,GPR11(r11)
|
||||
mflr r10
|
||||
stw r10,_LINK(r11)
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
mfspr r12, SPRN_SPRG_THREAD
|
||||
tovirt(r12, r12)
|
||||
.if \handle_dar_dsisr
|
||||
|
@ -101,20 +83,12 @@
|
|||
.endif
|
||||
lwz r9, SRR1(r12)
|
||||
lwz r12, SRR0(r12)
|
||||
#else
|
||||
mfspr r12,SPRN_SRR0
|
||||
mfspr r9,SPRN_SRR1
|
||||
#endif
|
||||
#ifdef CONFIG_40x
|
||||
rlwinm r9,r9,0,14,12 /* clear MSR_WE (necessary?) */
|
||||
#elif defined(CONFIG_PPC_8xx)
|
||||
mtspr SPRN_EID, r2 /* Set MSR_RI */
|
||||
#else
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
li r10, MSR_KERNEL & ~MSR_IR /* can take exceptions */
|
||||
#else
|
||||
li r10,MSR_KERNEL & ~(MSR_IR|MSR_DR) /* can take exceptions */
|
||||
#endif
|
||||
mtmsr r10 /* (except for mach check in rtas) */
|
||||
#endif
|
||||
stw r0,GPR0(r11)
|
||||
|
@ -166,59 +140,6 @@
|
|||
b transfer_to_syscall /* jump to handler */
|
||||
.endm
|
||||
|
||||
.macro save_dar_dsisr_on_stack reg1, reg2, sp
|
||||
#ifndef CONFIG_VMAP_STACK
|
||||
#ifdef CONFIG_40x
|
||||
mfspr \reg1, SPRN_DEAR
|
||||
mfspr \reg2, SPRN_ESR
|
||||
#else
|
||||
mfspr \reg1, SPRN_DAR
|
||||
mfspr \reg2, SPRN_DSISR
|
||||
#endif
|
||||
stw \reg1, _DAR(\sp)
|
||||
stw \reg2, _DSISR(\sp)
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro get_and_save_dar_dsisr_on_stack reg1, reg2, sp
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
lwz \reg1, _DAR(\sp)
|
||||
lwz \reg2, _DSISR(\sp)
|
||||
#else
|
||||
save_dar_dsisr_on_stack \reg1, \reg2, \sp
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro tovirt_vmstack dst, src
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
tovirt(\dst, \src)
|
||||
#else
|
||||
.ifnc \dst, \src
|
||||
mr \dst, \src
|
||||
.endif
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro tovirt_novmstack dst, src
|
||||
#ifndef CONFIG_VMAP_STACK
|
||||
tovirt(\dst, \src)
|
||||
#else
|
||||
.ifnc \dst, \src
|
||||
mr \dst, \src
|
||||
.endif
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro tophys_novmstack dst, src
|
||||
#ifndef CONFIG_VMAP_STACK
|
||||
tophys(\dst, \src)
|
||||
#else
|
||||
.ifnc \dst, \src
|
||||
mr \dst, \src
|
||||
.endif
|
||||
#endif
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Note: code which follows this uses cr0.eq (set if from kernel),
|
||||
* r11, r12 (SRR0), and r9 (SRR1).
|
||||
|
@ -266,7 +187,6 @@ label:
|
|||
ret_from_except)
|
||||
|
||||
.macro vmap_stack_overflow_exception
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
#ifdef CONFIG_SMP
|
||||
mfspr r1, SPRN_SPRG_THREAD
|
||||
lwz r1, TASK_CPU - THREAD(r1)
|
||||
|
@ -285,7 +205,6 @@ label:
|
|||
SAVE_NVGPRS(r11)
|
||||
addi r3, r1, STACK_FRAME_OVERHEAD
|
||||
EXC_XFER_STD(0, stack_overflow_exception)
|
||||
#endif
|
||||
.endm
|
||||
|
||||
#endif /* __HEAD_32_H__ */
|
||||
|
|
|
@ -111,12 +111,10 @@ _ENTRY(crit_esr)
|
|||
mfspr r11,SPRN_SRR1
|
||||
stw r10,crit_srr0@l(0)
|
||||
stw r11,crit_srr1@l(0)
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
mfspr r10,SPRN_DEAR
|
||||
mfspr r11,SPRN_ESR
|
||||
stw r10,crit_dear@l(0)
|
||||
stw r11,crit_esr@l(0)
|
||||
#endif
|
||||
mfcr r10 /* save CR in r10 for now */
|
||||
mfspr r11,SPRN_SRR3 /* check whether user or kernel */
|
||||
andi. r11,r11,MSR_PR
|
||||
|
@ -126,7 +124,6 @@ _ENTRY(crit_esr)
|
|||
/* COMING FROM USER MODE */
|
||||
mfspr r11,SPRN_SPRG_THREAD /* if from user, start at top of */
|
||||
lwz r11,TASK_STACK-THREAD(r11) /* this thread's kernel stack */
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
1: stw r1,crit_r1@l(0)
|
||||
addi r1,r11,THREAD_SIZE-INT_FRAME_SIZE /* Alloc an excpt frm */
|
||||
LOAD_REG_IMMEDIATE(r11,MSR_KERNEL & ~(MSR_IR | MSR_RI))
|
||||
|
@ -136,35 +133,18 @@ _ENTRY(crit_esr)
|
|||
stw r11,GPR1(r1)
|
||||
stw r11,0(r1)
|
||||
mr r11,r1
|
||||
#else
|
||||
1: addi r11,r11,THREAD_SIZE-INT_FRAME_SIZE /* Alloc an excpt frm */
|
||||
tophys(r11,r11)
|
||||
stw r1,GPR1(r11)
|
||||
stw r1,0(r11)
|
||||
tovirt(r1,r11)
|
||||
#endif
|
||||
stw r10,_CCR(r11) /* save various registers */
|
||||
stw r12,GPR12(r11)
|
||||
stw r9,GPR9(r11)
|
||||
mflr r10
|
||||
stw r10,_LINK(r11)
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
lis r9,PAGE_OFFSET@ha
|
||||
lwz r10,crit_r10@l(r9)
|
||||
lwz r12,crit_r11@l(r9)
|
||||
#else
|
||||
lwz r10,crit_r10@l(0)
|
||||
lwz r12,crit_r11@l(0)
|
||||
#endif
|
||||
stw r10,GPR10(r11)
|
||||
stw r12,GPR11(r11)
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
lwz r12,crit_dear@l(r9)
|
||||
lwz r9,crit_esr@l(r9)
|
||||
#else
|
||||
mfspr r12,SPRN_DEAR /* save DEAR and ESR in the frame */
|
||||
mfspr r9,SPRN_ESR /* in them at the point where the */
|
||||
#endif
|
||||
stw r12,_DEAR(r11) /* since they may have had stuff */
|
||||
stw r9,_ESR(r11) /* exception was taken */
|
||||
mfspr r12,SPRN_SRR2
|
||||
|
@ -220,7 +200,6 @@ _ENTRY(crit_esr)
|
|||
*/
|
||||
START_EXCEPTION(0x0300, DataStorage)
|
||||
EXCEPTION_PROLOG handle_dar_dsisr=1
|
||||
save_dar_dsisr_on_stack r4, r5, r11
|
||||
EXC_XFER_LITE(0x300, handle_page_fault)
|
||||
|
||||
/*
|
||||
|
@ -240,14 +219,12 @@ _ENTRY(crit_esr)
|
|||
/* 0x0600 - Alignment Exception */
|
||||
START_EXCEPTION(0x0600, Alignment)
|
||||
EXCEPTION_PROLOG handle_dar_dsisr=1
|
||||
save_dar_dsisr_on_stack r4, r5, r11
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
EXC_XFER_STD(0x600, alignment_exception)
|
||||
|
||||
/* 0x0700 - Program Exception */
|
||||
START_EXCEPTION(0x0700, ProgramCheck)
|
||||
EXCEPTION_PROLOG handle_dar_dsisr=1
|
||||
save_dar_dsisr_on_stack r4, r5, r11
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
EXC_XFER_STD(0x700, program_check_exception)
|
||||
|
||||
|
|
|
@ -124,7 +124,6 @@ instruction_counter:
|
|||
. = 0x200
|
||||
MachineCheck:
|
||||
EXCEPTION_PROLOG handle_dar_dsisr=1
|
||||
save_dar_dsisr_on_stack r4, r5, r11
|
||||
li r6, RPN_PATTERN
|
||||
mtspr SPRN_DAR, r6 /* Tag DAR, to be used in DTLB Error */
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
|
@ -137,7 +136,6 @@ MachineCheck:
|
|||
. = 0x600
|
||||
Alignment:
|
||||
EXCEPTION_PROLOG handle_dar_dsisr=1
|
||||
save_dar_dsisr_on_stack r4, r5, r11
|
||||
li r6, RPN_PATTERN
|
||||
mtspr SPRN_DAR, r6 /* Tag DAR, to be used in DTLB Error */
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
|
@ -333,21 +331,16 @@ DataTLBError:
|
|||
cmpwi cr1, r11, RPN_PATTERN
|
||||
beq- cr1, FixupDAR /* must be a buggy dcbX, icbi insn. */
|
||||
DARFixed:/* Return from dcbx instruction bug workaround */
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
li r11, RPN_PATTERN
|
||||
mtspr SPRN_DAR, r11 /* Tag DAR, to be used in DTLB Error */
|
||||
#endif
|
||||
EXCEPTION_PROLOG_1
|
||||
EXCEPTION_PROLOG_2 handle_dar_dsisr=1
|
||||
get_and_save_dar_dsisr_on_stack r4, r5, r11
|
||||
lwz r4, _DAR(r11)
|
||||
lwz r5, _DSISR(r11)
|
||||
andis. r10,r5,DSISR_NOHPTE@h
|
||||
beq+ .Ldtlbie
|
||||
tlbie r4
|
||||
.Ldtlbie:
|
||||
#ifndef CONFIG_VMAP_STACK
|
||||
li r10,RPN_PATTERN
|
||||
mtspr SPRN_DAR,r10 /* Tag DAR, to be used in DTLB Error */
|
||||
#endif
|
||||
/* 0x300 is DataAccess exception, needed by bad_page_fault() */
|
||||
EXC_XFER_LITE(0x300, handle_page_fault)
|
||||
|
||||
|
@ -364,10 +357,6 @@ do_databreakpoint:
|
|||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
mfspr r4,SPRN_BAR
|
||||
stw r4,_DAR(r11)
|
||||
#ifndef CONFIG_VMAP_STACK
|
||||
mfspr r5,SPRN_DSISR
|
||||
stw r5,_DSISR(r11)
|
||||
#endif
|
||||
EXC_XFER_STD(0x1c00, do_break)
|
||||
|
||||
. = 0x1c00
|
||||
|
@ -510,14 +499,10 @@ FixupDAR:/* Entry point for dcbx workaround. */
|
|||
152:
|
||||
mfdar r11
|
||||
mtctr r11 /* restore ctr reg from DAR */
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
mfspr r11, SPRN_SPRG_THREAD
|
||||
stw r10, DAR(r11)
|
||||
mfspr r10, SPRN_DSISR
|
||||
stw r10, DSISR(r11)
|
||||
#else
|
||||
mtdar r10 /* save fault EA to DAR */
|
||||
#endif
|
||||
mfspr r10,SPRN_M_TW
|
||||
b DARFixed /* Go back to normal TLB handling */
|
||||
|
||||
|
|
|
@ -260,21 +260,14 @@ __secondary_hold_acknowledge:
|
|||
MachineCheck:
|
||||
EXCEPTION_PROLOG_0
|
||||
#ifdef CONFIG_PPC_CHRP
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
mtspr SPRN_SPRG_SCRATCH2,r1
|
||||
mfspr r1, SPRN_SPRG_THREAD
|
||||
lwz r1, RTAS_SP(r1)
|
||||
cmpwi cr1, r1, 0
|
||||
bne cr1, 7f
|
||||
mfspr r1, SPRN_SPRG_SCRATCH2
|
||||
#else
|
||||
mfspr r11, SPRN_SPRG_THREAD
|
||||
lwz r11, RTAS_SP(r11)
|
||||
cmpwi cr1, r11, 0
|
||||
bne cr1, 7f
|
||||
#endif
|
||||
#endif /* CONFIG_PPC_CHRP */
|
||||
EXCEPTION_PROLOG_1 for_rtas=1
|
||||
EXCEPTION_PROLOG_1
|
||||
7: EXCEPTION_PROLOG_2
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
#ifdef CONFIG_PPC_CHRP
|
||||
|
@ -288,7 +281,6 @@ MachineCheck:
|
|||
. = 0x300
|
||||
DO_KVM 0x300
|
||||
DataAccess:
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
#ifdef CONFIG_PPC_BOOK3S_604
|
||||
BEGIN_MMU_FTR_SECTION
|
||||
mtspr SPRN_SPRG_SCRATCH2,r10
|
||||
|
@ -310,29 +302,11 @@ ALT_MMU_FTR_SECTION_END_IFSET(MMU_FTR_HPTE_TABLE)
|
|||
1: EXCEPTION_PROLOG_0 handle_dar_dsisr=1
|
||||
EXCEPTION_PROLOG_1
|
||||
b handle_page_fault_tramp_1
|
||||
#else /* CONFIG_VMAP_STACK */
|
||||
EXCEPTION_PROLOG handle_dar_dsisr=1
|
||||
get_and_save_dar_dsisr_on_stack r4, r5, r11
|
||||
#ifdef CONFIG_PPC_BOOK3S_604
|
||||
BEGIN_MMU_FTR_SECTION
|
||||
andis. r0, r5, (DSISR_BAD_FAULT_32S | DSISR_DABRMATCH)@h
|
||||
bne handle_page_fault_tramp_2 /* if not, try to put a PTE */
|
||||
rlwinm r3, r5, 32 - 15, 21, 21 /* DSISR_STORE -> _PAGE_RW */
|
||||
bl hash_page
|
||||
b handle_page_fault_tramp_1
|
||||
MMU_FTR_SECTION_ELSE
|
||||
#endif
|
||||
b handle_page_fault_tramp_2
|
||||
#ifdef CONFIG_PPC_BOOK3S_604
|
||||
ALT_MMU_FTR_SECTION_END_IFSET(MMU_FTR_HPTE_TABLE)
|
||||
#endif
|
||||
#endif /* CONFIG_VMAP_STACK */
|
||||
|
||||
/* Instruction access exception. */
|
||||
. = 0x400
|
||||
DO_KVM 0x400
|
||||
InstructionAccess:
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
mtspr SPRN_SPRG_SCRATCH0,r10
|
||||
mtspr SPRN_SPRG_SCRATCH1,r11
|
||||
mfspr r10, SPRN_SPRG_THREAD
|
||||
|
@ -353,18 +327,6 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_HPTE_TABLE)
|
|||
|
||||
EXCEPTION_PROLOG_1
|
||||
EXCEPTION_PROLOG_2
|
||||
#else /* CONFIG_VMAP_STACK */
|
||||
EXCEPTION_PROLOG
|
||||
andis. r0,r9,SRR1_ISI_NOPT@h /* no pte found? */
|
||||
beq 1f /* if so, try to put a PTE */
|
||||
li r3,0 /* into the hash table */
|
||||
mr r4,r12 /* SRR0 is fault address */
|
||||
#ifdef CONFIG_PPC_BOOK3S_604
|
||||
BEGIN_MMU_FTR_SECTION
|
||||
bl hash_page
|
||||
END_MMU_FTR_SECTION_IFSET(MMU_FTR_HPTE_TABLE)
|
||||
#endif
|
||||
#endif /* CONFIG_VMAP_STACK */
|
||||
andis. r5,r9,DSISR_SRR1_MATCH_32S@h /* Filter relevant SRR1 bits */
|
||||
stw r5, _DSISR(r11)
|
||||
stw r12, _DAR(r11)
|
||||
|
@ -378,7 +340,6 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_HPTE_TABLE)
|
|||
DO_KVM 0x600
|
||||
Alignment:
|
||||
EXCEPTION_PROLOG handle_dar_dsisr=1
|
||||
save_dar_dsisr_on_stack r4, r5, r11
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
b alignment_exception_tramp
|
||||
|
||||
|
@ -689,18 +650,13 @@ alignment_exception_tramp:
|
|||
EXC_XFER_STD(0x600, alignment_exception)
|
||||
|
||||
handle_page_fault_tramp_1:
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
EXCEPTION_PROLOG_2 handle_dar_dsisr=1
|
||||
#endif
|
||||
lwz r5, _DSISR(r11)
|
||||
/* fall through */
|
||||
handle_page_fault_tramp_2:
|
||||
andis. r0, r5, DSISR_DABRMATCH@h
|
||||
bne- 1f
|
||||
EXC_XFER_LITE(0x300, handle_page_fault)
|
||||
1: EXC_XFER_STD(0x300, do_break)
|
||||
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
#ifdef CONFIG_PPC_BOOK3S_604
|
||||
.macro save_regs_thread thread
|
||||
stw r0, THR0(\thread)
|
||||
|
@ -775,6 +731,7 @@ fast_hash_page_return:
|
|||
rfi
|
||||
#endif /* CONFIG_PPC_BOOK3S_604 */
|
||||
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
stack_overflow:
|
||||
vmap_stack_overflow_exception
|
||||
#endif
|
||||
|
|
|
@ -145,9 +145,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
|
|||
|
||||
/*
|
||||
* Return from NAP/DOZE mode, restore some CPU specific registers,
|
||||
* we are called with DR/IR still off and r2 containing physical
|
||||
* address of current. R11 points to the exception frame (physical
|
||||
* address). We have to preserve r10.
|
||||
* R11 points to the exception frame. We have to preserve r10.
|
||||
*/
|
||||
_GLOBAL(power_save_ppc32_restore)
|
||||
lwz r9,_LINK(r11) /* interrupted in ppc6xx_idle: */
|
||||
|
@ -166,11 +164,7 @@ BEGIN_FTR_SECTION
|
|||
mfspr r9,SPRN_HID0
|
||||
andis. r9,r9,HID0_NAP@h
|
||||
beq 1f
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
addis r9, r11, nap_save_msscr0@ha
|
||||
#else
|
||||
addis r9,r11,(nap_save_msscr0-KERNELBASE)@ha
|
||||
#endif
|
||||
lwz r9,nap_save_msscr0@l(r9)
|
||||
mtspr SPRN_MSSCR0, r9
|
||||
sync
|
||||
|
@ -178,11 +172,7 @@ BEGIN_FTR_SECTION
|
|||
1:
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_NAP_DISABLE_L2_PR)
|
||||
BEGIN_FTR_SECTION
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
addis r9, r11, nap_save_hid1@ha
|
||||
#else
|
||||
addis r9,r11,(nap_save_hid1-KERNELBASE)@ha
|
||||
#endif
|
||||
lwz r9,nap_save_hid1@l(r9)
|
||||
mtspr SPRN_HID1, r9
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_DUAL_PLL_750FX)
|
||||
|
|
|
@ -74,8 +74,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP)
|
|||
|
||||
/*
|
||||
* Return from NAP/DOZE mode, restore some CPU specific registers,
|
||||
* r2 containing physical address of current.
|
||||
* r11 points to the exception frame (physical address).
|
||||
* r2 containing address of current.
|
||||
* r11 points to the exception frame.
|
||||
* We have to preserve r10.
|
||||
*/
|
||||
_GLOBAL(power_save_ppc32_restore)
|
||||
|
|
|
@ -67,9 +67,7 @@ _GLOBAL(load_up_altivec)
|
|||
#ifdef CONFIG_PPC32
|
||||
mfspr r5,SPRN_SPRG_THREAD /* current task's THREAD (phys) */
|
||||
oris r9,r9,MSR_VEC@h
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
tovirt(r5, r5)
|
||||
#endif
|
||||
#else
|
||||
ld r4,PACACURRENT(r13)
|
||||
addi r5,r4,THREAD /* Get THREAD */
|
||||
|
|
|
@ -140,10 +140,6 @@ _GLOBAL(hash_page)
|
|||
bne- .Lretry /* retry if someone got there first */
|
||||
|
||||
mfsrin r3,r4 /* get segment reg for segment */
|
||||
#ifndef CONFIG_VMAP_STACK
|
||||
mfctr r0
|
||||
stw r0,_CTR(r11)
|
||||
#endif
|
||||
bl create_hpte /* add the hash table entry */
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
@ -152,17 +148,7 @@ _GLOBAL(hash_page)
|
|||
li r0,0
|
||||
stw r0, (mmu_hash_lock - PAGE_OFFSET)@l(r8)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
b fast_hash_page_return
|
||||
#else
|
||||
/* Return from the exception */
|
||||
lwz r5,_CTR(r11)
|
||||
mtctr r5
|
||||
lwz r0,GPR0(r11)
|
||||
lwz r8,GPR8(r11)
|
||||
b fast_exception_return
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
.Lhash_page_out:
|
||||
|
|
Loading…
Add table
Reference in a new issue