vserver 1.9.3
[linux-2.6.git] / arch / ppc64 / kernel / entry.S
1 /*
2  *  arch/ppc64/kernel/entry.S
3  *
4  *  PowerPC version 
5  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
6  *  Rewritten by Cort Dougan (cort@cs.nmt.edu) for PReP
7  *    Copyright (C) 1996 Cort Dougan <cort@cs.nmt.edu>
8  *  Adapted for Power Macintosh by Paul Mackerras.
9  *  Low-level exception handlers and MMU support
10  *  rewritten by Paul Mackerras.
11  *    Copyright (C) 1996 Paul Mackerras.
12  *  MPC8xx modifications Copyright (C) 1997 Dan Malek (dmalek@jlc.net).
13  *
14  *  This file contains the system call entry code, context switch
15  *  code, and exception/interrupt return code for PowerPC.
16  *
17  *  This program is free software; you can redistribute it and/or
18  *  modify it under the terms of the GNU General Public License
19  *  as published by the Free Software Foundation; either version
20  *  2 of the License, or (at your option) any later version.
21  */
22
23 #include <linux/config.h>
24 #include <linux/errno.h>
25 #include <asm/unistd.h>
26 #include <asm/processor.h>
27 #include <asm/page.h>
28 #include <asm/mmu.h>
29 #include <asm/thread_info.h>
30 #include <asm/ppc_asm.h>
31 #include <asm/offsets.h>
32 #include <asm/cputable.h>
33
34 #ifdef CONFIG_PPC_ISERIES
35 #define DO_SOFT_DISABLE
36 #endif
37
38 /*
39  * System calls.
40  */
41         .section        ".toc","aw"
42 .SYS_CALL_TABLE:
43         .tc .sys_call_table[TC],.sys_call_table
44
45 .SYS_CALL_TABLE32:
46         .tc .sys_call_table32[TC],.sys_call_table32
47
48 /* This value is used to mark exception frames on the stack. */
49 exception_marker:
50         .tc     ID_72656773_68657265[TC],0x7265677368657265
51
52         .section        ".text"
53         .align 7
54
55 #undef SHOW_SYSCALLS
56
57         .globl SystemCall_common
58 SystemCall_common:
59         andi.   r10,r12,MSR_PR
60         mr      r10,r1
61         addi    r1,r1,-INT_FRAME_SIZE
62         beq-    1f
63         ld      r1,PACAKSAVE(r13)
64 1:      std     r10,0(r1)
65         std     r11,_NIP(r1)
66         std     r12,_MSR(r1)
67         std     r0,GPR0(r1)
68         std     r10,GPR1(r1)
69         std     r2,GPR2(r1)
70         std     r3,GPR3(r1)
71         std     r4,GPR4(r1)
72         std     r5,GPR5(r1)
73         std     r6,GPR6(r1)
74         std     r7,GPR7(r1)
75         std     r8,GPR8(r1)
76         li      r11,0
77         std     r11,GPR9(r1)
78         std     r11,GPR10(r1)
79         std     r11,GPR11(r1)
80         std     r11,GPR12(r1)
81         std     r9,GPR13(r1)
82         crclr   so
83         mfcr    r9
84         mflr    r10
85         li      r11,0xc01
86         std     r9,_CCR(r1)
87         std     r10,_LINK(r1)
88         std     r11,_TRAP(r1)
89         mfxer   r9
90         mfctr   r10
91         std     r9,_XER(r1)
92         std     r10,_CTR(r1)
93         std     r3,ORIG_GPR3(r1)
94         ld      r2,PACATOC(r13)
95         addi    r9,r1,STACK_FRAME_OVERHEAD
96         ld      r11,exception_marker@toc(r2)
97         std     r11,-16(r9)             /* "regshere" marker */
98 #ifdef CONFIG_PPC_ISERIES
99         /* Hack for handling interrupts when soft-enabling on iSeries */
100         cmpdi   cr1,r0,0x5555           /* syscall 0x5555 */
101         andi.   r10,r12,MSR_PR          /* from kernel */
102         crand   4*cr0+eq,4*cr1+eq,4*cr0+eq
103         beq     HardwareInterrupt_entry
104         lbz     r10,PACAPROCENABLED(r13)
105         std     r10,SOFTE(r1)
106 #endif
107         mfmsr   r11
108         ori     r11,r11,MSR_EE
109         mtmsrd  r11,1
110
111 #ifdef SHOW_SYSCALLS
112         bl      .do_show_syscall
113         REST_GPR(0,r1)
114         REST_4GPRS(3,r1)
115         REST_2GPRS(7,r1)
116         addi    r9,r1,STACK_FRAME_OVERHEAD
117 #endif
118         clrrdi  r11,r1,THREAD_SHIFT
119         li      r12,0
120         ld      r10,TI_FLAGS(r11)
121         stb     r12,TI_SC_NOERR(r11)
122         andi.   r11,r10,_TIF_SYSCALL_T_OR_A
123         bne-    syscall_dotrace
124 syscall_dotrace_cont:
125         cmpldi  0,r0,NR_syscalls
126         bge-    syscall_enosys
127
128 system_call:                    /* label this so stack traces look sane */
129 /*
130  * Need to vector to 32 Bit or default sys_call_table here,
131  * based on caller's run-mode / personality.
132  */
133         ld      r11,.SYS_CALL_TABLE@toc(2)
134         andi.   r10,r10,_TIF_32BIT
135         beq     15f
136         ld      r11,.SYS_CALL_TABLE32@toc(2)
137         clrldi  r3,r3,32
138         clrldi  r4,r4,32
139         clrldi  r5,r5,32
140         clrldi  r6,r6,32
141         clrldi  r7,r7,32
142         clrldi  r8,r8,32
143 15:
144         slwi    r0,r0,3
145         ldx     r10,r11,r0      /* Fetch system call handler [ptr] */
146         mtctr   r10
147         bctrl                   /* Call handler */
148
149 syscall_exit:
150 #ifdef SHOW_SYSCALLS
151         std     r3,GPR3(r1)
152         bl      .do_show_syscall_exit
153         ld      r3,GPR3(r1)
154 #endif
155         std     r3,RESULT(r1)
156         ld      r5,_CCR(r1)
157         li      r10,-_LAST_ERRNO
158         cmpld   r3,r10
159         clrrdi  r12,r1,THREAD_SHIFT
160         bge-    syscall_error
161 syscall_error_cont:
162
163         /* check for syscall tracing or audit */
164         ld      r9,TI_FLAGS(r12)
165         andi.   r0,r9,_TIF_SYSCALL_T_OR_A
166         bne-    syscall_exit_trace
167 syscall_exit_trace_cont:
168
169         /* disable interrupts so current_thread_info()->flags can't change,
170            and so that we don't get interrupted after loading SRR0/1. */
171         ld      r8,_MSR(r1)
172         andi.   r10,r8,MSR_RI
173         beq-    unrecov_restore
174         mfmsr   r10
175         rldicl  r10,r10,48,1
176         rotldi  r10,r10,16
177         mtmsrd  r10,1
178         ld      r9,TI_FLAGS(r12)
179         andi.   r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SIGPENDING|_TIF_NEED_RESCHED)
180         bne-    syscall_exit_work
181         ld      r7,_NIP(r1)
182         stdcx.  r0,0,r1                 /* to clear the reservation */
183         andi.   r6,r8,MSR_PR
184         ld      r4,_LINK(r1)
185         beq-    1f                      /* only restore r13 if */
186         ld      r13,GPR13(r1)           /* returning to usermode */
187 1:      ld      r2,GPR2(r1)
188         ld      r1,GPR1(r1)
189         li      r12,MSR_RI
190         andc    r10,r10,r12
191         mtmsrd  r10,1                   /* clear MSR.RI */
192         mtlr    r4
193         mtcr    r5
194         mtspr   SRR0,r7
195         mtspr   SRR1,r8
196         rfid
197         b       .       /* prevent speculative execution */
198
199 syscall_enosys:
200         li      r3,-ENOSYS
201         std     r3,RESULT(r1)
202         clrrdi  r12,r1,THREAD_SHIFT
203         ld      r5,_CCR(r1)
204
205 syscall_error:
206         lbz     r11,TI_SC_NOERR(r12)
207         cmpwi   0,r11,0
208         bne-    syscall_error_cont
209         neg     r3,r3
210         oris    r5,r5,0x1000    /* Set SO bit in CR */
211         std     r5,_CCR(r1)
212         b       syscall_error_cont
213         
214 /* Traced system call support */
215 syscall_dotrace:
216         bl      .save_nvgprs
217         addi    r3,r1,STACK_FRAME_OVERHEAD
218         bl      .do_syscall_trace_enter
219         ld      r0,GPR0(r1)     /* Restore original registers */
220         ld      r3,GPR3(r1)
221         ld      r4,GPR4(r1)
222         ld      r5,GPR5(r1)
223         ld      r6,GPR6(r1)
224         ld      r7,GPR7(r1)
225         ld      r8,GPR8(r1)
226         addi    r9,r1,STACK_FRAME_OVERHEAD
227         clrrdi  r10,r1,THREAD_SHIFT
228         ld      r10,TI_FLAGS(r10)
229         b       syscall_dotrace_cont
230
231 syscall_exit_trace:
232         std     r3,GPR3(r1)
233         bl      .save_nvgprs
234         bl      .do_syscall_trace_leave
235         REST_NVGPRS(r1)
236         ld      r3,GPR3(r1)
237         ld      r5,_CCR(r1)
238         clrrdi  r12,r1,THREAD_SHIFT
239         b       syscall_exit_trace_cont
240
241 /* Stuff to do on exit from a system call. */
242 syscall_exit_work:
243         std     r3,GPR3(r1)
244         std     r5,_CCR(r1)
245         b       .ret_from_except_lite
246
247 /* Save non-volatile GPRs, if not already saved. */
248 _GLOBAL(save_nvgprs)
249         ld      r11,_TRAP(r1)
250         andi.   r0,r11,1
251         beqlr-
252         SAVE_NVGPRS(r1)
253         clrrdi  r0,r11,1
254         std     r0,_TRAP(r1)
255         blr
256
257 /*
258  * The sigsuspend and rt_sigsuspend system calls can call do_signal
259  * and thus put the process into the stopped state where we might
260  * want to examine its user state with ptrace.  Therefore we need
261  * to save all the nonvolatile registers (r14 - r31) before calling
262  * the C code.  Similarly, fork, vfork and clone need the full
263  * register state on the stack so that it can be copied to the child.
264  */
265 _GLOBAL(ppc32_sigsuspend)
266         bl      .save_nvgprs
267         bl      .sys32_sigsuspend
268         b       syscall_exit
269
270 _GLOBAL(ppc64_rt_sigsuspend)
271         bl      .save_nvgprs
272         bl      .sys_rt_sigsuspend
273         b       syscall_exit
274
275 _GLOBAL(ppc32_rt_sigsuspend)
276         bl      .save_nvgprs
277         bl      .sys32_rt_sigsuspend
278         b       syscall_exit
279
280 _GLOBAL(ppc_fork)
281         bl      .save_nvgprs
282         bl      .sys_fork
283         b       syscall_exit
284
285 _GLOBAL(ppc_vfork)
286         bl      .save_nvgprs
287         bl      .sys_vfork
288         b       syscall_exit
289
290 _GLOBAL(ppc_clone)
291         bl      .save_nvgprs
292         bl      .sys_clone
293         b       syscall_exit
294
295 _GLOBAL(ppc32_swapcontext)
296         bl      .save_nvgprs
297         bl      .sys32_swapcontext
298         b       80f
299         
300 _GLOBAL(ppc64_swapcontext)
301         bl      .save_nvgprs
302         bl      .sys_swapcontext
303         b       80f
304
305 _GLOBAL(ppc32_sigreturn)
306         bl      .sys32_sigreturn
307         b       80f
308
309 _GLOBAL(ppc32_rt_sigreturn)
310         bl      .sys32_rt_sigreturn
311         b       80f
312
313 _GLOBAL(ppc64_rt_sigreturn)
314         bl      .sys_rt_sigreturn
315
316 80:     cmpdi   0,r3,0
317         blt     syscall_exit
318         clrrdi  r4,r1,THREAD_SHIFT
319         ld      r4,TI_FLAGS(r4)
320         andi.   r4,r4,_TIF_SYSCALL_T_OR_A
321         beq+    81f
322         bl      .do_syscall_trace_leave
323 81:     b       .ret_from_except
324
325 _GLOBAL(ret_from_fork)
326         bl      .schedule_tail
327         REST_NVGPRS(r1)
328         li      r3,0
329         b       syscall_exit
330
331 /*
332  * This routine switches between two different tasks.  The process
333  * state of one is saved on its kernel stack.  Then the state
334  * of the other is restored from its kernel stack.  The memory
335  * management hardware is updated to the second process's state.
336  * Finally, we can return to the second process, via ret_from_except.
337  * On entry, r3 points to the THREAD for the current task, r4
338  * points to the THREAD for the new task.
339  *
340  * Note: there are two ways to get to the "going out" portion
341  * of this code; either by coming in via the entry (_switch)
342  * or via "fork" which must set up an environment equivalent
343  * to the "_switch" path.  If you change this you'll have to change
344  * the fork code also.
345  *
346  * The code which creates the new task context is in 'copy_thread'
347  * in arch/ppc64/kernel/process.c
348  */
349         .align  7
350 _GLOBAL(_switch)
351         mflr    r0
352         std     r0,16(r1)
353         stdu    r1,-SWITCH_FRAME_SIZE(r1)
354         /* r3-r13 are caller saved -- Cort */
355         SAVE_8GPRS(14, r1)
356         SAVE_10GPRS(22, r1)
357         mflr    r20             /* Return to switch caller */
358         mfmsr   r22
359         li      r0, MSR_FP
360 #ifdef CONFIG_ALTIVEC
361 BEGIN_FTR_SECTION
362         oris    r0,r0,MSR_VEC@h /* Disable altivec */
363         mfspr   r24,SPRN_VRSAVE /* save vrsave register value */
364         std     r24,THREAD_VRSAVE(r3)
365 END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
366 #endif /* CONFIG_ALTIVEC */
367         and.    r0,r0,r22
368         beq+    1f
369         andc    r22,r22,r0
370         mtmsrd  r22
371         isync
372 1:      std     r20,_NIP(r1)
373         mfcr    r23
374         std     r23,_CCR(r1)
375         std     r1,KSP(r3)      /* Set old stack pointer */
376
377 #ifdef CONFIG_SMP
378         /* We need a sync somewhere here to make sure that if the
379          * previous task gets rescheduled on another CPU, it sees all
380          * stores it has performed on this one.
381          */
382         sync
383 #endif /* CONFIG_SMP */
384
385         addi    r6,r4,-THREAD   /* Convert THREAD to 'current' */
386         std     r6,PACACURRENT(r13)     /* Set new 'current' */
387
388         ld      r8,KSP(r4)      /* new stack pointer */
389 BEGIN_FTR_SECTION
390         clrrdi  r6,r8,28        /* get its ESID */
391         clrrdi  r9,r1,28        /* get current sp ESID */
392         clrldi. r0,r6,2         /* is new ESID c00000000? */
393         cmpd    cr1,r6,r9       /* or is new ESID the same as current ESID? */
394         cror    eq,4*cr1+eq,eq
395         beq     2f              /* if yes, don't slbie it */
396         oris    r0,r6,0x0800    /* set C (class) bit */
397
398         /* Bolt in the new stack SLB entry */
399         ld      r7,KSP_VSID(r4) /* Get new stack's VSID */
400         oris    r6,r6,(SLB_ESID_V)@h
401         ori     r6,r6,(SLB_NUM_BOLTED-1)@l
402         slbie   r0
403         slbie   r0              /* Workaround POWER5 < DD2.1 issue */
404         slbmte  r7,r6
405         isync
406
407 2:
408 END_FTR_SECTION_IFSET(CPU_FTR_SLB)
409         clrrdi  r7,r8,THREAD_SHIFT      /* base of new stack */
410         /* Note: this uses SWITCH_FRAME_SIZE rather than INT_FRAME_SIZE
411            because we don't need to leave the 288-byte ABI gap at the
412            top of the kernel stack. */
413         addi    r7,r7,THREAD_SIZE-SWITCH_FRAME_SIZE
414
415         mr      r1,r8           /* start using new stack pointer */
416         std     r7,PACAKSAVE(r13)
417
418         ld      r6,_CCR(r1)
419         mtcrf   0xFF,r6
420
421 #ifdef CONFIG_ALTIVEC
422 BEGIN_FTR_SECTION
423         ld      r0,THREAD_VRSAVE(r4)
424         mtspr   SPRN_VRSAVE,r0          /* if G4, restore VRSAVE reg */
425 END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
426 #endif /* CONFIG_ALTIVEC */
427
428         /* r3-r13 are destroyed -- Cort */
429         REST_8GPRS(14, r1)
430         REST_10GPRS(22, r1)
431
432 #ifdef CONFIG_PPC_ISERIES
433         clrrdi  r7,r1,THREAD_SHIFT      /* get current_thread_info() */
434         ld      r7,TI_FLAGS(r7)         /* Get run light flag */
435         mfspr   r9,CTRLF
436         srdi    r7,r7,TIF_RUN_LIGHT
437         insrdi  r9,r7,1,63              /* Insert run light into CTRL */
438         mtspr   CTRLT,r9
439 #endif
440
441         /* convert old thread to its task_struct for return value */
442         addi    r3,r3,-THREAD
443         ld      r7,_NIP(r1)     /* Return to _switch caller in new task */
444         mtlr    r7
445         addi    r1,r1,SWITCH_FRAME_SIZE
446         blr
447
448         .align  7
449 _GLOBAL(ret_from_except)
450         ld      r11,_TRAP(r1)
451         andi.   r0,r11,1
452         bne     .ret_from_except_lite
453         REST_NVGPRS(r1)
454
455 _GLOBAL(ret_from_except_lite)
456         /*
457          * Disable interrupts so that current_thread_info()->flags
458          * can't change between when we test it and when we return
459          * from the interrupt.
460          */
461         mfmsr   r10             /* Get current interrupt state */
462         rldicl  r9,r10,48,1     /* clear MSR_EE */
463         rotldi  r9,r9,16
464         mtmsrd  r9,1            /* Update machine state */
465
466 #ifdef CONFIG_PREEMPT
467         clrrdi  r9,r1,THREAD_SHIFT      /* current_thread_info() */
468         li      r0,_TIF_NEED_RESCHED    /* bits to check */
469         ld      r3,_MSR(r1)
470         ld      r4,TI_FLAGS(r9)
471         /* Move MSR_PR bit in r3 to _TIF_SIGPENDING position in r0 */
472         rlwimi  r0,r3,32+TIF_SIGPENDING-MSR_PR_LG,_TIF_SIGPENDING
473         and.    r0,r4,r0        /* check NEED_RESCHED and maybe SIGPENDING */
474         bne     do_work
475
476 #else /* !CONFIG_PREEMPT */
477         ld      r3,_MSR(r1)     /* Returning to user mode? */
478         andi.   r3,r3,MSR_PR
479         beq     restore         /* if not, just restore regs and return */
480
481         /* Check current_thread_info()->flags */
482         clrrdi  r9,r1,THREAD_SHIFT
483         ld      r4,TI_FLAGS(r9)
484         andi.   r0,r4,_TIF_USER_WORK_MASK
485         bne     do_work
486 #endif
487
488 restore:
489 #ifdef CONFIG_PPC_ISERIES
490         ld      r5,SOFTE(r1)
491         cmpdi   0,r5,0
492         beq     4f
493         /* Check for pending interrupts (iSeries) */
494         ld      r3,PACALPPACA+LPPACAANYINT(r13)
495         cmpdi   r3,0
496         beq+    4f                      /* skip do_IRQ if no interrupts */
497
498         li      r3,0
499         stb     r3,PACAPROCENABLED(r13) /* ensure we are soft-disabled */
500         mtmsrd  r10                     /* hard-enable again */
501         addi    r3,r1,STACK_FRAME_OVERHEAD
502         bl      .do_IRQ
503         b       .ret_from_except                /* loop back and handle more */
504
505 4:      stb     r5,PACAPROCENABLED(r13)
506 #endif
507
508         ld      r3,_MSR(r1)
509         andi.   r0,r3,MSR_RI
510         beq-    unrecov_restore
511
512         andi.   r0,r3,MSR_PR
513
514         /*
515          * r13 is our per cpu area, only restore it if we are returning to
516          * userspace
517          */
518         beq     1f
519         REST_GPR(13, r1)
520 1:
521         ld      r3,_CTR(r1)
522         ld      r0,_LINK(r1)
523         mtctr   r3
524         mtlr    r0
525         ld      r3,_XER(r1)
526         mtspr   XER,r3
527
528         REST_8GPRS(5, r1)
529
530         stdcx.  r0,0,r1         /* to clear the reservation */
531
532         mfmsr   r0
533         li      r2, MSR_RI
534         andc    r0,r0,r2
535         mtmsrd  r0,1
536
537         ld      r0,_MSR(r1)
538         mtspr   SRR1,r0
539
540         ld      r2,_CCR(r1)
541         mtcrf   0xFF,r2
542         ld      r2,_NIP(r1)
543         mtspr   SRR0,r2
544
545         ld      r0,GPR0(r1)
546         ld      r2,GPR2(r1)
547         ld      r3,GPR3(r1)
548         ld      r4,GPR4(r1)
549         ld      r1,GPR1(r1)
550
551         rfid
552         b       .       /* prevent speculative execution */
553
554 /* Note: this must change if we start using the TIF_NOTIFY_RESUME bit */
555 do_work:
556 #ifdef CONFIG_PREEMPT
557         andi.   r0,r3,MSR_PR    /* Returning to user mode? */
558         bne     user_work
559         /* Check that preempt_count() == 0 and interrupts are enabled */
560         lwz     r8,TI_PREEMPT(r9)
561         cmpwi   cr1,r8,0
562 #ifdef CONFIG_PPC_ISERIES
563         ld      r0,SOFTE(r1)
564         cmpdi   r0,0
565 #else
566         andi.   r0,r3,MSR_EE
567 #endif
568         crandc  eq,cr1*4+eq,eq
569         bne     restore
570         /* here we are preempting the current task */
571 1:      lis     r0,PREEMPT_ACTIVE@h
572         stw     r0,TI_PREEMPT(r9)
573 #ifdef CONFIG_PPC_ISERIES
574         li      r0,1
575         stb     r0,PACAPROCENABLED(r13)
576 #endif
577         mtmsrd  r10,1           /* reenable interrupts */
578         bl      .schedule
579         mfmsr   r10
580         clrrdi  r9,r1,THREAD_SHIFT
581         rldicl  r10,r10,48,1    /* disable interrupts again */
582         li      r0,0
583         rotldi  r10,r10,16
584         mtmsrd  r10,1
585         ld      r4,TI_FLAGS(r9)
586         andi.   r0,r4,_TIF_NEED_RESCHED
587         bne     1b
588         stw     r0,TI_PREEMPT(r9)
589         b       restore
590
591 user_work:
592 #endif
593         /* Enable interrupts */
594         mtmsrd  r10,1
595
596         andi.   r0,r4,_TIF_NEED_RESCHED
597         beq     1f
598         bl      .schedule
599         b       .ret_from_except_lite
600
601 1:      bl      .save_nvgprs
602         li      r3,0
603         addi    r4,r1,STACK_FRAME_OVERHEAD
604         bl      .do_signal
605         b       .ret_from_except
606
607 unrecov_restore:
608         addi    r3,r1,STACK_FRAME_OVERHEAD
609         bl      .unrecoverable_exception
610         b       unrecov_restore
611
612 #ifdef CONFIG_PPC_PSERIES
613 /*
614  * On CHRP, the Run-Time Abstraction Services (RTAS) have to be
615  * called with the MMU off.
616  *
617  * In addition, we need to be in 32b mode, at least for now.
618  * 
619  * Note: r3 is an input parameter to rtas, so don't trash it...
620  */
621 _GLOBAL(enter_rtas)
622         mflr    r0
623         std     r0,16(r1)
624         stdu    r1,-RTAS_FRAME_SIZE(r1) /* Save SP and create stack space. */
625
626         /* Because RTAS is running in 32b mode, it clobbers the high order half
627          * of all registers that it saves.  We therefore save those registers
628          * RTAS might touch to the stack.  (r0, r3-r13 are caller saved)
629          */
630         SAVE_GPR(2, r1)                 /* Save the TOC */
631         SAVE_GPR(13, r1)                /* Save paca */
632         SAVE_8GPRS(14, r1)              /* Save the non-volatiles */
633         SAVE_10GPRS(22, r1)             /* ditto */
634
635         mfcr    r4
636         std     r4,_CCR(r1)
637         mfctr   r5
638         std     r5,_CTR(r1)
639         mfspr   r6,XER
640         std     r6,_XER(r1)
641         mfdar   r7
642         std     r7,_DAR(r1)
643         mfdsisr r8
644         std     r8,_DSISR(r1)
645         mfsrr0  r9
646         std     r9,_SRR0(r1)
647         mfsrr1  r10
648         std     r10,_SRR1(r1)
649
650         /* There is no way it is acceptable to get here with interrupts enabled,
651          * check it with the asm equivalent of WARN_ON
652          */
653         mfmsr   r6
654         andi.   r0,r6,MSR_EE
655 1:      tdnei   r0,0
656 .section __bug_table,"a"
657         .llong  1b,__LINE__ + 0x1000000, 1f, 2f
658 .previous
659 .section .rodata,"a"
660 1:      .asciz  __FILE__
661 2:      .asciz "enter_rtas"
662 .previous
663         
664         /* Unfortunately, the stack pointer and the MSR are also clobbered,
665          * so they are saved in the PACA which allows us to restore
666          * our original state after RTAS returns.
667          */
668         std     r1,PACAR1(r13)
669         std     r6,PACASAVEDMSR(r13)
670
671         /* Setup our real return addr */        
672         SET_REG_TO_LABEL(r4,.rtas_return_loc)
673         SET_REG_TO_CONST(r9,KERNELBASE)
674         sub     r4,r4,r9
675         mtlr    r4
676
677         li      r0,0
678         ori     r0,r0,MSR_EE|MSR_SE|MSR_BE|MSR_RI
679         andc    r0,r6,r0
680         
681         li      r9,1
682         rldicr  r9,r9,MSR_SF_LG,(63-MSR_SF_LG)
683         ori     r9,r9,MSR_IR|MSR_DR|MSR_FE0|MSR_FE1|MSR_FP
684         andc    r6,r0,r9
685         ori     r6,r6,MSR_RI
686         sync                            /* disable interrupts so SRR0/1 */
687         mtmsrd  r0                      /* don't get trashed */
688
689         SET_REG_TO_LABEL(r4,rtas)
690         ld      r5,RTASENTRY(r4)        /* get the rtas->entry value */
691         ld      r4,RTASBASE(r4)         /* get the rtas->base value */
692         
693         mtspr   SRR0,r5
694         mtspr   SRR1,r6
695         rfid
696         b       .       /* prevent speculative execution */
697
698 _STATIC(rtas_return_loc)
699         /* relocation is off at this point */
700         mfspr   r4,SPRG3                /* Get PACA */
701         SET_REG_TO_CONST(r5, KERNELBASE)
702         sub     r4,r4,r5                /* RELOC the PACA base pointer */
703
704         mfmsr   r6
705         li      r0,MSR_RI
706         andc    r6,r6,r0
707         sync    
708         mtmsrd  r6
709         
710         ld      r1,PACAR1(r4)           /* Restore our SP */
711         LOADADDR(r3,.rtas_restore_regs)
712         ld      r4,PACASAVEDMSR(r4)     /* Restore our MSR */
713
714         mtspr   SRR0,r3
715         mtspr   SRR1,r4
716         rfid
717         b       .       /* prevent speculative execution */
718
719 _STATIC(rtas_restore_regs)
720         /* relocation is on at this point */
721         REST_GPR(2, r1)                 /* Restore the TOC */
722         REST_GPR(13, r1)                /* Restore paca */
723         REST_8GPRS(14, r1)              /* Restore the non-volatiles */
724         REST_10GPRS(22, r1)             /* ditto */
725
726         mfspr   r13,SPRG3
727
728         ld      r4,_CCR(r1)
729         mtcr    r4
730         ld      r5,_CTR(r1)
731         mtctr   r5
732         ld      r6,_XER(r1)
733         mtspr   XER,r6
734         ld      r7,_DAR(r1)
735         mtdar   r7
736         ld      r8,_DSISR(r1)
737         mtdsisr r8
738         ld      r9,_SRR0(r1)
739         mtsrr0  r9
740         ld      r10,_SRR1(r1)
741         mtsrr1  r10
742
743         addi    r1,r1,RTAS_FRAME_SIZE   /* Unstack our frame */
744         ld      r0,16(r1)               /* get return address */
745
746         mtlr    r0
747         blr                             /* return to caller */
748
749 #endif /* CONFIG_PPC_PSERIES */
750
751 #ifdef CONFIG_PPC_MULTIPLATFORM
752
753 _GLOBAL(enter_prom)
754         mflr    r0
755         std     r0,16(r1)
756         stdu    r1,-PROM_FRAME_SIZE(r1) /* Save SP and create stack space */
757
758         /* Because PROM is running in 32b mode, it clobbers the high order half
759          * of all registers that it saves.  We therefore save those registers
760          * PROM might touch to the stack.  (r0, r3-r13 are caller saved)
761          */
762         SAVE_8GPRS(2, r1)
763         SAVE_GPR(13, r1)
764         SAVE_8GPRS(14, r1)
765         SAVE_10GPRS(22, r1)
766         mfcr    r4
767         std     r4,_CCR(r1)
768         mfctr   r5
769         std     r5,_CTR(r1)
770         mfspr   r6,XER
771         std     r6,_XER(r1)
772         mfdar   r7
773         std     r7,_DAR(r1)
774         mfdsisr r8
775         std     r8,_DSISR(r1)
776         mfsrr0  r9
777         std     r9,_SRR0(r1)
778         mfsrr1  r10
779         std     r10,_SRR1(r1)
780         mfmsr   r11
781         std     r11,_MSR(r1)
782
783         /* Get the PROM entrypoint */
784         ld      r0,GPR4(r1)
785         mtlr    r0
786
787         /* Switch MSR to 32 bits mode
788          */
789         mfmsr   r11
790         li      r12,1
791         rldicr  r12,r12,MSR_SF_LG,(63-MSR_SF_LG)
792         andc    r11,r11,r12
793         li      r12,1
794         rldicr  r12,r12,MSR_ISF_LG,(63-MSR_ISF_LG)
795         andc    r11,r11,r12
796         mtmsrd  r11
797         isync
798
799         /* Restore arguments & enter PROM here... */
800         ld      r3,GPR3(r1)
801         blrl
802
803         /* Just make sure that r1 top 32 bits didn't get
804          * corrupt by OF
805          */
806         rldicl  r1,r1,0,32
807
808         /* Restore the MSR (back to 64 bits) */
809         ld      r0,_MSR(r1)
810         mtmsrd  r0
811         isync
812
813         /* Restore other registers */
814         REST_GPR(2, r1)
815         REST_GPR(13, r1)
816         REST_8GPRS(14, r1)
817         REST_10GPRS(22, r1)
818         ld      r4,_CCR(r1)
819         mtcr    r4
820         ld      r5,_CTR(r1)
821         mtctr   r5
822         ld      r6,_XER(r1)
823         mtspr   XER,r6
824         ld      r7,_DAR(r1)
825         mtdar   r7
826         ld      r8,_DSISR(r1)
827         mtdsisr r8
828         ld      r9,_SRR0(r1)
829         mtsrr0  r9
830         ld      r10,_SRR1(r1)
831         mtsrr1  r10
832         
833         addi    r1,r1,PROM_FRAME_SIZE
834         ld      r0,16(r1)
835         mtlr    r0
836         blr
837         
838 #endif  /* CONFIG_PPC_MULTIPLATFORM */