GNU Linux-libre 4.19.286-gnu1
[releases.git] / arch / powerpc / kernel / entry_64.S
1 /*
2  *  PowerPC version 
3  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
4  *  Rewritten by Cort Dougan (cort@cs.nmt.edu) for PReP
5  *    Copyright (C) 1996 Cort Dougan <cort@cs.nmt.edu>
6  *  Adapted for Power Macintosh by Paul Mackerras.
7  *  Low-level exception handlers and MMU support
8  *  rewritten by Paul Mackerras.
9  *    Copyright (C) 1996 Paul Mackerras.
10  *  MPC8xx modifications Copyright (C) 1997 Dan Malek (dmalek@jlc.net).
11  *
12  *  This file contains the system call entry code, context switch
13  *  code, and exception/interrupt return code for PowerPC.
14  *
15  *  This program is free software; you can redistribute it and/or
16  *  modify it under the terms of the GNU General Public License
17  *  as published by the Free Software Foundation; either version
18  *  2 of the License, or (at your option) any later version.
19  */
20
21 #include <linux/errno.h>
22 #include <linux/err.h>
23 #include <asm/unistd.h>
24 #include <asm/processor.h>
25 #include <asm/page.h>
26 #include <asm/mmu.h>
27 #include <asm/thread_info.h>
28 #include <asm/code-patching-asm.h>
29 #include <asm/ppc_asm.h>
30 #include <asm/asm-offsets.h>
31 #include <asm/cputable.h>
32 #include <asm/firmware.h>
33 #include <asm/bug.h>
34 #include <asm/ptrace.h>
35 #include <asm/irqflags.h>
36 #include <asm/hw_irq.h>
37 #include <asm/context_tracking.h>
38 #include <asm/tm.h>
39 #include <asm/ppc-opcode.h>
40 #include <asm/barrier.h>
41 #include <asm/export.h>
42 #include <asm/asm-compat.h>
43 #ifdef CONFIG_PPC_BOOK3S
44 #include <asm/exception-64s.h>
45 #else
46 #include <asm/exception-64e.h>
47 #endif
48 #include <asm/feature-fixups.h>
49
50 /*
51  * System calls.
52  */
53         .section        ".toc","aw"
54 SYS_CALL_TABLE:
55         .tc sys_call_table[TC],sys_call_table
56
57 /* This value is used to mark exception frames on the stack. */
58 exception_marker:
59         .tc     ID_EXC_MARKER[TC],STACK_FRAME_REGS_MARKER
60
61         .section        ".text"
62         .align 7
63
64         .globl system_call_common
65 system_call_common:
66 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
67 BEGIN_FTR_SECTION
68         extrdi. r10, r12, 1, (63-MSR_TS_T_LG) /* transaction active? */
69         bne     .Ltabort_syscall
70 END_FTR_SECTION_IFSET(CPU_FTR_TM)
71 #endif
72         andi.   r10,r12,MSR_PR
73         mr      r10,r1
74         addi    r1,r1,-INT_FRAME_SIZE
75         beq-    1f
76         ld      r1,PACAKSAVE(r13)
77 1:      std     r10,0(r1)
78         std     r11,_NIP(r1)
79         std     r12,_MSR(r1)
80         std     r0,GPR0(r1)
81         std     r10,GPR1(r1)
82         beq     2f                      /* if from kernel mode */
83 #ifdef CONFIG_PPC_FSL_BOOK3E
84 START_BTB_FLUSH_SECTION
85         BTB_FLUSH(r10)
86 END_BTB_FLUSH_SECTION
87 #endif
88         ACCOUNT_CPU_USER_ENTRY(r13, r10, r11)
89 2:      std     r2,GPR2(r1)
90         std     r3,GPR3(r1)
91         mfcr    r2
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         li      r11,0
98         std     r11,GPR9(r1)
99         std     r11,GPR10(r1)
100         std     r11,GPR11(r1)
101         std     r11,GPR12(r1)
102         std     r11,_XER(r1)
103         std     r11,_CTR(r1)
104         std     r9,GPR13(r1)
105         mflr    r10
106         /*
107          * This clears CR0.SO (bit 28), which is the error indication on
108          * return from this system call.
109          */
110         rldimi  r2,r11,28,(63-28)
111         li      r11,0xc01
112         std     r10,_LINK(r1)
113         std     r11,_TRAP(r1)
114         std     r3,ORIG_GPR3(r1)
115         std     r2,_CCR(r1)
116         ld      r2,PACATOC(r13)
117         addi    r9,r1,STACK_FRAME_OVERHEAD
118         ld      r11,exception_marker@toc(r2)
119         std     r11,-16(r9)             /* "regshere" marker */
120 #if defined(CONFIG_VIRT_CPU_ACCOUNTING_NATIVE) && defined(CONFIG_PPC_SPLPAR)
121 BEGIN_FW_FTR_SECTION
122         beq     33f
123         /* if from user, see if there are any DTL entries to process */
124         ld      r10,PACALPPACAPTR(r13)  /* get ptr to VPA */
125         ld      r11,PACA_DTL_RIDX(r13)  /* get log read index */
126         addi    r10,r10,LPPACA_DTLIDX
127         LDX_BE  r10,0,r10               /* get log write index */
128         cmpd    cr1,r11,r10
129         beq+    cr1,33f
130         bl      accumulate_stolen_time
131         REST_GPR(0,r1)
132         REST_4GPRS(3,r1)
133         REST_2GPRS(7,r1)
134         addi    r9,r1,STACK_FRAME_OVERHEAD
135 33:
136 END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR)
137 #endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE && CONFIG_PPC_SPLPAR */
138
139         /*
140          * A syscall should always be called with interrupts enabled
141          * so we just unconditionally hard-enable here. When some kind
142          * of irq tracing is used, we additionally check that condition
143          * is correct
144          */
145 #if defined(CONFIG_PPC_IRQ_SOFT_MASK_DEBUG) && defined(CONFIG_BUG)
146         lbz     r10,PACAIRQSOFTMASK(r13)
147 1:      tdnei   r10,IRQS_ENABLED
148         EMIT_BUG_ENTRY 1b,__FILE__,__LINE__,BUGFLAG_WARNING
149 #endif
150
151 #ifdef CONFIG_PPC_BOOK3E
152         wrteei  1
153 #else
154         li      r11,MSR_RI
155         ori     r11,r11,MSR_EE
156         mtmsrd  r11,1
157 #endif /* CONFIG_PPC_BOOK3E */
158
159 system_call:                    /* label this so stack traces look sane */
160         /* We do need to set SOFTE in the stack frame or the return
161          * from interrupt will be painful
162          */
163         li      r10,IRQS_ENABLED
164         std     r10,SOFTE(r1)
165
166         CURRENT_THREAD_INFO(r11, r1)
167         ld      r10,TI_FLAGS(r11)
168         andi.   r11,r10,_TIF_SYSCALL_DOTRACE
169         bne     .Lsyscall_dotrace               /* does not return */
170         cmpldi  0,r0,NR_syscalls
171         bge-    .Lsyscall_enosys
172
173 .Lsyscall:
174 /*
175  * Need to vector to 32 Bit or default sys_call_table here,
176  * based on caller's run-mode / personality.
177  */
178         ld      r11,SYS_CALL_TABLE@toc(2)
179         andi.   r10,r10,_TIF_32BIT
180         beq     15f
181         addi    r11,r11,8       /* use 32-bit syscall entries */
182         clrldi  r3,r3,32
183         clrldi  r4,r4,32
184         clrldi  r5,r5,32
185         clrldi  r6,r6,32
186         clrldi  r7,r7,32
187         clrldi  r8,r8,32
188 15:
189         slwi    r0,r0,4
190
191         barrier_nospec_asm
192         /*
193          * Prevent the load of the handler below (based on the user-passed
194          * system call number) being speculatively executed until the test
195          * against NR_syscalls and branch to .Lsyscall_enosys above has
196          * committed.
197          */
198
199         ldx     r12,r11,r0      /* Fetch system call handler [ptr] */
200         mtctr   r12
201         bctrl                   /* Call handler */
202
203 .Lsyscall_exit:
204         std     r3,RESULT(r1)
205
206 #ifdef CONFIG_DEBUG_RSEQ
207         /* Check whether the syscall is issued inside a restartable sequence */
208         addi    r3,r1,STACK_FRAME_OVERHEAD
209         bl      rseq_syscall
210         ld      r3,RESULT(r1)
211 #endif
212
213         CURRENT_THREAD_INFO(r12, r1)
214
215         ld      r8,_MSR(r1)
216 #ifdef CONFIG_PPC_BOOK3S
217         /* No MSR:RI on BookE */
218         andi.   r10,r8,MSR_RI
219         beq-    .Lunrecov_restore
220 #endif
221
222 /*
223  * This is a few instructions into the actual syscall exit path (which actually
224  * starts at .Lsyscall_exit) to cater to kprobe blacklisting and to reduce the
225  * number of visible symbols for profiling purposes.
226  *
227  * We can probe from system_call until this point as MSR_RI is set. But once it
228  * is cleared below, we won't be able to take a trap.
229  *
230  * This is blacklisted from kprobes further below with _ASM_NOKPROBE_SYMBOL().
231  */
232 system_call_exit:
233         /*
234          * Disable interrupts so current_thread_info()->flags can't change,
235          * and so that we don't get interrupted after loading SRR0/1.
236          */
237 #ifdef CONFIG_PPC_BOOK3E
238         wrteei  0
239 #else
240         /*
241          * For performance reasons we clear RI the same time that we
242          * clear EE. We only need to clear RI just before we restore r13
243          * below, but batching it with EE saves us one expensive mtmsrd call.
244          * We have to be careful to restore RI if we branch anywhere from
245          * here (eg syscall_exit_work).
246          */
247         li      r11,0
248         mtmsrd  r11,1
249 #endif /* CONFIG_PPC_BOOK3E */
250
251         ld      r9,TI_FLAGS(r12)
252         li      r11,-MAX_ERRNO
253         andi.   r0,r9,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)
254         bne-    .Lsyscall_exit_work
255
256         andi.   r0,r8,MSR_FP
257         beq 2f
258 #ifdef CONFIG_ALTIVEC
259         andis.  r0,r8,MSR_VEC@h
260         bne     3f
261 #endif
262 2:      addi    r3,r1,STACK_FRAME_OVERHEAD
263 #ifdef CONFIG_PPC_BOOK3S
264         li      r10,MSR_RI
265         mtmsrd  r10,1           /* Restore RI */
266 #endif
267         bl      restore_math
268 #ifdef CONFIG_PPC_BOOK3S
269         li      r11,0
270         mtmsrd  r11,1
271 #endif
272         ld      r8,_MSR(r1)
273         ld      r3,RESULT(r1)
274         li      r11,-MAX_ERRNO
275
276 3:      cmpld   r3,r11
277         ld      r5,_CCR(r1)
278         bge-    .Lsyscall_error
279 .Lsyscall_error_cont:
280         ld      r7,_NIP(r1)
281 BEGIN_FTR_SECTION
282         stdcx.  r0,0,r1                 /* to clear the reservation */
283 END_FTR_SECTION_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
284         andi.   r6,r8,MSR_PR
285         ld      r4,_LINK(r1)
286
287         beq-    1f
288         ACCOUNT_CPU_USER_EXIT(r13, r11, r12)
289
290 BEGIN_FTR_SECTION
291         HMT_MEDIUM_LOW
292 END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
293
294         ld      r13,GPR13(r1)   /* only restore r13 if returning to usermode */
295         ld      r2,GPR2(r1)
296         ld      r1,GPR1(r1)
297         mtlr    r4
298         mtcr    r5
299         mtspr   SPRN_SRR0,r7
300         mtspr   SPRN_SRR1,r8
301         RFI_TO_USER
302         b       .       /* prevent speculative execution */
303
304         /* exit to kernel */
305 1:      ld      r2,GPR2(r1)
306         ld      r1,GPR1(r1)
307         mtlr    r4
308         mtcr    r5
309         mtspr   SPRN_SRR0,r7
310         mtspr   SPRN_SRR1,r8
311         RFI_TO_KERNEL
312         b       .       /* prevent speculative execution */
313
314 .Lsyscall_error:
315         oris    r5,r5,0x1000    /* Set SO bit in CR */
316         neg     r3,r3
317         std     r5,_CCR(r1)
318         b       .Lsyscall_error_cont
319
320 /* Traced system call support */
321 .Lsyscall_dotrace:
322         bl      save_nvgprs
323         addi    r3,r1,STACK_FRAME_OVERHEAD
324         bl      do_syscall_trace_enter
325
326         /*
327          * We use the return value of do_syscall_trace_enter() as the syscall
328          * number. If the syscall was rejected for any reason do_syscall_trace_enter()
329          * returns an invalid syscall number and the test below against
330          * NR_syscalls will fail.
331          */
332         mr      r0,r3
333
334         /* Restore argument registers just clobbered and/or possibly changed. */
335         ld      r3,GPR3(r1)
336         ld      r4,GPR4(r1)
337         ld      r5,GPR5(r1)
338         ld      r6,GPR6(r1)
339         ld      r7,GPR7(r1)
340         ld      r8,GPR8(r1)
341
342         /* Repopulate r9 and r10 for the syscall path */
343         addi    r9,r1,STACK_FRAME_OVERHEAD
344         CURRENT_THREAD_INFO(r10, r1)
345         ld      r10,TI_FLAGS(r10)
346
347         cmpldi  r0,NR_syscalls
348         blt+    .Lsyscall
349
350         /* Return code is already in r3 thanks to do_syscall_trace_enter() */
351         b       .Lsyscall_exit
352
353
354 .Lsyscall_enosys:
355         li      r3,-ENOSYS
356         b       .Lsyscall_exit
357         
358 .Lsyscall_exit_work:
359 #ifdef CONFIG_PPC_BOOK3S
360         li      r10,MSR_RI
361         mtmsrd  r10,1           /* Restore RI */
362 #endif
363         /* If TIF_RESTOREALL is set, don't scribble on either r3 or ccr.
364          If TIF_NOERROR is set, just save r3 as it is. */
365
366         andi.   r0,r9,_TIF_RESTOREALL
367         beq+    0f
368         REST_NVGPRS(r1)
369         b       2f
370 0:      cmpld   r3,r11          /* r11 is -MAX_ERRNO */
371         blt+    1f
372         andi.   r0,r9,_TIF_NOERROR
373         bne-    1f
374         ld      r5,_CCR(r1)
375         neg     r3,r3
376         oris    r5,r5,0x1000    /* Set SO bit in CR */
377         std     r5,_CCR(r1)
378 1:      std     r3,GPR3(r1)
379 2:      andi.   r0,r9,(_TIF_PERSYSCALL_MASK)
380         beq     4f
381
382         /* Clear per-syscall TIF flags if any are set.  */
383
384         li      r11,_TIF_PERSYSCALL_MASK
385         addi    r12,r12,TI_FLAGS
386 3:      ldarx   r10,0,r12
387         andc    r10,r10,r11
388         stdcx.  r10,0,r12
389         bne-    3b
390         subi    r12,r12,TI_FLAGS
391
392 4:      /* Anything else left to do? */
393 BEGIN_FTR_SECTION
394         lis     r3,INIT_PPR@highest     /* Set thread.ppr = 3 */
395         ld      r10,PACACURRENT(r13)
396         sldi    r3,r3,32        /* bits 11-13 are used for ppr */
397         std     r3,TASKTHREADPPR(r10)
398 END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
399
400         andi.   r0,r9,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP)
401         beq     ret_from_except_lite
402
403         /* Re-enable interrupts */
404 #ifdef CONFIG_PPC_BOOK3E
405         wrteei  1
406 #else
407         li      r10,MSR_RI
408         ori     r10,r10,MSR_EE
409         mtmsrd  r10,1
410 #endif /* CONFIG_PPC_BOOK3E */
411
412         bl      save_nvgprs
413         addi    r3,r1,STACK_FRAME_OVERHEAD
414         bl      do_syscall_trace_leave
415         b       ret_from_except
416
417 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
418 .Ltabort_syscall:
419         /* Firstly we need to enable TM in the kernel */
420         mfmsr   r10
421         li      r9, 1
422         rldimi  r10, r9, MSR_TM_LG, 63-MSR_TM_LG
423         mtmsrd  r10, 0
424
425         /* tabort, this dooms the transaction, nothing else */
426         li      r9, (TM_CAUSE_SYSCALL|TM_CAUSE_PERSISTENT)
427         TABORT(R9)
428
429         /*
430          * Return directly to userspace. We have corrupted user register state,
431          * but userspace will never see that register state. Execution will
432          * resume after the tbegin of the aborted transaction with the
433          * checkpointed register state.
434          */
435         li      r9, MSR_RI
436         andc    r10, r10, r9
437         mtmsrd  r10, 1
438         mtspr   SPRN_SRR0, r11
439         mtspr   SPRN_SRR1, r12
440         RFI_TO_USER
441         b       .       /* prevent speculative execution */
442 #endif
443 _ASM_NOKPROBE_SYMBOL(system_call_common);
444 _ASM_NOKPROBE_SYMBOL(system_call_exit);
445
446 /* Save non-volatile GPRs, if not already saved. */
447 _GLOBAL(save_nvgprs)
448         ld      r11,_TRAP(r1)
449         andi.   r0,r11,1
450         beqlr-
451         SAVE_NVGPRS(r1)
452         clrrdi  r0,r11,1
453         std     r0,_TRAP(r1)
454         blr
455 _ASM_NOKPROBE_SYMBOL(save_nvgprs);
456
457         
458 /*
459  * The sigsuspend and rt_sigsuspend system calls can call do_signal
460  * and thus put the process into the stopped state where we might
461  * want to examine its user state with ptrace.  Therefore we need
462  * to save all the nonvolatile registers (r14 - r31) before calling
463  * the C code.  Similarly, fork, vfork and clone need the full
464  * register state on the stack so that it can be copied to the child.
465  */
466
467 _GLOBAL(ppc_fork)
468         bl      save_nvgprs
469         bl      sys_fork
470         b       .Lsyscall_exit
471
472 _GLOBAL(ppc_vfork)
473         bl      save_nvgprs
474         bl      sys_vfork
475         b       .Lsyscall_exit
476
477 _GLOBAL(ppc_clone)
478         bl      save_nvgprs
479         bl      sys_clone
480         b       .Lsyscall_exit
481
482 _GLOBAL(ppc32_swapcontext)
483         bl      save_nvgprs
484         bl      compat_sys_swapcontext
485         b       .Lsyscall_exit
486
487 _GLOBAL(ppc64_swapcontext)
488         bl      save_nvgprs
489         bl      sys_swapcontext
490         b       .Lsyscall_exit
491
492 _GLOBAL(ppc_switch_endian)
493         bl      save_nvgprs
494         bl      sys_switch_endian
495         b       .Lsyscall_exit
496
497 _GLOBAL(ret_from_fork)
498         bl      schedule_tail
499         REST_NVGPRS(r1)
500         li      r3,0
501         b       .Lsyscall_exit
502
503 _GLOBAL(ret_from_kernel_thread)
504         bl      schedule_tail
505         REST_NVGPRS(r1)
506         mtlr    r14
507         mr      r3,r15
508 #ifdef PPC64_ELF_ABI_v2
509         mr      r12,r14
510 #endif
511         blrl
512         li      r3,0
513         b       .Lsyscall_exit
514
515 #ifdef CONFIG_PPC_BOOK3S_64
516
517 #define FLUSH_COUNT_CACHE       \
518 1:      nop;                    \
519         patch_site 1b, patch__call_flush_count_cache
520
521
522 #define BCCTR_FLUSH     .long 0x4c400420
523
524 .macro nops number
525         .rept \number
526         nop
527         .endr
528 .endm
529
530 .balign 32
531 .global flush_count_cache
532 flush_count_cache:
533         /* Save LR into r9 */
534         mflr    r9
535
536         // Flush the link stack
537         .rept 64
538         bl      .+4
539         .endr
540         b       1f
541         nops    6
542
543         .balign 32
544         /* Restore LR */
545 1:      mtlr    r9
546
547         // If we're just flushing the link stack, return here
548 3:      nop
549         patch_site 3b patch__flush_link_stack_return
550
551         li      r9,0x7fff
552         mtctr   r9
553
554         BCCTR_FLUSH
555
556 2:      nop
557         patch_site 2b patch__flush_count_cache_return
558
559         nops    3
560
561         .rept 278
562         .balign 32
563         BCCTR_FLUSH
564         nops    7
565         .endr
566
567         blr
568 #else
569 #define FLUSH_COUNT_CACHE
570 #endif /* CONFIG_PPC_BOOK3S_64 */
571
572 /*
573  * This routine switches between two different tasks.  The process
574  * state of one is saved on its kernel stack.  Then the state
575  * of the other is restored from its kernel stack.  The memory
576  * management hardware is updated to the second process's state.
577  * Finally, we can return to the second process, via ret_from_except.
578  * On entry, r3 points to the THREAD for the current task, r4
579  * points to the THREAD for the new task.
580  *
581  * Note: there are two ways to get to the "going out" portion
582  * of this code; either by coming in via the entry (_switch)
583  * or via "fork" which must set up an environment equivalent
584  * to the "_switch" path.  If you change this you'll have to change
585  * the fork code also.
586  *
587  * The code which creates the new task context is in 'copy_thread'
588  * in arch/powerpc/kernel/process.c 
589  */
590         .align  7
591 _GLOBAL(_switch)
592         mflr    r0
593         std     r0,16(r1)
594         stdu    r1,-SWITCH_FRAME_SIZE(r1)
595         /* r3-r13 are caller saved -- Cort */
596         SAVE_8GPRS(14, r1)
597         SAVE_10GPRS(22, r1)
598         std     r0,_NIP(r1)     /* Return to switch caller */
599         mfcr    r23
600         std     r23,_CCR(r1)
601         std     r1,KSP(r3)      /* Set old stack pointer */
602
603         FLUSH_COUNT_CACHE
604
605         /*
606          * On SMP kernels, care must be taken because a task may be
607          * scheduled off CPUx and on to CPUy. Memory ordering must be
608          * considered.
609          *
610          * Cacheable stores on CPUx will be visible when the task is
611          * scheduled on CPUy by virtue of the core scheduler barriers
612          * (see "Notes on Program-Order guarantees on SMP systems." in
613          * kernel/sched/core.c).
614          *
615          * Uncacheable stores in the case of involuntary preemption must
616          * be taken care of. The smp_mb__before_spin_lock() in __schedule()
617          * is implemented as hwsync on powerpc, which orders MMIO too. So
618          * long as there is an hwsync in the context switch path, it will
619          * be executed on the source CPU after the task has performed
620          * all MMIO ops on that CPU, and on the destination CPU before the
621          * task performs any MMIO ops there.
622          */
623
624         /*
625          * The kernel context switch path must contain a spin_lock,
626          * which contains larx/stcx, which will clear any reservation
627          * of the task being switched.
628          */
629 #ifdef CONFIG_PPC_BOOK3S
630 /* Cancel all explict user streams as they will have no use after context
631  * switch and will stop the HW from creating streams itself
632  */
633         DCBT_BOOK3S_STOP_ALL_STREAM_IDS(r6)
634 #endif
635
636         addi    r6,r4,-THREAD   /* Convert THREAD to 'current' */
637         std     r6,PACACURRENT(r13)     /* Set new 'current' */
638
639         ld      r8,KSP(r4)      /* new stack pointer */
640 #ifdef CONFIG_PPC_BOOK3S_64
641 BEGIN_MMU_FTR_SECTION
642         b       2f
643 END_MMU_FTR_SECTION_IFSET(MMU_FTR_TYPE_RADIX)
644 BEGIN_FTR_SECTION
645         clrrdi  r6,r8,28        /* get its ESID */
646         clrrdi  r9,r1,28        /* get current sp ESID */
647 FTR_SECTION_ELSE
648         clrrdi  r6,r8,40        /* get its 1T ESID */
649         clrrdi  r9,r1,40        /* get current sp 1T ESID */
650 ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_1T_SEGMENT)
651         clrldi. r0,r6,2         /* is new ESID c00000000? */
652         cmpd    cr1,r6,r9       /* or is new ESID the same as current ESID? */
653         cror    eq,4*cr1+eq,eq
654         beq     2f              /* if yes, don't slbie it */
655
656         /* Bolt in the new stack SLB entry */
657         ld      r7,KSP_VSID(r4) /* Get new stack's VSID */
658         oris    r0,r6,(SLB_ESID_V)@h
659         ori     r0,r0,(SLB_NUM_BOLTED-1)@l
660 BEGIN_FTR_SECTION
661         li      r9,MMU_SEGSIZE_1T       /* insert B field */
662         oris    r6,r6,(MMU_SEGSIZE_1T << SLBIE_SSIZE_SHIFT)@h
663         rldimi  r7,r9,SLB_VSID_SSIZE_SHIFT,0
664 END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
665
666         /* Update the last bolted SLB.  No write barriers are needed
667          * here, provided we only update the current CPU's SLB shadow
668          * buffer.
669          */
670         ld      r9,PACA_SLBSHADOWPTR(r13)
671         li      r12,0
672         std     r12,SLBSHADOW_STACKESID(r9)     /* Clear ESID */
673         li      r12,SLBSHADOW_STACKVSID
674         STDX_BE r7,r12,r9                       /* Save VSID */
675         li      r12,SLBSHADOW_STACKESID
676         STDX_BE r0,r12,r9                       /* Save ESID */
677
678         /* No need to check for MMU_FTR_NO_SLBIE_B here, since when
679          * we have 1TB segments, the only CPUs known to have the errata
680          * only support less than 1TB of system memory and we'll never
681          * actually hit this code path.
682          */
683
684         isync
685         slbie   r6
686         slbie   r6              /* Workaround POWER5 < DD2.1 issue */
687         slbmte  r7,r0
688         isync
689 2:
690 #endif /* CONFIG_PPC_BOOK3S_64 */
691
692         CURRENT_THREAD_INFO(r7, r8)  /* base of new stack */
693         /* Note: this uses SWITCH_FRAME_SIZE rather than INT_FRAME_SIZE
694            because we don't need to leave the 288-byte ABI gap at the
695            top of the kernel stack. */
696         addi    r7,r7,THREAD_SIZE-SWITCH_FRAME_SIZE
697
698         /*
699          * PMU interrupts in radix may come in here. They will use r1, not
700          * PACAKSAVE, so this stack switch will not cause a problem. They
701          * will store to the process stack, which may then be migrated to
702          * another CPU. However the rq lock release on this CPU paired with
703          * the rq lock acquire on the new CPU before the stack becomes
704          * active on the new CPU, will order those stores.
705          */
706         mr      r1,r8           /* start using new stack pointer */
707         std     r7,PACAKSAVE(r13)
708
709         ld      r6,_CCR(r1)
710         mtcrf   0xFF,r6
711
712         /* r3-r13 are destroyed -- Cort */
713         REST_8GPRS(14, r1)
714         REST_10GPRS(22, r1)
715
716         /* convert old thread to its task_struct for return value */
717         addi    r3,r3,-THREAD
718         ld      r7,_NIP(r1)     /* Return to _switch caller in new task */
719         mtlr    r7
720         addi    r1,r1,SWITCH_FRAME_SIZE
721         blr
722
723         .align  7
724 _GLOBAL(ret_from_except)
725         ld      r11,_TRAP(r1)
726         andi.   r0,r11,1
727         bne     ret_from_except_lite
728         REST_NVGPRS(r1)
729
730 _GLOBAL(ret_from_except_lite)
731         /*
732          * Disable interrupts so that current_thread_info()->flags
733          * can't change between when we test it and when we return
734          * from the interrupt.
735          */
736 #ifdef CONFIG_PPC_BOOK3E
737         wrteei  0
738 #else
739         li      r10,MSR_RI
740         mtmsrd  r10,1             /* Update machine state */
741 #endif /* CONFIG_PPC_BOOK3E */
742
743         CURRENT_THREAD_INFO(r9, r1)
744         ld      r3,_MSR(r1)
745 #ifdef CONFIG_PPC_BOOK3E
746         ld      r10,PACACURRENT(r13)
747 #endif /* CONFIG_PPC_BOOK3E */
748         ld      r4,TI_FLAGS(r9)
749         andi.   r3,r3,MSR_PR
750         beq     resume_kernel
751 #ifdef CONFIG_PPC_BOOK3E
752         lwz     r3,(THREAD+THREAD_DBCR0)(r10)
753 #endif /* CONFIG_PPC_BOOK3E */
754
755         /* Check current_thread_info()->flags */
756         andi.   r0,r4,_TIF_USER_WORK_MASK
757         bne     1f
758 #ifdef CONFIG_PPC_BOOK3E
759         /*
760          * Check to see if the dbcr0 register is set up to debug.
761          * Use the internal debug mode bit to do this.
762          */
763         andis.  r0,r3,DBCR0_IDM@h
764         beq     restore
765         mfmsr   r0
766         rlwinm  r0,r0,0,~MSR_DE /* Clear MSR.DE */
767         mtmsr   r0
768         mtspr   SPRN_DBCR0,r3
769         li      r10, -1
770         mtspr   SPRN_DBSR,r10
771         b       restore
772 #else
773         addi    r3,r1,STACK_FRAME_OVERHEAD
774         bl      restore_math
775         b       restore
776 #endif
777 1:      andi.   r0,r4,_TIF_NEED_RESCHED
778         beq     2f
779         bl      restore_interrupts
780         SCHEDULE_USER
781         b       ret_from_except_lite
782 2:
783 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
784         andi.   r0,r4,_TIF_USER_WORK_MASK & ~_TIF_RESTORE_TM
785         bne     3f              /* only restore TM if nothing else to do */
786         addi    r3,r1,STACK_FRAME_OVERHEAD
787         bl      restore_tm_state
788         b       restore
789 3:
790 #endif
791         bl      save_nvgprs
792         /*
793          * Use a non volatile GPR to save and restore our thread_info flags
794          * across the call to restore_interrupts.
795          */
796         mr      r30,r4
797         bl      restore_interrupts
798         mr      r4,r30
799         addi    r3,r1,STACK_FRAME_OVERHEAD
800         bl      do_notify_resume
801         b       ret_from_except
802
803 resume_kernel:
804         /* check current_thread_info, _TIF_EMULATE_STACK_STORE */
805         andis.  r8,r4,_TIF_EMULATE_STACK_STORE@h
806         beq+    1f
807
808         addi    r8,r1,INT_FRAME_SIZE    /* Get the kprobed function entry */
809
810         ld      r3,GPR1(r1)
811         subi    r3,r3,INT_FRAME_SIZE    /* dst: Allocate a trampoline exception frame */
812         mr      r4,r1                   /* src:  current exception frame */
813         mr      r1,r3                   /* Reroute the trampoline frame to r1 */
814
815         /* Copy from the original to the trampoline. */
816         li      r5,INT_FRAME_SIZE/8     /* size: INT_FRAME_SIZE */
817         li      r6,0                    /* start offset: 0 */
818         mtctr   r5
819 2:      ldx     r0,r6,r4
820         stdx    r0,r6,r3
821         addi    r6,r6,8
822         bdnz    2b
823
824         /* Do real store operation to complete stdu */
825         ld      r5,GPR1(r1)
826         std     r8,0(r5)
827
828         /* Clear _TIF_EMULATE_STACK_STORE flag */
829         lis     r11,_TIF_EMULATE_STACK_STORE@h
830         addi    r5,r9,TI_FLAGS
831 0:      ldarx   r4,0,r5
832         andc    r4,r4,r11
833         stdcx.  r4,0,r5
834         bne-    0b
835 1:
836
837 #ifdef CONFIG_PREEMPT
838         /* Check if we need to preempt */
839         andi.   r0,r4,_TIF_NEED_RESCHED
840         beq+    restore
841         /* Check that preempt_count() == 0 and interrupts are enabled */
842         lwz     r8,TI_PREEMPT(r9)
843         cmpwi   cr0,r8,0
844         bne     restore
845         ld      r0,SOFTE(r1)
846         andi.   r0,r0,IRQS_DISABLED
847         bne     restore
848
849         /*
850          * Here we are preempting the current task. We want to make
851          * sure we are soft-disabled first and reconcile irq state.
852          */
853         RECONCILE_IRQ_STATE(r3,r4)
854 1:      bl      preempt_schedule_irq
855
856         /* Re-test flags and eventually loop */
857         CURRENT_THREAD_INFO(r9, r1)
858         ld      r4,TI_FLAGS(r9)
859         andi.   r0,r4,_TIF_NEED_RESCHED
860         bne     1b
861
862         /*
863          * arch_local_irq_restore() from preempt_schedule_irq above may
864          * enable hard interrupt but we really should disable interrupts
865          * when we return from the interrupt, and so that we don't get
866          * interrupted after loading SRR0/1.
867          */
868 #ifdef CONFIG_PPC_BOOK3E
869         wrteei  0
870 #else
871         li      r10,MSR_RI
872         mtmsrd  r10,1             /* Update machine state */
873 #endif /* CONFIG_PPC_BOOK3E */
874 #endif /* CONFIG_PREEMPT */
875
876         .globl  fast_exc_return_irq
877 fast_exc_return_irq:
878 restore:
879         /*
880          * This is the main kernel exit path. First we check if we
881          * are about to re-enable interrupts
882          */
883         ld      r5,SOFTE(r1)
884         lbz     r6,PACAIRQSOFTMASK(r13)
885         andi.   r5,r5,IRQS_DISABLED
886         bne     .Lrestore_irq_off
887
888         /* We are enabling, were we already enabled ? Yes, just return */
889         andi.   r6,r6,IRQS_DISABLED
890         beq     cr0,.Ldo_restore
891
892         /*
893          * We are about to soft-enable interrupts (we are hard disabled
894          * at this point). We check if there's anything that needs to
895          * be replayed first.
896          */
897         lbz     r0,PACAIRQHAPPENED(r13)
898         cmpwi   cr0,r0,0
899         bne-    .Lrestore_check_irq_replay
900
901         /*
902          * Get here when nothing happened while soft-disabled, just
903          * soft-enable and move-on. We will hard-enable as a side
904          * effect of rfi
905          */
906 .Lrestore_no_replay:
907         TRACE_ENABLE_INTS
908         li      r0,IRQS_ENABLED
909         stb     r0,PACAIRQSOFTMASK(r13);
910
911         /*
912          * Final return path. BookE is handled in a different file
913          */
914 .Ldo_restore:
915 #ifdef CONFIG_PPC_BOOK3E
916         b       exception_return_book3e
917 #else
918         /*
919          * Clear the reservation. If we know the CPU tracks the address of
920          * the reservation then we can potentially save some cycles and use
921          * a larx. On POWER6 and POWER7 this is significantly faster.
922          */
923 BEGIN_FTR_SECTION
924         stdcx.  r0,0,r1         /* to clear the reservation */
925 FTR_SECTION_ELSE
926         ldarx   r4,0,r1
927 ALT_FTR_SECTION_END_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
928
929         /*
930          * Some code path such as load_up_fpu or altivec return directly
931          * here. They run entirely hard disabled and do not alter the
932          * interrupt state. They also don't use lwarx/stwcx. and thus
933          * are known not to leave dangling reservations.
934          */
935         .globl  fast_exception_return
936 fast_exception_return:
937         ld      r3,_MSR(r1)
938         ld      r4,_CTR(r1)
939         ld      r0,_LINK(r1)
940         mtctr   r4
941         mtlr    r0
942         ld      r4,_XER(r1)
943         mtspr   SPRN_XER,r4
944
945         REST_8GPRS(5, r1)
946
947         andi.   r0,r3,MSR_RI
948         beq-    .Lunrecov_restore
949
950         /* Load PPR from thread struct before we clear MSR:RI */
951 BEGIN_FTR_SECTION
952         ld      r2,PACACURRENT(r13)
953         ld      r2,TASKTHREADPPR(r2)
954 END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
955
956         /*
957          * Clear RI before restoring r13.  If we are returning to
958          * userspace and we take an exception after restoring r13,
959          * we end up corrupting the userspace r13 value.
960          */
961         li      r4,0
962         mtmsrd  r4,1
963
964 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
965         /* TM debug */
966         std     r3, PACATMSCRATCH(r13) /* Stash returned-to MSR */
967 #endif
968         /*
969          * r13 is our per cpu area, only restore it if we are returning to
970          * userspace the value stored in the stack frame may belong to
971          * another CPU.
972          */
973         andi.   r0,r3,MSR_PR
974         beq     1f
975 BEGIN_FTR_SECTION
976         mtspr   SPRN_PPR,r2     /* Restore PPR */
977 END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
978         ACCOUNT_CPU_USER_EXIT(r13, r2, r4)
979         REST_GPR(13, r1)
980
981         mtspr   SPRN_SRR1,r3
982
983         ld      r2,_CCR(r1)
984         mtcrf   0xFF,r2
985         ld      r2,_NIP(r1)
986         mtspr   SPRN_SRR0,r2
987
988         ld      r0,GPR0(r1)
989         ld      r2,GPR2(r1)
990         ld      r3,GPR3(r1)
991         ld      r4,GPR4(r1)
992         ld      r1,GPR1(r1)
993         RFI_TO_USER
994         b       .       /* prevent speculative execution */
995
996 1:      mtspr   SPRN_SRR1,r3
997
998         ld      r2,_CCR(r1)
999         mtcrf   0xFF,r2
1000         ld      r2,_NIP(r1)
1001         mtspr   SPRN_SRR0,r2
1002
1003         /*
1004          * Leaving a stale exception_marker on the stack can confuse
1005          * the reliable stack unwinder later on. Clear it.
1006          */
1007         li      r2,0
1008         std     r2,STACK_FRAME_OVERHEAD-16(r1)
1009
1010         ld      r0,GPR0(r1)
1011         ld      r2,GPR2(r1)
1012         ld      r3,GPR3(r1)
1013         ld      r4,GPR4(r1)
1014         ld      r1,GPR1(r1)
1015         RFI_TO_KERNEL
1016         b       .       /* prevent speculative execution */
1017
1018 #endif /* CONFIG_PPC_BOOK3E */
1019
1020         /*
1021          * We are returning to a context with interrupts soft disabled.
1022          *
1023          * However, we may also about to hard enable, so we need to
1024          * make sure that in this case, we also clear PACA_IRQ_HARD_DIS
1025          * or that bit can get out of sync and bad things will happen
1026          */
1027 .Lrestore_irq_off:
1028         ld      r3,_MSR(r1)
1029         lbz     r7,PACAIRQHAPPENED(r13)
1030         andi.   r0,r3,MSR_EE
1031         beq     1f
1032         rlwinm  r7,r7,0,~PACA_IRQ_HARD_DIS
1033         stb     r7,PACAIRQHAPPENED(r13)
1034 1:
1035 #if defined(CONFIG_PPC_IRQ_SOFT_MASK_DEBUG) && defined(CONFIG_BUG)
1036         /* The interrupt should not have soft enabled. */
1037         lbz     r7,PACAIRQSOFTMASK(r13)
1038 1:      tdeqi   r7,IRQS_ENABLED
1039         EMIT_BUG_ENTRY 1b,__FILE__,__LINE__,BUGFLAG_WARNING
1040 #endif
1041         b       .Ldo_restore
1042
1043         /*
1044          * Something did happen, check if a re-emit is needed
1045          * (this also clears paca->irq_happened)
1046          */
1047 .Lrestore_check_irq_replay:
1048         /* XXX: We could implement a fast path here where we check
1049          * for irq_happened being just 0x01, in which case we can
1050          * clear it and return. That means that we would potentially
1051          * miss a decrementer having wrapped all the way around.
1052          *
1053          * Still, this might be useful for things like hash_page
1054          */
1055         bl      __check_irq_replay
1056         cmpwi   cr0,r3,0
1057         beq     .Lrestore_no_replay
1058  
1059         /*
1060          * We need to re-emit an interrupt. We do so by re-using our
1061          * existing exception frame. We first change the trap value,
1062          * but we need to ensure we preserve the low nibble of it
1063          */
1064         ld      r4,_TRAP(r1)
1065         clrldi  r4,r4,60
1066         or      r4,r4,r3
1067         std     r4,_TRAP(r1)
1068
1069         /*
1070          * PACA_IRQ_HARD_DIS won't always be set here, so set it now
1071          * to reconcile the IRQ state. Tracing is already accounted for.
1072          */
1073         lbz     r4,PACAIRQHAPPENED(r13)
1074         ori     r4,r4,PACA_IRQ_HARD_DIS
1075         stb     r4,PACAIRQHAPPENED(r13)
1076
1077         /*
1078          * Then find the right handler and call it. Interrupts are
1079          * still soft-disabled and we keep them that way.
1080         */
1081         cmpwi   cr0,r3,0x500
1082         bne     1f
1083         addi    r3,r1,STACK_FRAME_OVERHEAD;
1084         bl      do_IRQ
1085         b       ret_from_except
1086 1:      cmpwi   cr0,r3,0xf00
1087         bne     1f
1088         addi    r3,r1,STACK_FRAME_OVERHEAD;
1089         bl      performance_monitor_exception
1090         b       ret_from_except
1091 1:      cmpwi   cr0,r3,0xe60
1092         bne     1f
1093         addi    r3,r1,STACK_FRAME_OVERHEAD;
1094         bl      handle_hmi_exception
1095         b       ret_from_except
1096 1:      cmpwi   cr0,r3,0x900
1097         bne     1f
1098         addi    r3,r1,STACK_FRAME_OVERHEAD;
1099         bl      timer_interrupt
1100         b       ret_from_except
1101 #ifdef CONFIG_PPC_DOORBELL
1102 1:
1103 #ifdef CONFIG_PPC_BOOK3E
1104         cmpwi   cr0,r3,0x280
1105 #else
1106         cmpwi   cr0,r3,0xa00
1107 #endif /* CONFIG_PPC_BOOK3E */
1108         bne     1f
1109         addi    r3,r1,STACK_FRAME_OVERHEAD;
1110         bl      doorbell_exception
1111 #endif /* CONFIG_PPC_DOORBELL */
1112 1:      b       ret_from_except /* What else to do here ? */
1113  
1114 .Lunrecov_restore:
1115         addi    r3,r1,STACK_FRAME_OVERHEAD
1116         bl      unrecoverable_exception
1117         b       .Lunrecov_restore
1118
1119 _ASM_NOKPROBE_SYMBOL(ret_from_except);
1120 _ASM_NOKPROBE_SYMBOL(ret_from_except_lite);
1121 _ASM_NOKPROBE_SYMBOL(resume_kernel);
1122 _ASM_NOKPROBE_SYMBOL(fast_exc_return_irq);
1123 _ASM_NOKPROBE_SYMBOL(restore);
1124 _ASM_NOKPROBE_SYMBOL(fast_exception_return);
1125
1126
1127 #ifdef CONFIG_PPC_RTAS
1128 /*
1129  * On CHRP, the Run-Time Abstraction Services (RTAS) have to be
1130  * called with the MMU off.
1131  *
1132  * In addition, we need to be in 32b mode, at least for now.
1133  * 
1134  * Note: r3 is an input parameter to rtas, so don't trash it...
1135  */
1136 _GLOBAL(enter_rtas)
1137         mflr    r0
1138         std     r0,16(r1)
1139         stdu    r1,-RTAS_FRAME_SIZE(r1) /* Save SP and create stack space. */
1140
1141         /* Because RTAS is running in 32b mode, it clobbers the high order half
1142          * of all registers that it saves.  We therefore save those registers
1143          * RTAS might touch to the stack.  (r0, r3-r13 are caller saved)
1144          */
1145         SAVE_GPR(2, r1)                 /* Save the TOC */
1146         SAVE_GPR(13, r1)                /* Save paca */
1147         SAVE_8GPRS(14, r1)              /* Save the non-volatiles */
1148         SAVE_10GPRS(22, r1)             /* ditto */
1149
1150         mfcr    r4
1151         std     r4,_CCR(r1)
1152         mfctr   r5
1153         std     r5,_CTR(r1)
1154         mfspr   r6,SPRN_XER
1155         std     r6,_XER(r1)
1156         mfdar   r7
1157         std     r7,_DAR(r1)
1158         mfdsisr r8
1159         std     r8,_DSISR(r1)
1160
1161         /* Temporary workaround to clear CR until RTAS can be modified to
1162          * ignore all bits.
1163          */
1164         li      r0,0
1165         mtcr    r0
1166
1167 #ifdef CONFIG_BUG
1168         /* There is no way it is acceptable to get here with interrupts enabled,
1169          * check it with the asm equivalent of WARN_ON
1170          */
1171         lbz     r0,PACAIRQSOFTMASK(r13)
1172 1:      tdeqi   r0,IRQS_ENABLED
1173         EMIT_BUG_ENTRY 1b,__FILE__,__LINE__,BUGFLAG_WARNING
1174 #endif
1175
1176         /* Hard-disable interrupts */
1177         mfmsr   r6
1178         rldicl  r7,r6,48,1
1179         rotldi  r7,r7,16
1180         mtmsrd  r7,1
1181
1182         /* Unfortunately, the stack pointer and the MSR are also clobbered,
1183          * so they are saved in the PACA which allows us to restore
1184          * our original state after RTAS returns.
1185          */
1186         std     r1,PACAR1(r13)
1187         std     r6,PACASAVEDMSR(r13)
1188
1189         /* Setup our real return addr */        
1190         LOAD_REG_ADDR(r4,rtas_return_loc)
1191         clrldi  r4,r4,2                 /* convert to realmode address */
1192         mtlr    r4
1193
1194         li      r0,0
1195         ori     r0,r0,MSR_EE|MSR_SE|MSR_BE|MSR_RI
1196         andc    r0,r6,r0
1197         
1198         li      r9,1
1199         rldicr  r9,r9,MSR_SF_LG,(63-MSR_SF_LG)
1200         ori     r9,r9,MSR_IR|MSR_DR|MSR_FE0|MSR_FE1|MSR_FP|MSR_RI|MSR_LE
1201         andc    r6,r0,r9
1202
1203 __enter_rtas:
1204         sync                            /* disable interrupts so SRR0/1 */
1205         mtmsrd  r0                      /* don't get trashed */
1206
1207         LOAD_REG_ADDR(r4, rtas)
1208         ld      r5,RTASENTRY(r4)        /* get the rtas->entry value */
1209         ld      r4,RTASBASE(r4)         /* get the rtas->base value */
1210         
1211         mtspr   SPRN_SRR0,r5
1212         mtspr   SPRN_SRR1,r6
1213         RFI_TO_KERNEL
1214         b       .       /* prevent speculative execution */
1215
1216 rtas_return_loc:
1217         FIXUP_ENDIAN
1218
1219         /*
1220          * Clear RI and set SF before anything.
1221          */
1222         mfmsr   r6
1223         li      r0,MSR_RI
1224         andc    r6,r6,r0
1225         sldi    r0,r0,(MSR_SF_LG - MSR_RI_LG)
1226         or      r6,r6,r0
1227         sync
1228         mtmsrd  r6
1229
1230         /* relocation is off at this point */
1231         GET_PACA(r4)
1232         clrldi  r4,r4,2                 /* convert to realmode address */
1233
1234         bcl     20,31,$+4
1235 0:      mflr    r3
1236         ld      r3,(1f-0b)(r3)          /* get &rtas_restore_regs */
1237
1238         ld      r1,PACAR1(r4)           /* Restore our SP */
1239         ld      r4,PACASAVEDMSR(r4)     /* Restore our MSR */
1240
1241         mtspr   SPRN_SRR0,r3
1242         mtspr   SPRN_SRR1,r4
1243         RFI_TO_KERNEL
1244         b       .       /* prevent speculative execution */
1245 _ASM_NOKPROBE_SYMBOL(__enter_rtas)
1246 _ASM_NOKPROBE_SYMBOL(rtas_return_loc)
1247
1248         .align  3
1249 1:      .8byte  rtas_restore_regs
1250
1251 rtas_restore_regs:
1252         /* relocation is on at this point */
1253         REST_GPR(2, r1)                 /* Restore the TOC */
1254         REST_GPR(13, r1)                /* Restore paca */
1255         REST_8GPRS(14, r1)              /* Restore the non-volatiles */
1256         REST_10GPRS(22, r1)             /* ditto */
1257
1258         GET_PACA(r13)
1259
1260         ld      r4,_CCR(r1)
1261         mtcr    r4
1262         ld      r5,_CTR(r1)
1263         mtctr   r5
1264         ld      r6,_XER(r1)
1265         mtspr   SPRN_XER,r6
1266         ld      r7,_DAR(r1)
1267         mtdar   r7
1268         ld      r8,_DSISR(r1)
1269         mtdsisr r8
1270
1271         addi    r1,r1,RTAS_FRAME_SIZE   /* Unstack our frame */
1272         ld      r0,16(r1)               /* get return address */
1273
1274         mtlr    r0
1275         blr                             /* return to caller */
1276
1277 #endif /* CONFIG_PPC_RTAS */
1278
1279 _GLOBAL(enter_prom)
1280         mflr    r0
1281         std     r0,16(r1)
1282         stdu    r1,-PROM_FRAME_SIZE(r1) /* Save SP and create stack space */
1283
1284         /* Because PROM is running in 32b mode, it clobbers the high order half
1285          * of all registers that it saves.  We therefore save those registers
1286          * PROM might touch to the stack.  (r0, r3-r13 are caller saved)
1287          */
1288         SAVE_GPR(2, r1)
1289         SAVE_GPR(13, r1)
1290         SAVE_8GPRS(14, r1)
1291         SAVE_10GPRS(22, r1)
1292         mfcr    r10
1293         mfmsr   r11
1294         std     r10,_CCR(r1)
1295         std     r11,_MSR(r1)
1296
1297         /* Put PROM address in SRR0 */
1298         mtsrr0  r4
1299
1300         /* Setup our trampoline return addr in LR */
1301         bcl     20,31,$+4
1302 0:      mflr    r4
1303         addi    r4,r4,(1f - 0b)
1304         mtlr    r4
1305
1306         /* Prepare a 32-bit mode big endian MSR
1307          */
1308 #ifdef CONFIG_PPC_BOOK3E
1309         rlwinm  r11,r11,0,1,31
1310         mtsrr1  r11
1311         rfi
1312 #else /* CONFIG_PPC_BOOK3E */
1313         LOAD_REG_IMMEDIATE(r12, MSR_SF | MSR_ISF | MSR_LE)
1314         andc    r11,r11,r12
1315         mtsrr1  r11
1316         RFI_TO_KERNEL
1317 #endif /* CONFIG_PPC_BOOK3E */
1318
1319 1:      /* Return from OF */
1320         FIXUP_ENDIAN
1321
1322         /* Just make sure that r1 top 32 bits didn't get
1323          * corrupt by OF
1324          */
1325         rldicl  r1,r1,0,32
1326
1327         /* Restore the MSR (back to 64 bits) */
1328         ld      r0,_MSR(r1)
1329         MTMSRD(r0)
1330         isync
1331
1332         /* Restore other registers */
1333         REST_GPR(2, r1)
1334         REST_GPR(13, r1)
1335         REST_8GPRS(14, r1)
1336         REST_10GPRS(22, r1)
1337         ld      r4,_CCR(r1)
1338         mtcr    r4
1339         
1340         addi    r1,r1,PROM_FRAME_SIZE
1341         ld      r0,16(r1)
1342         mtlr    r0
1343         blr