Merge tag 'tegra-for-5.10-dt-bindings' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / arch / powerpc / kernel / entry_64.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@cs.nmt.edu) for PReP
6  *    Copyright (C) 1996 Cort Dougan <cort@cs.nmt.edu>
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 <asm/cache.h>
20 #include <asm/unistd.h>
21 #include <asm/processor.h>
22 #include <asm/page.h>
23 #include <asm/mmu.h>
24 #include <asm/thread_info.h>
25 #include <asm/code-patching-asm.h>
26 #include <asm/ppc_asm.h>
27 #include <asm/asm-offsets.h>
28 #include <asm/cputable.h>
29 #include <asm/firmware.h>
30 #include <asm/bug.h>
31 #include <asm/ptrace.h>
32 #include <asm/irqflags.h>
33 #include <asm/hw_irq.h>
34 #include <asm/context_tracking.h>
35 #include <asm/tm.h>
36 #include <asm/ppc-opcode.h>
37 #include <asm/barrier.h>
38 #include <asm/export.h>
39 #include <asm/asm-compat.h>
40 #ifdef CONFIG_PPC_BOOK3S
41 #include <asm/exception-64s.h>
42 #else
43 #include <asm/exception-64e.h>
44 #endif
45 #include <asm/feature-fixups.h>
46 #include <asm/kup.h>
47
48 /*
49  * System calls.
50  */
51         .section        ".toc","aw"
52 SYS_CALL_TABLE:
53         .tc sys_call_table[TC],sys_call_table
54
55 #ifdef CONFIG_COMPAT
56 COMPAT_SYS_CALL_TABLE:
57         .tc compat_sys_call_table[TC],compat_sys_call_table
58 #endif
59
60 /* This value is used to mark exception frames on the stack. */
61 exception_marker:
62         .tc     ID_EXC_MARKER[TC],STACK_FRAME_REGS_MARKER
63
64         .section        ".text"
65         .align 7
66
67 #ifdef CONFIG_PPC_BOOK3S
68 .macro system_call_vectored name trapnr
69         .globl system_call_vectored_\name
70 system_call_vectored_\name:
71 _ASM_NOKPROBE_SYMBOL(system_call_vectored_\name)
72 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
73 BEGIN_FTR_SECTION
74         extrdi. r10, r12, 1, (63-MSR_TS_T_LG) /* transaction active? */
75         bne     .Ltabort_syscall
76 END_FTR_SECTION_IFSET(CPU_FTR_TM)
77 #endif
78         INTERRUPT_TO_KERNEL
79         mr      r10,r1
80         ld      r1,PACAKSAVE(r13)
81         std     r10,0(r1)
82         std     r11,_NIP(r1)
83         std     r12,_MSR(r1)
84         std     r0,GPR0(r1)
85         std     r10,GPR1(r1)
86         std     r2,GPR2(r1)
87         ld      r2,PACATOC(r13)
88         mfcr    r12
89         li      r11,0
90         /* Can we avoid saving r3-r8 in common case? */
91         std     r3,GPR3(r1)
92         std     r4,GPR4(r1)
93         std     r5,GPR5(r1)
94         std     r6,GPR6(r1)
95         std     r7,GPR7(r1)
96         std     r8,GPR8(r1)
97         /* Zero r9-r12, this should only be required when restoring all GPRs */
98         std     r11,GPR9(r1)
99         std     r11,GPR10(r1)
100         std     r11,GPR11(r1)
101         std     r11,GPR12(r1)
102         std     r9,GPR13(r1)
103         SAVE_NVGPRS(r1)
104         std     r11,_XER(r1)
105         std     r11,_LINK(r1)
106         std     r11,_CTR(r1)
107
108         li      r11,\trapnr
109         std     r11,_TRAP(r1)
110         std     r12,_CCR(r1)
111         std     r3,ORIG_GPR3(r1)
112         addi    r10,r1,STACK_FRAME_OVERHEAD
113         ld      r11,exception_marker@toc(r2)
114         std     r11,-16(r10)            /* "regshere" marker */
115
116 BEGIN_FTR_SECTION
117         HMT_MEDIUM
118 END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
119
120         /*
121          * RECONCILE_IRQ_STATE without calling trace_hardirqs_off(), which
122          * would clobber syscall parameters. Also we always enter with IRQs
123          * enabled and nothing pending. system_call_exception() will call
124          * trace_hardirqs_off().
125          *
126          * scv enters with MSR[EE]=1, so don't set PACA_IRQ_HARD_DIS. The
127          * entry vector already sets PACAIRQSOFTMASK to IRQS_ALL_DISABLED.
128          */
129
130         /* Calling convention has r9 = orig r0, r10 = regs */
131         mr      r9,r0
132         bl      system_call_exception
133
134 .Lsyscall_vectored_\name\()_exit:
135         addi    r4,r1,STACK_FRAME_OVERHEAD
136         li      r5,1 /* scv */
137         bl      syscall_exit_prepare
138
139         ld      r2,_CCR(r1)
140         ld      r4,_NIP(r1)
141         ld      r5,_MSR(r1)
142
143 BEGIN_FTR_SECTION
144         stdcx.  r0,0,r1                 /* to clear the reservation */
145 END_FTR_SECTION_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
146
147 BEGIN_FTR_SECTION
148         HMT_MEDIUM_LOW
149 END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
150
151         cmpdi   r3,0
152         bne     .Lsyscall_vectored_\name\()_restore_regs
153
154         /* rfscv returns with LR->NIA and CTR->MSR */
155         mtlr    r4
156         mtctr   r5
157
158         /* Could zero these as per ABI, but we may consider a stricter ABI
159          * which preserves these if libc implementations can benefit, so
160          * restore them for now until further measurement is done. */
161         ld      r0,GPR0(r1)
162         ld      r4,GPR4(r1)
163         ld      r5,GPR5(r1)
164         ld      r6,GPR6(r1)
165         ld      r7,GPR7(r1)
166         ld      r8,GPR8(r1)
167         /* Zero volatile regs that may contain sensitive kernel data */
168         li      r9,0
169         li      r10,0
170         li      r11,0
171         li      r12,0
172         mtspr   SPRN_XER,r0
173
174         /*
175          * We don't need to restore AMR on the way back to userspace for KUAP.
176          * The value of AMR only matters while we're in the kernel.
177          */
178         mtcr    r2
179         ld      r2,GPR2(r1)
180         ld      r3,GPR3(r1)
181         ld      r13,GPR13(r1)
182         ld      r1,GPR1(r1)
183         RFSCV_TO_USER
184         b       .       /* prevent speculative execution */
185
186 .Lsyscall_vectored_\name\()_restore_regs:
187         li      r3,0
188         mtmsrd  r3,1
189         mtspr   SPRN_SRR0,r4
190         mtspr   SPRN_SRR1,r5
191
192         ld      r3,_CTR(r1)
193         ld      r4,_LINK(r1)
194         ld      r5,_XER(r1)
195
196         REST_NVGPRS(r1)
197         ld      r0,GPR0(r1)
198         mtcr    r2
199         mtctr   r3
200         mtlr    r4
201         mtspr   SPRN_XER,r5
202         REST_10GPRS(2, r1)
203         REST_2GPRS(12, r1)
204         ld      r1,GPR1(r1)
205         RFI_TO_USER
206 .endm
207
208 system_call_vectored common 0x3000
209 /*
210  * We instantiate another entry copy for the SIGILL variant, with TRAP=0x7ff0
211  * which is tested by system_call_exception when r0 is -1 (as set by vector
212  * entry code).
213  */
214 system_call_vectored sigill 0x7ff0
215
216
217 /*
218  * Entered via kernel return set up by kernel/sstep.c, must match entry regs
219  */
220         .globl system_call_vectored_emulate
221 system_call_vectored_emulate:
222 _ASM_NOKPROBE_SYMBOL(system_call_vectored_emulate)
223         li      r10,IRQS_ALL_DISABLED
224         stb     r10,PACAIRQSOFTMASK(r13)
225         b       system_call_vectored_common
226 #endif
227
228         .balign IFETCH_ALIGN_BYTES
229         .globl system_call_common
230 system_call_common:
231 _ASM_NOKPROBE_SYMBOL(system_call_common)
232 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
233 BEGIN_FTR_SECTION
234         extrdi. r10, r12, 1, (63-MSR_TS_T_LG) /* transaction active? */
235         bne     .Ltabort_syscall
236 END_FTR_SECTION_IFSET(CPU_FTR_TM)
237 #endif
238         mr      r10,r1
239         ld      r1,PACAKSAVE(r13)
240         std     r10,0(r1)
241         std     r11,_NIP(r1)
242         std     r12,_MSR(r1)
243         std     r0,GPR0(r1)
244         std     r10,GPR1(r1)
245         std     r2,GPR2(r1)
246 #ifdef CONFIG_PPC_FSL_BOOK3E
247 START_BTB_FLUSH_SECTION
248         BTB_FLUSH(r10)
249 END_BTB_FLUSH_SECTION
250 #endif
251         ld      r2,PACATOC(r13)
252         mfcr    r12
253         li      r11,0
254         /* Can we avoid saving r3-r8 in common case? */
255         std     r3,GPR3(r1)
256         std     r4,GPR4(r1)
257         std     r5,GPR5(r1)
258         std     r6,GPR6(r1)
259         std     r7,GPR7(r1)
260         std     r8,GPR8(r1)
261         /* Zero r9-r12, this should only be required when restoring all GPRs */
262         std     r11,GPR9(r1)
263         std     r11,GPR10(r1)
264         std     r11,GPR11(r1)
265         std     r11,GPR12(r1)
266         std     r9,GPR13(r1)
267         SAVE_NVGPRS(r1)
268         std     r11,_XER(r1)
269         std     r11,_CTR(r1)
270         mflr    r10
271
272         /*
273          * This clears CR0.SO (bit 28), which is the error indication on
274          * return from this system call.
275          */
276         rldimi  r12,r11,28,(63-28)
277         li      r11,0xc00
278         std     r10,_LINK(r1)
279         std     r11,_TRAP(r1)
280         std     r12,_CCR(r1)
281         std     r3,ORIG_GPR3(r1)
282         addi    r10,r1,STACK_FRAME_OVERHEAD
283         ld      r11,exception_marker@toc(r2)
284         std     r11,-16(r10)            /* "regshere" marker */
285
286         /*
287          * RECONCILE_IRQ_STATE without calling trace_hardirqs_off(), which
288          * would clobber syscall parameters. Also we always enter with IRQs
289          * enabled and nothing pending. system_call_exception() will call
290          * trace_hardirqs_off().
291          */
292         li      r11,IRQS_ALL_DISABLED
293         li      r12,PACA_IRQ_HARD_DIS
294         stb     r11,PACAIRQSOFTMASK(r13)
295         stb     r12,PACAIRQHAPPENED(r13)
296
297         /* Calling convention has r9 = orig r0, r10 = regs */
298         mr      r9,r0
299         bl      system_call_exception
300
301 .Lsyscall_exit:
302         addi    r4,r1,STACK_FRAME_OVERHEAD
303         li      r5,0 /* !scv */
304         bl      syscall_exit_prepare
305
306         ld      r2,_CCR(r1)
307         ld      r4,_NIP(r1)
308         ld      r5,_MSR(r1)
309         ld      r6,_LINK(r1)
310
311 BEGIN_FTR_SECTION
312         stdcx.  r0,0,r1                 /* to clear the reservation */
313 END_FTR_SECTION_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
314
315         mtspr   SPRN_SRR0,r4
316         mtspr   SPRN_SRR1,r5
317         mtlr    r6
318
319         cmpdi   r3,0
320         bne     .Lsyscall_restore_regs
321         /* Zero volatile regs that may contain sensitive kernel data */
322         li      r0,0
323         li      r4,0
324         li      r5,0
325         li      r6,0
326         li      r7,0
327         li      r8,0
328         li      r9,0
329         li      r10,0
330         li      r11,0
331         li      r12,0
332         mtctr   r0
333         mtspr   SPRN_XER,r0
334 .Lsyscall_restore_regs_cont:
335
336 BEGIN_FTR_SECTION
337         HMT_MEDIUM_LOW
338 END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
339
340         /*
341          * We don't need to restore AMR on the way back to userspace for KUAP.
342          * The value of AMR only matters while we're in the kernel.
343          */
344         mtcr    r2
345         ld      r2,GPR2(r1)
346         ld      r3,GPR3(r1)
347         ld      r13,GPR13(r1)
348         ld      r1,GPR1(r1)
349         RFI_TO_USER
350         b       .       /* prevent speculative execution */
351
352 .Lsyscall_restore_regs:
353         ld      r3,_CTR(r1)
354         ld      r4,_XER(r1)
355         REST_NVGPRS(r1)
356         mtctr   r3
357         mtspr   SPRN_XER,r4
358         ld      r0,GPR0(r1)
359         REST_8GPRS(4, r1)
360         ld      r12,GPR12(r1)
361         b       .Lsyscall_restore_regs_cont
362
363 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
364 .Ltabort_syscall:
365         /* Firstly we need to enable TM in the kernel */
366         mfmsr   r10
367         li      r9, 1
368         rldimi  r10, r9, MSR_TM_LG, 63-MSR_TM_LG
369         mtmsrd  r10, 0
370
371         /* tabort, this dooms the transaction, nothing else */
372         li      r9, (TM_CAUSE_SYSCALL|TM_CAUSE_PERSISTENT)
373         TABORT(R9)
374
375         /*
376          * Return directly to userspace. We have corrupted user register state,
377          * but userspace will never see that register state. Execution will
378          * resume after the tbegin of the aborted transaction with the
379          * checkpointed register state.
380          */
381         li      r9, MSR_RI
382         andc    r10, r10, r9
383         mtmsrd  r10, 1
384         mtspr   SPRN_SRR0, r11
385         mtspr   SPRN_SRR1, r12
386         RFI_TO_USER
387         b       .       /* prevent speculative execution */
388 #endif
389
390 #ifdef CONFIG_PPC_BOOK3S
391 _GLOBAL(ret_from_fork_scv)
392         bl      schedule_tail
393         REST_NVGPRS(r1)
394         li      r3,0    /* fork() return value */
395         b       .Lsyscall_vectored_common_exit
396 #endif
397
398 _GLOBAL(ret_from_fork)
399         bl      schedule_tail
400         REST_NVGPRS(r1)
401         li      r3,0    /* fork() return value */
402         b       .Lsyscall_exit
403
404 _GLOBAL(ret_from_kernel_thread)
405         bl      schedule_tail
406         REST_NVGPRS(r1)
407         mtctr   r14
408         mr      r3,r15
409 #ifdef PPC64_ELF_ABI_v2
410         mr      r12,r14
411 #endif
412         bctrl
413         li      r3,0
414         b       .Lsyscall_exit
415
416 #ifdef CONFIG_PPC_BOOK3E
417 /* Save non-volatile GPRs, if not already saved. */
418 _GLOBAL(save_nvgprs)
419         ld      r11,_TRAP(r1)
420         andi.   r0,r11,1
421         beqlr-
422         SAVE_NVGPRS(r1)
423         clrrdi  r0,r11,1
424         std     r0,_TRAP(r1)
425         blr
426 _ASM_NOKPROBE_SYMBOL(save_nvgprs);
427 #endif
428
429 #ifdef CONFIG_PPC_BOOK3S_64
430
431 #define FLUSH_COUNT_CACHE       \
432 1:      nop;                    \
433         patch_site 1b, patch__call_flush_branch_caches
434
435 .macro nops number
436         .rept \number
437         nop
438         .endr
439 .endm
440
441 .balign 32
442 .global flush_branch_caches
443 flush_branch_caches:
444         /* Save LR into r9 */
445         mflr    r9
446
447         // Flush the link stack
448         .rept 64
449         bl      .+4
450         .endr
451         b       1f
452         nops    6
453
454         .balign 32
455         /* Restore LR */
456 1:      mtlr    r9
457
458         // If we're just flushing the link stack, return here
459 3:      nop
460         patch_site 3b patch__flush_link_stack_return
461
462         li      r9,0x7fff
463         mtctr   r9
464
465         PPC_BCCTR_FLUSH
466
467 2:      nop
468         patch_site 2b patch__flush_count_cache_return
469
470         nops    3
471
472         .rept 278
473         .balign 32
474         PPC_BCCTR_FLUSH
475         nops    7
476         .endr
477
478         blr
479 #else
480 #define FLUSH_COUNT_CACHE
481 #endif /* CONFIG_PPC_BOOK3S_64 */
482
483 /*
484  * This routine switches between two different tasks.  The process
485  * state of one is saved on its kernel stack.  Then the state
486  * of the other is restored from its kernel stack.  The memory
487  * management hardware is updated to the second process's state.
488  * Finally, we can return to the second process, via interrupt_return.
489  * On entry, r3 points to the THREAD for the current task, r4
490  * points to the THREAD for the new task.
491  *
492  * Note: there are two ways to get to the "going out" portion
493  * of this code; either by coming in via the entry (_switch)
494  * or via "fork" which must set up an environment equivalent
495  * to the "_switch" path.  If you change this you'll have to change
496  * the fork code also.
497  *
498  * The code which creates the new task context is in 'copy_thread'
499  * in arch/powerpc/kernel/process.c 
500  */
501         .align  7
502 _GLOBAL(_switch)
503         mflr    r0
504         std     r0,16(r1)
505         stdu    r1,-SWITCH_FRAME_SIZE(r1)
506         /* r3-r13 are caller saved -- Cort */
507         SAVE_NVGPRS(r1)
508         std     r0,_NIP(r1)     /* Return to switch caller */
509         mfcr    r23
510         std     r23,_CCR(r1)
511         std     r1,KSP(r3)      /* Set old stack pointer */
512
513         kuap_check_amr r9, r10
514
515         FLUSH_COUNT_CACHE
516
517         /*
518          * On SMP kernels, care must be taken because a task may be
519          * scheduled off CPUx and on to CPUy. Memory ordering must be
520          * considered.
521          *
522          * Cacheable stores on CPUx will be visible when the task is
523          * scheduled on CPUy by virtue of the core scheduler barriers
524          * (see "Notes on Program-Order guarantees on SMP systems." in
525          * kernel/sched/core.c).
526          *
527          * Uncacheable stores in the case of involuntary preemption must
528          * be taken care of. The smp_mb__after_spinlock() in __schedule()
529          * is implemented as hwsync on powerpc, which orders MMIO too. So
530          * long as there is an hwsync in the context switch path, it will
531          * be executed on the source CPU after the task has performed
532          * all MMIO ops on that CPU, and on the destination CPU before the
533          * task performs any MMIO ops there.
534          */
535
536         /*
537          * The kernel context switch path must contain a spin_lock,
538          * which contains larx/stcx, which will clear any reservation
539          * of the task being switched.
540          */
541 #ifdef CONFIG_PPC_BOOK3S
542 /* Cancel all explict user streams as they will have no use after context
543  * switch and will stop the HW from creating streams itself
544  */
545         DCBT_BOOK3S_STOP_ALL_STREAM_IDS(r6)
546 #endif
547
548         addi    r6,r4,-THREAD   /* Convert THREAD to 'current' */
549         std     r6,PACACURRENT(r13)     /* Set new 'current' */
550 #if defined(CONFIG_STACKPROTECTOR)
551         ld      r6, TASK_CANARY(r6)
552         std     r6, PACA_CANARY(r13)
553 #endif
554
555         ld      r8,KSP(r4)      /* new stack pointer */
556 #ifdef CONFIG_PPC_BOOK3S_64
557 BEGIN_MMU_FTR_SECTION
558         b       2f
559 END_MMU_FTR_SECTION_IFSET(MMU_FTR_TYPE_RADIX)
560 BEGIN_FTR_SECTION
561         clrrdi  r6,r8,28        /* get its ESID */
562         clrrdi  r9,r1,28        /* get current sp ESID */
563 FTR_SECTION_ELSE
564         clrrdi  r6,r8,40        /* get its 1T ESID */
565         clrrdi  r9,r1,40        /* get current sp 1T ESID */
566 ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_1T_SEGMENT)
567         clrldi. r0,r6,2         /* is new ESID c00000000? */
568         cmpd    cr1,r6,r9       /* or is new ESID the same as current ESID? */
569         cror    eq,4*cr1+eq,eq
570         beq     2f              /* if yes, don't slbie it */
571
572         /* Bolt in the new stack SLB entry */
573         ld      r7,KSP_VSID(r4) /* Get new stack's VSID */
574         oris    r0,r6,(SLB_ESID_V)@h
575         ori     r0,r0,(SLB_NUM_BOLTED-1)@l
576 BEGIN_FTR_SECTION
577         li      r9,MMU_SEGSIZE_1T       /* insert B field */
578         oris    r6,r6,(MMU_SEGSIZE_1T << SLBIE_SSIZE_SHIFT)@h
579         rldimi  r7,r9,SLB_VSID_SSIZE_SHIFT,0
580 END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
581
582         /* Update the last bolted SLB.  No write barriers are needed
583          * here, provided we only update the current CPU's SLB shadow
584          * buffer.
585          */
586         ld      r9,PACA_SLBSHADOWPTR(r13)
587         li      r12,0
588         std     r12,SLBSHADOW_STACKESID(r9)     /* Clear ESID */
589         li      r12,SLBSHADOW_STACKVSID
590         STDX_BE r7,r12,r9                       /* Save VSID */
591         li      r12,SLBSHADOW_STACKESID
592         STDX_BE r0,r12,r9                       /* Save ESID */
593
594         /* No need to check for MMU_FTR_NO_SLBIE_B here, since when
595          * we have 1TB segments, the only CPUs known to have the errata
596          * only support less than 1TB of system memory and we'll never
597          * actually hit this code path.
598          */
599
600         isync
601         slbie   r6
602 BEGIN_FTR_SECTION
603         slbie   r6              /* Workaround POWER5 < DD2.1 issue */
604 END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
605         slbmte  r7,r0
606         isync
607 2:
608 #endif /* CONFIG_PPC_BOOK3S_64 */
609
610         clrrdi  r7, r8, THREAD_SHIFT    /* base of new stack */
611         /* Note: this uses SWITCH_FRAME_SIZE rather than INT_FRAME_SIZE
612            because we don't need to leave the 288-byte ABI gap at the
613            top of the kernel stack. */
614         addi    r7,r7,THREAD_SIZE-SWITCH_FRAME_SIZE
615
616         /*
617          * PMU interrupts in radix may come in here. They will use r1, not
618          * PACAKSAVE, so this stack switch will not cause a problem. They
619          * will store to the process stack, which may then be migrated to
620          * another CPU. However the rq lock release on this CPU paired with
621          * the rq lock acquire on the new CPU before the stack becomes
622          * active on the new CPU, will order those stores.
623          */
624         mr      r1,r8           /* start using new stack pointer */
625         std     r7,PACAKSAVE(r13)
626
627         ld      r6,_CCR(r1)
628         mtcrf   0xFF,r6
629
630         /* r3-r13 are destroyed -- Cort */
631         REST_NVGPRS(r1)
632
633         /* convert old thread to its task_struct for return value */
634         addi    r3,r3,-THREAD
635         ld      r7,_NIP(r1)     /* Return to _switch caller in new task */
636         mtlr    r7
637         addi    r1,r1,SWITCH_FRAME_SIZE
638         blr
639
640 #ifdef CONFIG_PPC_BOOK3S
641         /*
642          * If MSR EE/RI was never enabled, IRQs not reconciled, NVGPRs not
643          * touched, no exit work created, then this can be used.
644          */
645         .balign IFETCH_ALIGN_BYTES
646         .globl fast_interrupt_return
647 fast_interrupt_return:
648 _ASM_NOKPROBE_SYMBOL(fast_interrupt_return)
649         kuap_check_amr r3, r4
650         ld      r5,_MSR(r1)
651         andi.   r0,r5,MSR_PR
652         bne     .Lfast_user_interrupt_return
653         kuap_restore_amr r3, r4
654         andi.   r0,r5,MSR_RI
655         li      r3,0 /* 0 return value, no EMULATE_STACK_STORE */
656         bne+    .Lfast_kernel_interrupt_return
657         addi    r3,r1,STACK_FRAME_OVERHEAD
658         bl      unrecoverable_exception
659         b       . /* should not get here */
660
661         .balign IFETCH_ALIGN_BYTES
662         .globl interrupt_return
663 interrupt_return:
664 _ASM_NOKPROBE_SYMBOL(interrupt_return)
665         ld      r4,_MSR(r1)
666         andi.   r0,r4,MSR_PR
667         beq     .Lkernel_interrupt_return
668         addi    r3,r1,STACK_FRAME_OVERHEAD
669         bl      interrupt_exit_user_prepare
670         cmpdi   r3,0
671         bne-    .Lrestore_nvgprs
672
673 .Lfast_user_interrupt_return:
674         ld      r11,_NIP(r1)
675         ld      r12,_MSR(r1)
676 BEGIN_FTR_SECTION
677         ld      r10,_PPR(r1)
678         mtspr   SPRN_PPR,r10
679 END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
680         mtspr   SPRN_SRR0,r11
681         mtspr   SPRN_SRR1,r12
682
683 BEGIN_FTR_SECTION
684         stdcx.  r0,0,r1         /* to clear the reservation */
685 FTR_SECTION_ELSE
686         ldarx   r0,0,r1
687 ALT_FTR_SECTION_END_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
688
689         ld      r3,_CCR(r1)
690         ld      r4,_LINK(r1)
691         ld      r5,_CTR(r1)
692         ld      r6,_XER(r1)
693         li      r0,0
694
695         REST_4GPRS(7, r1)
696         REST_2GPRS(11, r1)
697         REST_GPR(13, r1)
698
699         mtcr    r3
700         mtlr    r4
701         mtctr   r5
702         mtspr   SPRN_XER,r6
703
704         REST_4GPRS(2, r1)
705         REST_GPR(6, r1)
706         REST_GPR(0, r1)
707         REST_GPR(1, r1)
708         RFI_TO_USER
709         b       .       /* prevent speculative execution */
710
711 .Lrestore_nvgprs:
712         REST_NVGPRS(r1)
713         b       .Lfast_user_interrupt_return
714
715         .balign IFETCH_ALIGN_BYTES
716 .Lkernel_interrupt_return:
717         addi    r3,r1,STACK_FRAME_OVERHEAD
718         bl      interrupt_exit_kernel_prepare
719
720 .Lfast_kernel_interrupt_return:
721         cmpdi   cr1,r3,0
722         ld      r11,_NIP(r1)
723         ld      r12,_MSR(r1)
724         mtspr   SPRN_SRR0,r11
725         mtspr   SPRN_SRR1,r12
726
727 BEGIN_FTR_SECTION
728         stdcx.  r0,0,r1         /* to clear the reservation */
729 FTR_SECTION_ELSE
730         ldarx   r0,0,r1
731 ALT_FTR_SECTION_END_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
732
733         ld      r3,_LINK(r1)
734         ld      r4,_CTR(r1)
735         ld      r5,_XER(r1)
736         ld      r6,_CCR(r1)
737         li      r0,0
738
739         REST_4GPRS(7, r1)
740         REST_2GPRS(11, r1)
741
742         mtlr    r3
743         mtctr   r4
744         mtspr   SPRN_XER,r5
745
746         /*
747          * Leaving a stale exception_marker on the stack can confuse
748          * the reliable stack unwinder later on. Clear it.
749          */
750         std     r0,STACK_FRAME_OVERHEAD-16(r1)
751
752         REST_4GPRS(2, r1)
753
754         bne-    cr1,1f /* emulate stack store */
755         mtcr    r6
756         REST_GPR(6, r1)
757         REST_GPR(0, r1)
758         REST_GPR(1, r1)
759         RFI_TO_KERNEL
760         b       .       /* prevent speculative execution */
761
762 1:      /*
763          * Emulate stack store with update. New r1 value was already calculated
764          * and updated in our interrupt regs by emulate_loadstore, but we can't
765          * store the previous value of r1 to the stack before re-loading our
766          * registers from it, otherwise they could be clobbered.  Use
767          * PACA_EXGEN as temporary storage to hold the store data, as
768          * interrupts are disabled here so it won't be clobbered.
769          */
770         mtcr    r6
771         std     r9,PACA_EXGEN+0(r13)
772         addi    r9,r1,INT_FRAME_SIZE /* get original r1 */
773         REST_GPR(6, r1)
774         REST_GPR(0, r1)
775         REST_GPR(1, r1)
776         std     r9,0(r1) /* perform store component of stdu */
777         ld      r9,PACA_EXGEN+0(r13)
778
779         RFI_TO_KERNEL
780         b       .       /* prevent speculative execution */
781 #endif /* CONFIG_PPC_BOOK3S */
782
783 #ifdef CONFIG_PPC_RTAS
784 /*
785  * On CHRP, the Run-Time Abstraction Services (RTAS) have to be
786  * called with the MMU off.
787  *
788  * In addition, we need to be in 32b mode, at least for now.
789  * 
790  * Note: r3 is an input parameter to rtas, so don't trash it...
791  */
792 _GLOBAL(enter_rtas)
793         mflr    r0
794         std     r0,16(r1)
795         stdu    r1,-SWITCH_FRAME_SIZE(r1) /* Save SP and create stack space. */
796
797         /* Because RTAS is running in 32b mode, it clobbers the high order half
798          * of all registers that it saves.  We therefore save those registers
799          * RTAS might touch to the stack.  (r0, r3-r13 are caller saved)
800          */
801         SAVE_GPR(2, r1)                 /* Save the TOC */
802         SAVE_GPR(13, r1)                /* Save paca */
803         SAVE_NVGPRS(r1)                 /* Save the non-volatiles */
804
805         mfcr    r4
806         std     r4,_CCR(r1)
807         mfctr   r5
808         std     r5,_CTR(r1)
809         mfspr   r6,SPRN_XER
810         std     r6,_XER(r1)
811         mfdar   r7
812         std     r7,_DAR(r1)
813         mfdsisr r8
814         std     r8,_DSISR(r1)
815
816         /* Temporary workaround to clear CR until RTAS can be modified to
817          * ignore all bits.
818          */
819         li      r0,0
820         mtcr    r0
821
822 #ifdef CONFIG_BUG
823         /* There is no way it is acceptable to get here with interrupts enabled,
824          * check it with the asm equivalent of WARN_ON
825          */
826         lbz     r0,PACAIRQSOFTMASK(r13)
827 1:      tdeqi   r0,IRQS_ENABLED
828         EMIT_BUG_ENTRY 1b,__FILE__,__LINE__,BUGFLAG_WARNING
829 #endif
830
831         /* Hard-disable interrupts */
832         mfmsr   r6
833         rldicl  r7,r6,48,1
834         rotldi  r7,r7,16
835         mtmsrd  r7,1
836
837         /* Unfortunately, the stack pointer and the MSR are also clobbered,
838          * so they are saved in the PACA which allows us to restore
839          * our original state after RTAS returns.
840          */
841         std     r1,PACAR1(r13)
842         std     r6,PACASAVEDMSR(r13)
843
844         /* Setup our real return addr */        
845         LOAD_REG_ADDR(r4,rtas_return_loc)
846         clrldi  r4,r4,2                 /* convert to realmode address */
847         mtlr    r4
848
849         li      r0,0
850         ori     r0,r0,MSR_EE|MSR_SE|MSR_BE|MSR_RI
851         andc    r0,r6,r0
852         
853         li      r9,1
854         rldicr  r9,r9,MSR_SF_LG,(63-MSR_SF_LG)
855         ori     r9,r9,MSR_IR|MSR_DR|MSR_FE0|MSR_FE1|MSR_FP|MSR_RI|MSR_LE
856         andc    r6,r0,r9
857
858 __enter_rtas:
859         sync                            /* disable interrupts so SRR0/1 */
860         mtmsrd  r0                      /* don't get trashed */
861
862         LOAD_REG_ADDR(r4, rtas)
863         ld      r5,RTASENTRY(r4)        /* get the rtas->entry value */
864         ld      r4,RTASBASE(r4)         /* get the rtas->base value */
865         
866         mtspr   SPRN_SRR0,r5
867         mtspr   SPRN_SRR1,r6
868         RFI_TO_KERNEL
869         b       .       /* prevent speculative execution */
870
871 rtas_return_loc:
872         FIXUP_ENDIAN
873
874         /*
875          * Clear RI and set SF before anything.
876          */
877         mfmsr   r6
878         li      r0,MSR_RI
879         andc    r6,r6,r0
880         sldi    r0,r0,(MSR_SF_LG - MSR_RI_LG)
881         or      r6,r6,r0
882         sync
883         mtmsrd  r6
884
885         /* relocation is off at this point */
886         GET_PACA(r4)
887         clrldi  r4,r4,2                 /* convert to realmode address */
888
889         bcl     20,31,$+4
890 0:      mflr    r3
891         ld      r3,(1f-0b)(r3)          /* get &rtas_restore_regs */
892
893         ld      r1,PACAR1(r4)           /* Restore our SP */
894         ld      r4,PACASAVEDMSR(r4)     /* Restore our MSR */
895
896         mtspr   SPRN_SRR0,r3
897         mtspr   SPRN_SRR1,r4
898         RFI_TO_KERNEL
899         b       .       /* prevent speculative execution */
900 _ASM_NOKPROBE_SYMBOL(__enter_rtas)
901 _ASM_NOKPROBE_SYMBOL(rtas_return_loc)
902
903         .align  3
904 1:      .8byte  rtas_restore_regs
905
906 rtas_restore_regs:
907         /* relocation is on at this point */
908         REST_GPR(2, r1)                 /* Restore the TOC */
909         REST_GPR(13, r1)                /* Restore paca */
910         REST_NVGPRS(r1)                 /* Restore the non-volatiles */
911
912         GET_PACA(r13)
913
914         ld      r4,_CCR(r1)
915         mtcr    r4
916         ld      r5,_CTR(r1)
917         mtctr   r5
918         ld      r6,_XER(r1)
919         mtspr   SPRN_XER,r6
920         ld      r7,_DAR(r1)
921         mtdar   r7
922         ld      r8,_DSISR(r1)
923         mtdsisr r8
924
925         addi    r1,r1,SWITCH_FRAME_SIZE /* Unstack our frame */
926         ld      r0,16(r1)               /* get return address */
927
928         mtlr    r0
929         blr                             /* return to caller */
930
931 #endif /* CONFIG_PPC_RTAS */
932
933 _GLOBAL(enter_prom)
934         mflr    r0
935         std     r0,16(r1)
936         stdu    r1,-SWITCH_FRAME_SIZE(r1) /* Save SP and create stack space */
937
938         /* Because PROM is running in 32b mode, it clobbers the high order half
939          * of all registers that it saves.  We therefore save those registers
940          * PROM might touch to the stack.  (r0, r3-r13 are caller saved)
941          */
942         SAVE_GPR(2, r1)
943         SAVE_GPR(13, r1)
944         SAVE_NVGPRS(r1)
945         mfcr    r10
946         mfmsr   r11
947         std     r10,_CCR(r1)
948         std     r11,_MSR(r1)
949
950         /* Put PROM address in SRR0 */
951         mtsrr0  r4
952
953         /* Setup our trampoline return addr in LR */
954         bcl     20,31,$+4
955 0:      mflr    r4
956         addi    r4,r4,(1f - 0b)
957         mtlr    r4
958
959         /* Prepare a 32-bit mode big endian MSR
960          */
961 #ifdef CONFIG_PPC_BOOK3E
962         rlwinm  r11,r11,0,1,31
963         mtsrr1  r11
964         rfi
965 #else /* CONFIG_PPC_BOOK3E */
966         LOAD_REG_IMMEDIATE(r12, MSR_SF | MSR_ISF | MSR_LE)
967         andc    r11,r11,r12
968         mtsrr1  r11
969         RFI_TO_KERNEL
970 #endif /* CONFIG_PPC_BOOK3E */
971
972 1:      /* Return from OF */
973         FIXUP_ENDIAN
974
975         /* Just make sure that r1 top 32 bits didn't get
976          * corrupt by OF
977          */
978         rldicl  r1,r1,0,32
979
980         /* Restore the MSR (back to 64 bits) */
981         ld      r0,_MSR(r1)
982         MTMSRD(r0)
983         isync
984
985         /* Restore other registers */
986         REST_GPR(2, r1)
987         REST_GPR(13, r1)
988         REST_NVGPRS(r1)
989         ld      r4,_CCR(r1)
990         mtcr    r4
991
992         addi    r1,r1,SWITCH_FRAME_SIZE
993         ld      r0,16(r1)
994         mtlr    r0
995         blr