Merge tag 'riscv-for-linus-5.14-rc7' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / arch / powerpc / kernel / entry_32.S
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  *  PowerPC version
4  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
5  *  Rewritten by Cort Dougan (cort@fsmlabs.com) for PReP
6  *    Copyright (C) 1996 Cort Dougan <cort@fsmlabs.com>
7  *  Adapted for Power Macintosh by Paul Mackerras.
8  *  Low-level exception handlers and MMU support
9  *  rewritten by Paul Mackerras.
10  *    Copyright (C) 1996 Paul Mackerras.
11  *  MPC8xx modifications Copyright (C) 1997 Dan Malek (dmalek@jlc.net).
12  *
13  *  This file contains the system call entry code, context switch
14  *  code, and exception/interrupt return code for PowerPC.
15  */
16
17 #include <linux/errno.h>
18 #include <linux/err.h>
19 #include <linux/sys.h>
20 #include <linux/threads.h>
21 #include <asm/reg.h>
22 #include <asm/page.h>
23 #include <asm/mmu.h>
24 #include <asm/cputable.h>
25 #include <asm/thread_info.h>
26 #include <asm/ppc_asm.h>
27 #include <asm/asm-offsets.h>
28 #include <asm/unistd.h>
29 #include <asm/ptrace.h>
30 #include <asm/export.h>
31 #include <asm/feature-fixups.h>
32 #include <asm/barrier.h>
33 #include <asm/kup.h>
34 #include <asm/bug.h>
35 #include <asm/interrupt.h>
36
37 #include "head_32.h"
38
39 /*
40  * powerpc relies on return from interrupt/syscall being context synchronising
41  * (which rfi is) to support ARCH_HAS_MEMBARRIER_SYNC_CORE without additional
42  * synchronisation instructions.
43  */
44
45 /*
46  * Align to 4k in order to ensure that all functions modyfing srr0/srr1
47  * fit into one page in order to not encounter a TLB miss between the
48  * modification of srr0/srr1 and the associated rfi.
49  */
50         .align  12
51
52 #if defined(CONFIG_PPC_BOOK3S_32) || defined(CONFIG_E500)
53         .globl  prepare_transfer_to_handler
54 prepare_transfer_to_handler:
55         /* if from kernel, check interrupted DOZE/NAP mode */
56         lwz     r12,TI_LOCAL_FLAGS(r2)
57         mtcrf   0x01,r12
58         bt-     31-TLF_NAPPING,4f
59         bt-     31-TLF_SLEEPING,7f
60         blr
61
62 4:      rlwinm  r12,r12,0,~_TLF_NAPPING
63         stw     r12,TI_LOCAL_FLAGS(r2)
64         b       power_save_ppc32_restore
65
66 7:      rlwinm  r12,r12,0,~_TLF_SLEEPING
67         stw     r12,TI_LOCAL_FLAGS(r2)
68         lwz     r9,_MSR(r11)            /* if sleeping, clear MSR.EE */
69         rlwinm  r9,r9,0,~MSR_EE
70         lwz     r12,_LINK(r11)          /* and return to address in LR */
71         lwz     r2, GPR2(r11)
72         b       fast_exception_return
73 _ASM_NOKPROBE_SYMBOL(prepare_transfer_to_handler)
74 #endif /* CONFIG_PPC_BOOK3S_32 || CONFIG_E500 */
75
76         .globl  transfer_to_syscall
77 transfer_to_syscall:
78         stw     r11, GPR1(r1)
79         stw     r11, 0(r1)
80         mflr    r12
81         stw     r12, _LINK(r1)
82 #if defined(CONFIG_BOOKE) || defined(CONFIG_40x)
83         rlwinm  r9,r9,0,14,12           /* clear MSR_WE (necessary?) */
84 #endif
85         lis     r12,STACK_FRAME_REGS_MARKER@ha /* exception frame marker */
86         SAVE_GPR(2, r1)
87         addi    r12,r12,STACK_FRAME_REGS_MARKER@l
88         stw     r9,_MSR(r1)
89         li      r2, INTERRUPT_SYSCALL
90         stw     r12,8(r1)
91         stw     r2,_TRAP(r1)
92         SAVE_GPR(0, r1)
93         SAVE_4GPRS(3, r1)
94         SAVE_2GPRS(7, r1)
95         addi    r2,r10,-THREAD
96         SAVE_NVGPRS(r1)
97
98         /* Calling convention has r9 = orig r0, r10 = regs */
99         addi    r10,r1,STACK_FRAME_OVERHEAD
100         mr      r9,r0
101         bl      system_call_exception
102
103 ret_from_syscall:
104         addi    r4,r1,STACK_FRAME_OVERHEAD
105         li      r5,0
106         bl      syscall_exit_prepare
107 #ifdef CONFIG_PPC_47x
108         lis     r4,icache_44x_need_flush@ha
109         lwz     r5,icache_44x_need_flush@l(r4)
110         cmplwi  cr0,r5,0
111         bne-    2f
112 #endif /* CONFIG_PPC_47x */
113         lwz     r4,_LINK(r1)
114         lwz     r5,_CCR(r1)
115         mtlr    r4
116         lwz     r7,_NIP(r1)
117         lwz     r8,_MSR(r1)
118         cmpwi   r3,0
119         lwz     r3,GPR3(r1)
120 syscall_exit_finish:
121         mtspr   SPRN_SRR0,r7
122         mtspr   SPRN_SRR1,r8
123
124         bne     3f
125         mtcr    r5
126
127 1:      lwz     r2,GPR2(r1)
128         lwz     r1,GPR1(r1)
129         rfi
130 #ifdef CONFIG_40x
131         b .     /* Prevent prefetch past rfi */
132 #endif
133
134 3:      mtcr    r5
135         lwz     r4,_CTR(r1)
136         lwz     r5,_XER(r1)
137         REST_NVGPRS(r1)
138         mtctr   r4
139         mtxer   r5
140         lwz     r0,GPR0(r1)
141         lwz     r3,GPR3(r1)
142         REST_8GPRS(4,r1)
143         lwz     r12,GPR12(r1)
144         b       1b
145
146 #ifdef CONFIG_44x
147 2:      li      r7,0
148         iccci   r0,r0
149         stw     r7,icache_44x_need_flush@l(r4)
150         b       1b
151 #endif  /* CONFIG_44x */
152
153         .globl  ret_from_fork
154 ret_from_fork:
155         REST_NVGPRS(r1)
156         bl      schedule_tail
157         li      r3,0
158         b       ret_from_syscall
159
160         .globl  ret_from_kernel_thread
161 ret_from_kernel_thread:
162         REST_NVGPRS(r1)
163         bl      schedule_tail
164         mtlr    r14
165         mr      r3,r15
166         PPC440EP_ERR42
167         blrl
168         li      r3,0
169         b       ret_from_syscall
170
171 /*
172  * This routine switches between two different tasks.  The process
173  * state of one is saved on its kernel stack.  Then the state
174  * of the other is restored from its kernel stack.  The memory
175  * management hardware is updated to the second process's state.
176  * Finally, we can return to the second process.
177  * On entry, r3 points to the THREAD for the current task, r4
178  * points to the THREAD for the new task.
179  *
180  * This routine is always called with interrupts disabled.
181  *
182  * Note: there are two ways to get to the "going out" portion
183  * of this code; either by coming in via the entry (_switch)
184  * or via "fork" which must set up an environment equivalent
185  * to the "_switch" path.  If you change this , you'll have to
186  * change the fork code also.
187  *
188  * The code which creates the new task context is in 'copy_thread'
189  * in arch/ppc/kernel/process.c
190  */
191 _GLOBAL(_switch)
192         stwu    r1,-INT_FRAME_SIZE(r1)
193         mflr    r0
194         stw     r0,INT_FRAME_SIZE+4(r1)
195         /* r3-r12 are caller saved -- Cort */
196         SAVE_NVGPRS(r1)
197         stw     r0,_NIP(r1)     /* Return to switch caller */
198         mfcr    r10
199         stw     r10,_CCR(r1)
200         stw     r1,KSP(r3)      /* Set old stack pointer */
201
202 #ifdef CONFIG_SMP
203         /* We need a sync somewhere here to make sure that if the
204          * previous task gets rescheduled on another CPU, it sees all
205          * stores it has performed on this one.
206          */
207         sync
208 #endif /* CONFIG_SMP */
209
210         tophys(r0,r4)
211         mtspr   SPRN_SPRG_THREAD,r0     /* Update current THREAD phys addr */
212         lwz     r1,KSP(r4)      /* Load new stack pointer */
213
214         /* save the old current 'last' for return value */
215         mr      r3,r2
216         addi    r2,r4,-THREAD   /* Update current */
217
218         lwz     r0,_CCR(r1)
219         mtcrf   0xFF,r0
220         /* r3-r12 are destroyed -- Cort */
221         REST_NVGPRS(r1)
222
223         lwz     r4,_NIP(r1)     /* Return to _switch caller in new task */
224         mtlr    r4
225         addi    r1,r1,INT_FRAME_SIZE
226         blr
227
228         .globl  fast_exception_return
229 fast_exception_return:
230 #if !(defined(CONFIG_4xx) || defined(CONFIG_BOOKE))
231         andi.   r10,r9,MSR_RI           /* check for recoverable interrupt */
232         beq     3f                      /* if not, we've got problems */
233 #endif
234
235 2:      REST_4GPRS(3, r11)
236         lwz     r10,_CCR(r11)
237         REST_2GPRS(1, r11)
238         mtcr    r10
239         lwz     r10,_LINK(r11)
240         mtlr    r10
241         /* Clear the exception_marker on the stack to avoid confusing stacktrace */
242         li      r10, 0
243         stw     r10, 8(r11)
244         REST_GPR(10, r11)
245 #if defined(CONFIG_PPC_8xx) && defined(CONFIG_PERF_EVENTS)
246         mtspr   SPRN_NRI, r0
247 #endif
248         mtspr   SPRN_SRR1,r9
249         mtspr   SPRN_SRR0,r12
250         REST_GPR(9, r11)
251         REST_GPR(12, r11)
252         lwz     r11,GPR11(r11)
253         rfi
254 #ifdef CONFIG_40x
255         b .     /* Prevent prefetch past rfi */
256 #endif
257 _ASM_NOKPROBE_SYMBOL(fast_exception_return)
258
259 /* aargh, a nonrecoverable interrupt, panic */
260 /* aargh, we don't know which trap this is */
261 3:
262         li      r10,-1
263         stw     r10,_TRAP(r11)
264         prepare_transfer_to_handler
265         bl      unrecoverable_exception
266         trap    /* should not get here */
267
268         .globl interrupt_return
269 interrupt_return:
270         lwz     r4,_MSR(r1)
271         addi    r3,r1,STACK_FRAME_OVERHEAD
272         andi.   r0,r4,MSR_PR
273         beq     .Lkernel_interrupt_return
274         bl      interrupt_exit_user_prepare
275         cmpwi   r3,0
276         bne-    .Lrestore_nvgprs
277
278 .Lfast_user_interrupt_return:
279         lwz     r11,_NIP(r1)
280         lwz     r12,_MSR(r1)
281         mtspr   SPRN_SRR0,r11
282         mtspr   SPRN_SRR1,r12
283
284 BEGIN_FTR_SECTION
285         stwcx.  r0,0,r1         /* to clear the reservation */
286 FTR_SECTION_ELSE
287         lwarx   r0,0,r1
288 ALT_FTR_SECTION_END_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
289
290         lwz     r3,_CCR(r1)
291         lwz     r4,_LINK(r1)
292         lwz     r5,_CTR(r1)
293         lwz     r6,_XER(r1)
294         li      r0,0
295
296         /*
297          * Leaving a stale exception_marker on the stack can confuse
298          * the reliable stack unwinder later on. Clear it.
299          */
300         stw     r0,8(r1)
301         REST_4GPRS(7, r1)
302         REST_2GPRS(11, r1)
303
304         mtcr    r3
305         mtlr    r4
306         mtctr   r5
307         mtspr   SPRN_XER,r6
308
309         REST_4GPRS(2, r1)
310         REST_GPR(6, r1)
311         REST_GPR(0, r1)
312         REST_GPR(1, r1)
313         rfi
314 #ifdef CONFIG_40x
315         b .     /* Prevent prefetch past rfi */
316 #endif
317
318 .Lrestore_nvgprs:
319         REST_NVGPRS(r1)
320         b       .Lfast_user_interrupt_return
321
322 .Lkernel_interrupt_return:
323         bl      interrupt_exit_kernel_prepare
324
325 .Lfast_kernel_interrupt_return:
326         cmpwi   cr1,r3,0
327         lwz     r11,_NIP(r1)
328         lwz     r12,_MSR(r1)
329         mtspr   SPRN_SRR0,r11
330         mtspr   SPRN_SRR1,r12
331
332 BEGIN_FTR_SECTION
333         stwcx.  r0,0,r1         /* to clear the reservation */
334 FTR_SECTION_ELSE
335         lwarx   r0,0,r1
336 ALT_FTR_SECTION_END_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
337
338         lwz     r3,_LINK(r1)
339         lwz     r4,_CTR(r1)
340         lwz     r5,_XER(r1)
341         lwz     r6,_CCR(r1)
342         li      r0,0
343
344         REST_4GPRS(7, r1)
345         REST_2GPRS(11, r1)
346
347         mtlr    r3
348         mtctr   r4
349         mtspr   SPRN_XER,r5
350
351         /*
352          * Leaving a stale exception_marker on the stack can confuse
353          * the reliable stack unwinder later on. Clear it.
354          */
355         stw     r0,8(r1)
356
357         REST_4GPRS(2, r1)
358
359         bne-    cr1,1f /* emulate stack store */
360         mtcr    r6
361         REST_GPR(6, r1)
362         REST_GPR(0, r1)
363         REST_GPR(1, r1)
364         rfi
365 #ifdef CONFIG_40x
366         b .     /* Prevent prefetch past rfi */
367 #endif
368
369 1:      /*
370          * Emulate stack store with update. New r1 value was already calculated
371          * and updated in our interrupt regs by emulate_loadstore, but we can't
372          * store the previous value of r1 to the stack before re-loading our
373          * registers from it, otherwise they could be clobbered.  Use
374          * SPRG Scratch0 as temporary storage to hold the store
375          * data, as interrupts are disabled here so it won't be clobbered.
376          */
377         mtcr    r6
378 #ifdef CONFIG_BOOKE
379         mtspr   SPRN_SPRG_WSCRATCH0, r9
380 #else
381         mtspr   SPRN_SPRG_SCRATCH0, r9
382 #endif
383         addi    r9,r1,INT_FRAME_SIZE /* get original r1 */
384         REST_GPR(6, r1)
385         REST_GPR(0, r1)
386         REST_GPR(1, r1)
387         stw     r9,0(r1) /* perform store component of stwu */
388 #ifdef CONFIG_BOOKE
389         mfspr   r9, SPRN_SPRG_RSCRATCH0
390 #else
391         mfspr   r9, SPRN_SPRG_SCRATCH0
392 #endif
393         rfi
394 #ifdef CONFIG_40x
395         b .     /* Prevent prefetch past rfi */
396 #endif
397 _ASM_NOKPROBE_SYMBOL(interrupt_return)
398
399 #if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
400
401 /*
402  * Returning from a critical interrupt in user mode doesn't need
403  * to be any different from a normal exception.  For a critical
404  * interrupt in the kernel, we just return (without checking for
405  * preemption) since the interrupt may have happened at some crucial
406  * place (e.g. inside the TLB miss handler), and because we will be
407  * running with r1 pointing into critical_stack, not the current
408  * process's kernel stack (and therefore current_thread_info() will
409  * give the wrong answer).
410  * We have to restore various SPRs that may have been in use at the
411  * time of the critical interrupt.
412  *
413  */
414 #ifdef CONFIG_40x
415 #define PPC_40x_TURN_OFF_MSR_DR                                             \
416         /* avoid any possible TLB misses here by turning off MSR.DR, we     \
417          * assume the instructions here are mapped by a pinned TLB entry */ \
418         li      r10,MSR_IR;                                                 \
419         mtmsr   r10;                                                        \
420         isync;                                                              \
421         tophys(r1, r1);
422 #else
423 #define PPC_40x_TURN_OFF_MSR_DR
424 #endif
425
426 #define RET_FROM_EXC_LEVEL(exc_lvl_srr0, exc_lvl_srr1, exc_lvl_rfi)     \
427         REST_NVGPRS(r1);                                                \
428         lwz     r3,_MSR(r1);                                            \
429         andi.   r3,r3,MSR_PR;                                           \
430         bne     interrupt_return;                                       \
431         lwz     r0,GPR0(r1);                                            \
432         lwz     r2,GPR2(r1);                                            \
433         REST_4GPRS(3, r1);                                              \
434         REST_2GPRS(7, r1);                                              \
435         lwz     r10,_XER(r1);                                           \
436         lwz     r11,_CTR(r1);                                           \
437         mtspr   SPRN_XER,r10;                                           \
438         mtctr   r11;                                                    \
439         stwcx.  r0,0,r1;                /* to clear the reservation */  \
440         lwz     r11,_LINK(r1);                                          \
441         mtlr    r11;                                                    \
442         lwz     r10,_CCR(r1);                                           \
443         mtcrf   0xff,r10;                                               \
444         PPC_40x_TURN_OFF_MSR_DR;                                        \
445         lwz     r9,_DEAR(r1);                                           \
446         lwz     r10,_ESR(r1);                                           \
447         mtspr   SPRN_DEAR,r9;                                           \
448         mtspr   SPRN_ESR,r10;                                           \
449         lwz     r11,_NIP(r1);                                           \
450         lwz     r12,_MSR(r1);                                           \
451         mtspr   exc_lvl_srr0,r11;                                       \
452         mtspr   exc_lvl_srr1,r12;                                       \
453         lwz     r9,GPR9(r1);                                            \
454         lwz     r12,GPR12(r1);                                          \
455         lwz     r10,GPR10(r1);                                          \
456         lwz     r11,GPR11(r1);                                          \
457         lwz     r1,GPR1(r1);                                            \
458         exc_lvl_rfi;                                                    \
459         b       .;              /* prevent prefetch past exc_lvl_rfi */
460
461 #define RESTORE_xSRR(exc_lvl_srr0, exc_lvl_srr1)                        \
462         lwz     r9,_##exc_lvl_srr0(r1);                                 \
463         lwz     r10,_##exc_lvl_srr1(r1);                                \
464         mtspr   SPRN_##exc_lvl_srr0,r9;                                 \
465         mtspr   SPRN_##exc_lvl_srr1,r10;
466
467 #if defined(CONFIG_PPC_BOOK3E_MMU)
468 #ifdef CONFIG_PHYS_64BIT
469 #define RESTORE_MAS7                                                    \
470         lwz     r11,MAS7(r1);                                           \
471         mtspr   SPRN_MAS7,r11;
472 #else
473 #define RESTORE_MAS7
474 #endif /* CONFIG_PHYS_64BIT */
475 #define RESTORE_MMU_REGS                                                \
476         lwz     r9,MAS0(r1);                                            \
477         lwz     r10,MAS1(r1);                                           \
478         lwz     r11,MAS2(r1);                                           \
479         mtspr   SPRN_MAS0,r9;                                           \
480         lwz     r9,MAS3(r1);                                            \
481         mtspr   SPRN_MAS1,r10;                                          \
482         lwz     r10,MAS6(r1);                                           \
483         mtspr   SPRN_MAS2,r11;                                          \
484         mtspr   SPRN_MAS3,r9;                                           \
485         mtspr   SPRN_MAS6,r10;                                          \
486         RESTORE_MAS7;
487 #elif defined(CONFIG_44x)
488 #define RESTORE_MMU_REGS                                                \
489         lwz     r9,MMUCR(r1);                                           \
490         mtspr   SPRN_MMUCR,r9;
491 #else
492 #define RESTORE_MMU_REGS
493 #endif
494
495 #ifdef CONFIG_40x
496         .globl  ret_from_crit_exc
497 ret_from_crit_exc:
498         lis     r9,crit_srr0@ha;
499         lwz     r9,crit_srr0@l(r9);
500         lis     r10,crit_srr1@ha;
501         lwz     r10,crit_srr1@l(r10);
502         mtspr   SPRN_SRR0,r9;
503         mtspr   SPRN_SRR1,r10;
504         RET_FROM_EXC_LEVEL(SPRN_CSRR0, SPRN_CSRR1, PPC_RFCI)
505 _ASM_NOKPROBE_SYMBOL(ret_from_crit_exc)
506 #endif /* CONFIG_40x */
507
508 #ifdef CONFIG_BOOKE
509         .globl  ret_from_crit_exc
510 ret_from_crit_exc:
511         RESTORE_xSRR(SRR0,SRR1);
512         RESTORE_MMU_REGS;
513         RET_FROM_EXC_LEVEL(SPRN_CSRR0, SPRN_CSRR1, PPC_RFCI)
514 _ASM_NOKPROBE_SYMBOL(ret_from_crit_exc)
515
516         .globl  ret_from_debug_exc
517 ret_from_debug_exc:
518         RESTORE_xSRR(SRR0,SRR1);
519         RESTORE_xSRR(CSRR0,CSRR1);
520         RESTORE_MMU_REGS;
521         RET_FROM_EXC_LEVEL(SPRN_DSRR0, SPRN_DSRR1, PPC_RFDI)
522 _ASM_NOKPROBE_SYMBOL(ret_from_debug_exc)
523
524         .globl  ret_from_mcheck_exc
525 ret_from_mcheck_exc:
526         RESTORE_xSRR(SRR0,SRR1);
527         RESTORE_xSRR(CSRR0,CSRR1);
528         RESTORE_xSRR(DSRR0,DSRR1);
529         RESTORE_MMU_REGS;
530         RET_FROM_EXC_LEVEL(SPRN_MCSRR0, SPRN_MCSRR1, PPC_RFMCI)
531 _ASM_NOKPROBE_SYMBOL(ret_from_mcheck_exc)
532 #endif /* CONFIG_BOOKE */
533 #endif /* !(CONFIG_4xx || CONFIG_BOOKE) */
534
535 /*
536  * PROM code for specific machines follows.  Put it
537  * here so it's easy to add arch-specific sections later.
538  * -- Cort
539  */
540 #ifdef CONFIG_PPC_RTAS
541 /*
542  * On CHRP, the Run-Time Abstraction Services (RTAS) have to be
543  * called with the MMU off.
544  */
545 _GLOBAL(enter_rtas)
546         stwu    r1,-INT_FRAME_SIZE(r1)
547         mflr    r0
548         stw     r0,INT_FRAME_SIZE+4(r1)
549         LOAD_REG_ADDR(r4, rtas)
550         lis     r6,1f@ha        /* physical return address for rtas */
551         addi    r6,r6,1f@l
552         tophys(r6,r6)
553         lwz     r8,RTASENTRY(r4)
554         lwz     r4,RTASBASE(r4)
555         mfmsr   r9
556         stw     r9,8(r1)
557         LOAD_REG_IMMEDIATE(r0,MSR_KERNEL)
558         mtmsr   r0      /* disable interrupts so SRR0/1 don't get trashed */
559         li      r9,MSR_KERNEL & ~(MSR_IR|MSR_DR)
560         mtlr    r6
561         stw     r1, THREAD + RTAS_SP(r2)
562         mtspr   SPRN_SRR0,r8
563         mtspr   SPRN_SRR1,r9
564         rfi
565 1:
566         lis     r8, 1f@h
567         ori     r8, r8, 1f@l
568         LOAD_REG_IMMEDIATE(r9,MSR_KERNEL)
569         mtspr   SPRN_SRR0,r8
570         mtspr   SPRN_SRR1,r9
571         rfi                     /* Reactivate MMU translation */
572 1:
573         lwz     r8,INT_FRAME_SIZE+4(r1) /* get return address */
574         lwz     r9,8(r1)        /* original msr value */
575         addi    r1,r1,INT_FRAME_SIZE
576         li      r0,0
577         stw     r0, THREAD + RTAS_SP(r2)
578         mtlr    r8
579         mtmsr   r9
580         blr                     /* return to caller */
581 _ASM_NOKPROBE_SYMBOL(enter_rtas)
582 #endif /* CONFIG_PPC_RTAS */