Commit 9b6150fb authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman

powerpc/32: Enable instruction translation at the same time as data translation

On 40x and 8xx, kernel text is pinned.
On book3s/32, kernel text is mapped by BATs.

Enable instruction translation at the same time as data translation, it
makes things simpler.

In syscall handler, MSR_RI can also be set at the same time because
srr0/srr1 are already saved and r1 is set properly.

On booke, translation is always on, so at the end all PPC32
have translation on early. Just update msr.

Also update comment in power_save_ppc32_restore().
Signed-off-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/5269c7e5f5d2117358af3a89744d75a116be27b0.1615552867.git.christophe.leroy@csgroup.eu
parent 5b1c9a0d
...@@ -153,19 +153,11 @@ transfer_to_handler: ...@@ -153,19 +153,11 @@ transfer_to_handler:
transfer_to_handler_cont: transfer_to_handler_cont:
3: 3:
mflr r9 mflr r9
tovirt(r9, r9)
lwz r11,0(r9) /* virtual address of handler */ lwz r11,0(r9) /* virtual address of handler */
lwz r9,4(r9) /* where to go when done */ lwz r9,4(r9) /* where to go when done */
#if defined(CONFIG_PPC_8xx) && defined(CONFIG_PERF_EVENTS) mtctr r11
mtspr SPRN_NRI, r0
#endif
mtspr SPRN_SRR0,r11
mtspr SPRN_SRR1,r10
mtlr r9 mtlr r9
rfi /* jump to handler, enable MMU */ bctr /* jump to handler */
#ifdef CONFIG_40x
b . /* Prevent prefetch past rfi */
#endif
#if defined (CONFIG_PPC_BOOK3S_32) || defined(CONFIG_E500) #if defined (CONFIG_PPC_BOOK3S_32) || defined(CONFIG_E500)
4: rlwinm r12,r12,0,~_TLF_NAPPING 4: rlwinm r12,r12,0,~_TLF_NAPPING
...@@ -444,8 +436,6 @@ fee_restarts: ...@@ -444,8 +436,6 @@ fee_restarts:
li r10,-1 li r10,-1
stw r10,_TRAP(r11) stw r10,_TRAP(r11)
addi r3,r1,STACK_FRAME_OVERHEAD addi r3,r1,STACK_FRAME_OVERHEAD
lis r10,MSR_KERNEL@h
ori r10,r10,MSR_KERNEL@l
bl transfer_to_handler_full bl transfer_to_handler_full
.long unrecoverable_exception .long unrecoverable_exception
.long ret_from_except .long ret_from_except
...@@ -945,16 +935,20 @@ _GLOBAL(enter_rtas) ...@@ -945,16 +935,20 @@ _GLOBAL(enter_rtas)
mtspr SPRN_SRR1,r9 mtspr SPRN_SRR1,r9
rfi rfi
1: 1:
li r0, MSR_KERNEL & ~MSR_IR /* can take DTLB miss */ lis r8, 1f@h
mtmsr r0 ori r8, r8, 1f@l
isync LOAD_REG_IMMEDIATE(r9,MSR_KERNEL)
mtspr SPRN_SRR0,r8
mtspr SPRN_SRR1,r9
rfi /* Reactivate MMU translation */
1:
lwz r8,INT_FRAME_SIZE+4(r1) /* get return address */ lwz r8,INT_FRAME_SIZE+4(r1) /* get return address */
lwz r9,8(r1) /* original msr value */ lwz r9,8(r1) /* original msr value */
addi r1,r1,INT_FRAME_SIZE addi r1,r1,INT_FRAME_SIZE
li r0,0 li r0,0
stw r0, THREAD + RTAS_SP(r2) stw r0, THREAD + RTAS_SP(r2)
mtspr SPRN_SRR0,r8 mtlr r8
mtspr SPRN_SRR1,r9 mtmsr r9
rfi /* return to caller */ blr /* return to caller */
_ASM_NOKPROBE_SYMBOL(enter_rtas) _ASM_NOKPROBE_SYMBOL(enter_rtas)
#endif /* CONFIG_PPC_RTAS */ #endif /* CONFIG_PPC_RTAS */
...@@ -63,10 +63,14 @@ ...@@ -63,10 +63,14 @@
mtspr SPRN_DAR, r11 /* Tag DAR, to be used in DTLB Error */ mtspr SPRN_DAR, r11 /* Tag DAR, to be used in DTLB Error */
.endif .endif
#endif #endif
LOAD_REG_IMMEDIATE(r11, MSR_KERNEL & ~(MSR_IR | MSR_RI)) /* can take DTLB miss */ LOAD_REG_IMMEDIATE(r11, MSR_KERNEL & ~MSR_RI) /* re-enable MMU */
mtmsr r11 mtspr SPRN_SRR1, r11
isync lis r11, 1f@h
ori r11, r11, 1f@l
mtspr SPRN_SRR0, r11
mfspr r11, SPRN_SPRG_SCRATCH2 mfspr r11, SPRN_SPRG_SCRATCH2
rfi
1:
stw r11,GPR1(r1) stw r11,GPR1(r1)
stw r11,0(r1) stw r11,0(r1)
mr r11, r1 mr r11, r1
...@@ -94,7 +98,7 @@ ...@@ -94,7 +98,7 @@
#elif defined(CONFIG_PPC_8xx) #elif defined(CONFIG_PPC_8xx)
mtspr SPRN_EID, r2 /* Set MSR_RI */ mtspr SPRN_EID, r2 /* Set MSR_RI */
#else #else
li r10, MSR_KERNEL & ~MSR_IR /* can take exceptions */ li r10, MSR_KERNEL /* can take exceptions */
mtmsr r10 /* (except for mach check in rtas) */ mtmsr r10 /* (except for mach check in rtas) */
#endif #endif
stw r0,GPR0(r11) stw r0,GPR0(r11)
...@@ -179,7 +183,6 @@ ...@@ -179,7 +183,6 @@
#define EXC_XFER_TEMPLATE(hdlr, trap, msr, tfer, ret) \ #define EXC_XFER_TEMPLATE(hdlr, trap, msr, tfer, ret) \
li r10,trap; \ li r10,trap; \
stw r10,_TRAP(r11); \ stw r10,_TRAP(r11); \
LOAD_REG_IMMEDIATE(r10, msr); \
bl tfer; \ bl tfer; \
.long hdlr; \ .long hdlr; \
.long ret .long ret
......
...@@ -126,9 +126,13 @@ _ENTRY(crit_esr) ...@@ -126,9 +126,13 @@ _ENTRY(crit_esr)
lwz r11,TASK_STACK-THREAD(r11) /* this thread's kernel stack */ lwz r11,TASK_STACK-THREAD(r11) /* this thread's kernel stack */
1: stw r1,crit_r1@l(0) 1: stw r1,crit_r1@l(0)
addi r1,r11,THREAD_SIZE-INT_FRAME_SIZE /* Alloc an excpt frm */ addi r1,r11,THREAD_SIZE-INT_FRAME_SIZE /* Alloc an excpt frm */
LOAD_REG_IMMEDIATE(r11,MSR_KERNEL & ~(MSR_IR | MSR_RI)) LOAD_REG_IMMEDIATE(r11, MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)) /* re-enable MMU */
mtmsr r11 mtspr SPRN_SRR1, r11
isync lis r11, 1f@h
ori r11, r11, 1f@l
mtspr SPRN_SRR0, r11
rfi
1:
lwz r11,crit_r1@l(0) lwz r11,crit_r1@l(0)
stw r11,GPR1(r1) stw r11,GPR1(r1)
stw r11,0(r1) stw r11,0(r1)
......
...@@ -53,6 +53,8 @@ END_BTB_FLUSH_SECTION ...@@ -53,6 +53,8 @@ END_BTB_FLUSH_SECTION
mfspr r11, SPRN_SRR1; \ mfspr r11, SPRN_SRR1; \
DO_KVM BOOKE_INTERRUPT_##intno SPRN_SRR1; \ DO_KVM BOOKE_INTERRUPT_##intno SPRN_SRR1; \
andi. r11, r11, MSR_PR; /* check whether user or kernel */\ andi. r11, r11, MSR_PR; /* check whether user or kernel */\
LOAD_REG_IMMEDIATE(r11, MSR_KERNEL); \
mtmsr r11; \
mr r11, r1; \ mr r11, r1; \
beq 1f; \ beq 1f; \
BOOKE_CLEAR_BTB(r11) \ BOOKE_CLEAR_BTB(r11) \
...@@ -192,6 +194,8 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_EMB_HV) ...@@ -192,6 +194,8 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_EMB_HV)
DO_KVM BOOKE_INTERRUPT_##intno exc_level_srr1; \ DO_KVM BOOKE_INTERRUPT_##intno exc_level_srr1; \
BOOKE_CLEAR_BTB(r10) \ BOOKE_CLEAR_BTB(r10) \
andi. r11,r11,MSR_PR; \ andi. r11,r11,MSR_PR; \
LOAD_REG_IMMEDIATE(r11, MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)); \
mtmsr r11; \
mfspr r11,SPRN_SPRG_THREAD; /* if from user, start at top of */\ mfspr r11,SPRN_SPRG_THREAD; /* if from user, start at top of */\
lwz r11, TASK_STACK - THREAD(r11); /* this thread's kernel stack */\ lwz r11, TASK_STACK - THREAD(r11); /* this thread's kernel stack */\
addi r11,r11,EXC_LVL_FRAME_OVERHEAD; /* allocate stack frame */\ addi r11,r11,EXC_LVL_FRAME_OVERHEAD; /* allocate stack frame */\
...@@ -282,8 +286,6 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_EMB_HV) ...@@ -282,8 +286,6 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_EMB_HV)
#define EXC_XFER_TEMPLATE(hdlr, trap, msr, tfer, ret) \ #define EXC_XFER_TEMPLATE(hdlr, trap, msr, tfer, ret) \
li r10,trap; \ li r10,trap; \
stw r10,_TRAP(r11); \ stw r10,_TRAP(r11); \
lis r10,msr@h; \
ori r10,r10,msr@l; \
bl tfer; \ bl tfer; \
.long hdlr; \ .long hdlr; \
.long ret .long ret
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment