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