Merge to Fedora kernel-2.6.7-1.441
[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         cmpli   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         mtlr    r10
147         blrl                    /* 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
198 syscall_enosys:
199         li      r3,-ENOSYS
200         std     r3,RESULT(r1)
201         clrrdi  r12,r1,THREAD_SHIFT
202         ld      r5,_CCR(r1)
203
204 syscall_error:
205         lbz     r11,TI_SC_NOERR(r12)
206         cmpi    0,r11,0
207         bne-    syscall_error_cont
208         neg     r3,r3
209         oris    r5,r5,0x1000    /* Set SO bit in CR */
210         std     r5,_CCR(r1)
211         b       syscall_error_cont
212         
213 /* Traced system call support */
214 syscall_dotrace:
215         bl      .save_nvgprs
216         addi    r3,r1,STACK_FRAME_OVERHEAD
217         bl      .do_syscall_trace_enter
218         ld      r0,GPR0(r1)     /* Restore original registers */
219         ld      r3,GPR3(r1)
220         ld      r4,GPR4(r1)
221         ld      r5,GPR5(r1)
222         ld      r6,GPR6(r1)
223         ld      r7,GPR7(r1)
224         ld      r8,GPR8(r1)
225         addi    r9,r1,STACK_FRAME_OVERHEAD
226         clrrdi  r10,r1,THREAD_SHIFT
227         ld      r10,TI_FLAGS(r10)
228         b       syscall_dotrace_cont
229
230 syscall_exit_trace:
231         std     r3,GPR3(r1)
232         bl      .save_nvgprs
233         bl      .do_syscall_trace_leave
234         REST_NVGPRS(r1)
235         ld      r3,GPR3(r1)
236         ld      r5,_CCR(r1)
237         clrrdi  r12,r1,THREAD_SHIFT
238         b       syscall_exit_trace_cont
239
240 /* Stuff to do on exit from a system call. */
241 syscall_exit_work:
242         std     r3,GPR3(r1)
243         std     r5,_CCR(r1)
244         b       .ret_from_except_lite
245
246 /* Save non-volatile GPRs, if not already saved. */
247 _GLOBAL(save_nvgprs)
248         ld      r11,_TRAP(r1)
249         andi.   r0,r11,1
250         beqlr-
251         SAVE_NVGPRS(r1)
252         clrrdi  r0,r11,1
253         std     r0,_TRAP(r1)
254         blr
255
256 /*
257  * The sigsuspend and rt_sigsuspend system calls can call do_signal
258  * and thus put the process into the stopped state where we might
259  * want to examine its user state with ptrace.  Therefore we need
260  * to save all the nonvolatile registers (r14 - r31) before calling
261  * the C code.  Similarly, fork, vfork and clone need the full
262  * register state on the stack so that it can be copied to the child.
263  */
264 _GLOBAL(ppc32_sigsuspend)
265         bl      .save_nvgprs
266         bl      .sys32_sigsuspend
267         b       syscall_exit
268
269 _GLOBAL(ppc64_rt_sigsuspend)
270         bl      .save_nvgprs
271         bl      .sys_rt_sigsuspend
272         b       syscall_exit
273
274 _GLOBAL(ppc32_rt_sigsuspend)
275         bl      .save_nvgprs
276         bl      .sys32_rt_sigsuspend
277         b       syscall_exit
278
279 _GLOBAL(ppc_fork)
280         bl      .save_nvgprs
281         bl      .sys_fork
282         b       syscall_exit
283
284 _GLOBAL(ppc_vfork)
285         bl      .save_nvgprs
286         bl      .sys_vfork
287         b       syscall_exit
288
289 _GLOBAL(ppc_clone)
290         bl      .save_nvgprs
291         bl      .sys_clone
292         b       syscall_exit
293
294 _GLOBAL(ppc32_swapcontext)
295         bl      .save_nvgprs
296         bl      .sys32_swapcontext
297         b       80f
298         
299 _GLOBAL(ppc64_swapcontext)
300         bl      .save_nvgprs
301         bl      .sys_swapcontext
302         b       80f
303
304 _GLOBAL(ppc32_sigreturn)
305         bl      .sys32_sigreturn
306         b       80f
307
308 _GLOBAL(ppc32_rt_sigreturn)
309         bl      .sys32_rt_sigreturn
310         b       80f
311
312 _GLOBAL(ppc64_rt_sigreturn)
313         bl      .sys_rt_sigreturn
314
315 80:     cmpdi   0,r3,0
316         blt     syscall_exit
317         clrrdi  r4,r1,THREAD_SHIFT
318         ld      r4,TI_FLAGS(r4)
319         andi.   r4,r4,_TIF_SYSCALL_T_OR_A
320         beq+    81f
321         bl      .do_syscall_trace_leave
322 81:     b       .ret_from_except
323
324 _GLOBAL(ret_from_fork)
325         bl      .schedule_tail
326         REST_NVGPRS(r1)
327         li      r3,0
328         b       syscall_exit
329
330 /*
331  * This routine switches between two different tasks.  The process
332  * state of one is saved on its kernel stack.  Then the state
333  * of the other is restored from its kernel stack.  The memory
334  * management hardware is updated to the second process's state.
335  * Finally, we can return to the second process, via ret_from_except.
336  * On entry, r3 points to the THREAD for the current task, r4
337  * points to the THREAD for the new task.
338  *
339  * Note: there are two ways to get to the "going out" portion
340  * of this code; either by coming in via the entry (_switch)
341  * or via "fork" which must set up an environment equivalent
342  * to the "_switch" path.  If you change this you'll have to change
343  * the fork code also.
344  *
345  * The code which creates the new task context is in 'copy_thread'
346  * in arch/ppc64/kernel/process.c
347  */
348         .align  7
349 _GLOBAL(_switch)
350         mflr    r0
351         std     r0,16(r1)
352         stdu    r1,-SWITCH_FRAME_SIZE(r1)
353         /* r3-r13 are caller saved -- Cort */
354         SAVE_8GPRS(14, r1)
355         SAVE_10GPRS(22, r1)
356         mflr    r20             /* Return to switch caller */
357         mfmsr   r22
358         li      r0, MSR_FP
359 #ifdef CONFIG_ALTIVEC
360 BEGIN_FTR_SECTION
361         oris    r0,r0,MSR_VEC@h /* Disable altivec */
362         mfspr   r24,SPRN_VRSAVE /* save vrsave register value */
363         std     r24,THREAD_VRSAVE(r3)
364 END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
365 #endif /* CONFIG_ALTIVEC */
366         and.    r0,r0,r22
367         beq+    1f
368         andc    r22,r22,r0
369         mtmsrd  r22
370         isync
371 1:      std     r20,_NIP(r1)
372         mfcr    r23
373         std     r23,_CCR(r1)
374         std     r1,KSP(r3)      /* Set old stack pointer */
375
376 #ifdef CONFIG_SMP
377         /* We need a sync somewhere here to make sure that if the
378          * previous task gets rescheduled on another CPU, it sees all
379          * stores it has performed on this one.
380          */
381         sync
382 #endif /* CONFIG_SMP */
383
384         addi    r6,r4,-THREAD   /* Convert THREAD to 'current' */
385         std     r6,PACACURRENT(r13)     /* Set new 'current' */
386
387         ld      r8,KSP(r4)      /* new stack pointer */
388 BEGIN_FTR_SECTION
389         clrrdi  r6,r8,28        /* get its ESID */
390         clrrdi  r9,r1,28        /* get current sp ESID */
391         clrldi. r0,r6,2         /* is new ESID c00000000? */
392         cmpd    cr1,r6,r9       /* or is new ESID the same as current ESID? */
393         cror    eq,4*cr1+eq,eq
394         beq     2f              /* if yes, don't slbie it */
395         oris    r6,r6,0x0800    /* set C (class) bit */
396         slbie   r6
397         slbie   r6              /* Workaround POWER5 < DD2.1 issue */
398 2:
399 END_FTR_SECTION_IFSET(CPU_FTR_SLB)
400         clrrdi  r7,r8,THREAD_SHIFT      /* base of new stack */
401         /* Note: this uses SWITCH_FRAME_SIZE rather than INT_FRAME_SIZE
402            because we don't need to leave the 288-byte ABI gap at the
403            top of the kernel stack. */
404         addi    r7,r7,THREAD_SIZE-SWITCH_FRAME_SIZE
405
406         mr      r1,r8           /* start using new stack pointer */
407         std     r7,PACAKSAVE(r13)
408
409         ld      r6,_CCR(r1)
410         mtcrf   0xFF,r6
411
412 #ifdef CONFIG_ALTIVEC
413 BEGIN_FTR_SECTION
414         ld      r0,THREAD_VRSAVE(r4)
415         mtspr   SPRN_VRSAVE,r0          /* if G4, restore VRSAVE reg */
416 END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
417 #endif /* CONFIG_ALTIVEC */
418
419         /* r3-r13 are destroyed -- Cort */
420         REST_8GPRS(14, r1)
421         REST_10GPRS(22, r1)
422
423 #ifdef CONFIG_PPC_ISERIES
424         clrrdi  r7,r1,THREAD_SHIFT      /* get current_thread_info() */
425         ld      r7,TI_FLAGS(r7)         /* Get run light flag */
426         mfspr   r9,CTRLF
427         srdi    r7,r7,TIF_RUN_LIGHT
428         insrdi  r9,r7,1,63              /* Insert run light into CTRL */
429         mtspr   CTRLT,r9
430 #endif
431
432         /* convert old thread to its task_struct for return value */
433         addi    r3,r3,-THREAD
434         ld      r7,_NIP(r1)     /* Return to _switch caller in new task */
435         mtlr    r7
436         addi    r1,r1,SWITCH_FRAME_SIZE
437         blr
438
439         .align  7
440 _GLOBAL(ret_from_except)
441         ld      r11,_TRAP(r1)
442         andi.   r0,r11,1
443         bne     .ret_from_except_lite
444         REST_NVGPRS(r1)
445
446 _GLOBAL(ret_from_except_lite)
447         /*
448          * Disable interrupts so that current_thread_info()->flags
449          * can't change between when we test it and when we return
450          * from the interrupt.
451          */
452         mfmsr   r10             /* Get current interrupt state */
453         rldicl  r9,r10,48,1     /* clear MSR_EE */
454         rotldi  r9,r9,16
455         mtmsrd  r9,1            /* Update machine state */
456
457 #ifdef CONFIG_PREEMPT
458         clrrdi  r9,r1,THREAD_SHIFT      /* current_thread_info() */
459         li      r0,_TIF_NEED_RESCHED    /* bits to check */
460         ld      r3,_MSR(r1)
461         ld      r4,TI_FLAGS(r9)
462         /* Move MSR_PR bit in r3 to _TIF_SIGPENDING position in r0 */
463         rlwimi  r0,r3,32+TIF_SIGPENDING-MSR_PR_LG,_TIF_SIGPENDING
464         and.    r0,r4,r0        /* check NEED_RESCHED and maybe SIGPENDING */
465         bne     do_work
466
467 #else /* !CONFIG_PREEMPT */
468         ld      r3,_MSR(r1)     /* Returning to user mode? */
469         andi.   r3,r3,MSR_PR
470         beq     restore         /* if not, just restore regs and return */
471
472         /* Check current_thread_info()->flags */
473         clrrdi  r9,r1,THREAD_SHIFT
474         ld      r4,TI_FLAGS(r9)
475         andi.   r0,r4,_TIF_USER_WORK_MASK
476         bne     do_work
477 #endif
478
479 restore:
480 #ifdef CONFIG_PPC_ISERIES
481         ld      r5,SOFTE(r1)
482         cmpdi   0,r5,0
483         beq     4f
484         /* Check for pending interrupts (iSeries) */
485         ld      r3,PACALPPACA+LPPACAANYINT(r13)
486         cmpdi   r3,0
487         beq+    4f                      /* skip do_IRQ if no interrupts */
488
489         li      r3,0
490         stb     r3,PACAPROCENABLED(r13) /* ensure we are soft-disabled */
491         mtmsrd  r10                     /* hard-enable again */
492         addi    r3,r1,STACK_FRAME_OVERHEAD
493         bl      .do_IRQ
494         b       .ret_from_except                /* loop back and handle more */
495
496 4:      stb     r5,PACAPROCENABLED(r13)
497 #endif
498
499         ld      r3,_MSR(r1)
500         andi.   r0,r3,MSR_RI
501         beq-    unrecov_restore
502
503         andi.   r0,r3,MSR_PR
504
505         /*
506          * r13 is our per cpu area, only restore it if we are returning to
507          * userspace
508          */
509         beq     1f
510         REST_GPR(13, r1)
511 1:
512         ld      r3,_CTR(r1)
513         ld      r0,_LINK(r1)
514         mtctr   r3
515         mtlr    r0
516         ld      r3,_XER(r1)
517         mtspr   XER,r3
518
519         REST_8GPRS(5, r1)
520
521         stdcx.  r0,0,r1         /* to clear the reservation */
522
523         mfmsr   r0
524         li      r2, MSR_RI
525         andc    r0,r0,r2
526         mtmsrd  r0,1
527
528         ld      r0,_MSR(r1)
529         mtspr   SRR1,r0
530
531         ld      r2,_CCR(r1)
532         mtcrf   0xFF,r2
533         ld      r2,_NIP(r1)
534         mtspr   SRR0,r2
535
536         ld      r0,GPR0(r1)
537         ld      r2,GPR2(r1)
538         ld      r3,GPR3(r1)
539         ld      r4,GPR4(r1)
540         ld      r1,GPR1(r1)
541
542         rfid
543         b       .
544
545 /* Note: this must change if we start using the TIF_NOTIFY_RESUME bit */
546 do_work:
547 #ifdef CONFIG_PREEMPT
548         andi.   r0,r3,MSR_PR    /* Returning to user mode? */
549         bne     user_work
550         /* Check that preempt_count() == 0 and interrupts are enabled */
551         lwz     r8,TI_PREEMPT(r9)
552         cmpwi   cr1,r8,0
553 #ifdef CONFIG_PPC_ISERIES
554         ld      r0,SOFTE(r1)
555         cmpdi   r0,0
556 #else
557         andi.   r0,r3,MSR_EE
558 #endif
559         crandc  eq,cr1*4+eq,eq
560         bne     restore
561         /* here we are preempting the current task */
562 1:      lis     r0,PREEMPT_ACTIVE@h
563         stw     r0,TI_PREEMPT(r9)
564 #ifdef CONFIG_PPC_ISERIES
565         li      r0,1
566         stb     r0,PACAPROCENABLED(r13)
567 #endif
568         mtmsrd  r10,1           /* reenable interrupts */
569         bl      .schedule
570         mfmsr   r10
571         clrrdi  r9,r1,THREAD_SHIFT
572         rldicl  r10,r10,48,1    /* disable interrupts again */
573         li      r0,0
574         rotldi  r10,r10,16
575         mtmsrd  r10,1
576         ld      r4,TI_FLAGS(r9)
577         andi.   r0,r4,_TIF_NEED_RESCHED
578         bne     1b
579         stw     r0,TI_PREEMPT(r9)
580         b       restore
581
582 user_work:
583 #endif
584         /* Enable interrupts */
585         mtmsrd  r10,1
586
587         andi.   r0,r4,_TIF_NEED_RESCHED
588         beq     1f
589         bl      .schedule
590         b       .ret_from_except_lite
591
592 1:      bl      .save_nvgprs
593         li      r3,0
594         addi    r4,r1,STACK_FRAME_OVERHEAD
595         bl      .do_signal
596         b       .ret_from_except
597
598 unrecov_restore:
599         addi    r3,r1,STACK_FRAME_OVERHEAD
600         bl      .unrecoverable_exception
601         b       unrecov_restore
602
603 #ifdef CONFIG_PPC_PSERIES
604 /*
605  * On CHRP, the Run-Time Abstraction Services (RTAS) have to be
606  * called with the MMU off.
607  *
608  * In addition, we need to be in 32b mode, at least for now.
609  * 
610  * Note: r3 is an input parameter to rtas, so don't trash it...
611  */
612 _GLOBAL(enter_rtas)
613         mflr    r0
614         std     r0,16(r1)
615         stdu    r1,-RTAS_FRAME_SIZE(r1) /* Save SP and create stack space. */
616
617         /* Because RTAS is running in 32b mode, it clobbers the high order half
618          * of all registers that it saves.  We therefore save those registers
619          * RTAS might touch to the stack.  (r0, r3-r13 are caller saved)
620          */
621         SAVE_GPR(2, r1)                 /* Save the TOC */
622         SAVE_GPR(13, r1)                /* Save paca */
623         SAVE_8GPRS(14, r1)              /* Save the non-volatiles */
624         SAVE_10GPRS(22, r1)             /* ditto */
625
626         mfcr    r4
627         std     r4,_CCR(r1)
628         mfctr   r5
629         std     r5,_CTR(r1)
630         mfspr   r6,XER
631         std     r6,_XER(r1)
632         mfdar   r7
633         std     r7,_DAR(r1)
634         mfdsisr r8
635         std     r8,_DSISR(r1)
636         mfsrr0  r9
637         std     r9,_SRR0(r1)
638         mfsrr1  r10
639         std     r10,_SRR1(r1)
640
641         /* There is no way it is acceptable to get here with interrupts enabled,
642          * check it with the asm equivalent of WARN_ON
643          */
644         mfmsr   r6
645         andi.   r0,r6,MSR_EE
646 1:      tdnei   r0,0
647 .section __bug_table,"a"
648         .llong  1b,__LINE__ + 0x1000000, 1f, 2f
649 .previous
650 .section .rodata,"a"
651 1:      .asciz  __FILE__
652 2:      .asciz "enter_rtas"
653 .previous
654         
655         /* Unfortunately, the stack pointer and the MSR are also clobbered,
656          * so they are saved in the PACA which allows us to restore
657          * our original state after RTAS returns.
658          */
659         std     r1,PACAR1(r13)
660         std     r6,PACASAVEDMSR(r13)
661
662         /* Setup our real return addr */        
663         SET_REG_TO_LABEL(r4,.rtas_return_loc)
664         SET_REG_TO_CONST(r9,KERNELBASE)
665         sub     r4,r4,r9
666         mtlr    r4
667
668         li      r0,0
669         ori     r0,r0,MSR_EE|MSR_SE|MSR_BE|MSR_RI
670         andc    r0,r6,r0
671         
672         li      r9,1
673         rldicr  r9,r9,MSR_SF_LG,(63-MSR_SF_LG)
674         ori     r9,r9,MSR_IR|MSR_DR|MSR_FE0|MSR_FE1|MSR_FP
675         andc    r6,r0,r9
676         ori     r6,r6,MSR_RI
677         sync                            /* disable interrupts so SRR0/1 */
678         mtmsrd  r0                      /* don't get trashed */
679
680         SET_REG_TO_LABEL(r4,rtas)
681         ld      r5,RTASENTRY(r4)        /* get the rtas->entry value */
682         ld      r4,RTASBASE(r4)         /* get the rtas->base value */
683         
684         mtspr   SRR0,r5
685         mtspr   SRR1,r6
686         rfid
687
688 _STATIC(rtas_return_loc)
689         /* relocation is off at this point */
690         mfspr   r4,SPRG3                /* Get PACA */
691         SET_REG_TO_CONST(r5, KERNELBASE)
692         sub     r4,r4,r5                /* RELOC the PACA base pointer */
693
694         mfmsr   r6
695         li      r0,MSR_RI
696         andc    r6,r6,r0
697         sync    
698         mtmsrd  r6
699         
700         ld      r1,PACAR1(r4)           /* Restore our SP */
701         LOADADDR(r3,.rtas_restore_regs)
702         ld      r4,PACASAVEDMSR(r4)     /* Restore our MSR */
703
704         mtspr   SRR0,r3
705         mtspr   SRR1,r4
706         rfid
707
708 _STATIC(rtas_restore_regs)
709         /* relocation is on at this point */
710         REST_GPR(2, r1)                 /* Restore the TOC */
711         REST_GPR(13, r1)                /* Restore paca */
712         REST_8GPRS(14, r1)              /* Restore the non-volatiles */
713         REST_10GPRS(22, r1)             /* ditto */
714
715         mfspr   r13,SPRG3
716
717         ld      r4,_CCR(r1)
718         mtcr    r4
719         ld      r5,_CTR(r1)
720         mtctr   r5
721         ld      r6,_XER(r1)
722         mtspr   XER,r6
723         ld      r7,_DAR(r1)
724         mtdar   r7
725         ld      r8,_DSISR(r1)
726         mtdsisr r8
727         ld      r9,_SRR0(r1)
728         mtsrr0  r9
729         ld      r10,_SRR1(r1)
730         mtsrr1  r10
731
732         addi    r1,r1,RTAS_FRAME_SIZE   /* Unstack our frame */
733         ld      r0,16(r1)               /* get return address */
734
735         mtlr    r0
736         blr                             /* return to caller */
737
738 _GLOBAL(enter_prom)
739         mflr    r0
740         std     r0,16(r1)
741         stdu    r1,-PROM_FRAME_SIZE(r1) /* Save SP and create stack space */
742
743         /* Because PROM is running in 32b mode, it clobbers the high order half
744          * of all registers that it saves.  We therefore save those registers
745          * PROM might touch to the stack.  (r0, r3-r13 are caller saved)
746          */
747         SAVE_8GPRS(2, r1)
748         SAVE_GPR(13, r1)
749         SAVE_8GPRS(14, r1)
750         SAVE_10GPRS(22, r1)
751         mfcr    r4
752         std     r4,_CCR(r1)
753         mfctr   r5
754         std     r5,_CTR(r1)
755         mfspr   r6,XER
756         std     r6,_XER(r1)
757         mfdar   r7
758         std     r7,_DAR(r1)
759         mfdsisr r8
760         std     r8,_DSISR(r1)
761         mfsrr0  r9
762         std     r9,_SRR0(r1)
763         mfsrr1  r10
764         std     r10,_SRR1(r1)
765         mfmsr   r11
766         std     r11,_MSR(r1)
767
768         /* Get the PROM entrypoint */
769         bl      .reloc_offset
770         LOADADDR(r12,prom)
771         sub     r12,r12,r3
772         ld      r12,PROMENTRY(r12)
773         mtlr    r12
774
775         /* Switch MSR to 32 bits mode
776          */
777         mfmsr   r11
778         li      r12,1
779         rldicr  r12,r12,MSR_SF_LG,(63-MSR_SF_LG)
780         andc    r11,r11,r12
781         li      r12,1
782         rldicr  r12,r12,MSR_ISF_LG,(63-MSR_ISF_LG)
783         andc    r11,r11,r12
784         mtmsrd  r11
785         isync
786
787         /* Restore arguments & enter PROM here... */
788         ld      r3,GPR3(r1)
789         blrl
790
791         /* Just make sure that r1 top 32 bits didn't get
792          * corrupt by OF
793          */
794         rldicl  r1,r1,0,32
795
796         /* Restore the MSR (back to 64 bits) */
797         ld      r0,_MSR(r1)
798         mtmsrd  r0
799         isync
800
801         /* Restore other registers */
802         REST_GPR(2, r1)
803         REST_GPR(13, r1)
804         REST_8GPRS(14, r1)
805         REST_10GPRS(22, r1)
806         ld      r4,_CCR(r1)
807         mtcr    r4
808         ld      r5,_CTR(r1)
809         mtctr   r5
810         ld      r6,_XER(r1)
811         mtspr   XER,r6
812         ld      r7,_DAR(r1)
813         mtdar   r7
814         ld      r8,_DSISR(r1)
815         mtdsisr r8
816         ld      r9,_SRR0(r1)
817         mtsrr0  r9
818         ld      r10,_SRR1(r1)
819         mtsrr1  r10
820         
821         addi    r1,r1,PROM_FRAME_SIZE
822         ld      r0,16(r1)
823         mtlr    r0
824         blr
825         
826 #endif  /* defined(CONFIG_PPC_PSERIES) */