Linux 2.6.13-rc4
[linux-2.6/next.git] / arch / sparc / kernel / trampoline.S
blob2dcdaa1fd8cd9e5225708d2d5db99aa2a39123b7
1 /* $Id: trampoline.S,v 1.14 2002/01/11 08:45:38 davem Exp $
2  * trampoline.S: SMP cpu boot-up trampoline code.
3  *
4  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
5  * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
6  */
8 #include <linux/init.h>
9 #include <asm/head.h>
10 #include <asm/psr.h>
11 #include <asm/page.h>
12 #include <asm/asi.h>
13 #include <asm/ptrace.h>
14 #include <asm/vaddrs.h>
15 #include <asm/contregs.h>
16 #include <asm/thread_info.h>
18         .globl sun4m_cpu_startup, __smp4m_processor_id
19         .globl sun4d_cpu_startup, __smp4d_processor_id
21         __INIT
22         .align 4
24 /* When we start up a cpu for the first time it enters this routine.
25  * This initializes the chip from whatever state the prom left it
26  * in and sets PIL in %psr to 15, no irqs.
27  */
29 sun4m_cpu_startup:
30 cpu1_startup:
31         sethi   %hi(trapbase_cpu1), %g3
32         b       1f
33          or     %g3, %lo(trapbase_cpu1), %g3
35 cpu2_startup:
36         sethi   %hi(trapbase_cpu2), %g3
37         b       1f
38          or     %g3, %lo(trapbase_cpu2), %g3
40 cpu3_startup:
41         sethi   %hi(trapbase_cpu3), %g3
42         b       1f
43          or     %g3, %lo(trapbase_cpu3), %g3
46         /* Set up a sane %psr -- PIL<0xf> S<0x1> PS<0x1> CWP<0x0> */
47         set     (PSR_PIL | PSR_S | PSR_PS), %g1
48         wr      %g1, 0x0, %psr          ! traps off though
49         WRITE_PAUSE
51         /* Our %wim is one behind CWP */
52         mov     2, %g1
53         wr      %g1, 0x0, %wim
54         WRITE_PAUSE
56         /* This identifies "this cpu". */
57         wr      %g3, 0x0, %tbr
58         WRITE_PAUSE
60         /* Give ourselves a stack and curptr. */
61         set     current_set, %g5
62         srl     %g3, 10, %g4
63         and     %g4, 0xc, %g4
64         ld      [%g5 + %g4], %g6
66         sethi   %hi(THREAD_SIZE - STACKFRAME_SZ), %sp
67         or      %sp, %lo(THREAD_SIZE - STACKFRAME_SZ), %sp
68         add     %g6, %sp, %sp
70         /* Turn on traps (PSR_ET). */
71         rd      %psr, %g1
72         wr      %g1, PSR_ET, %psr       ! traps on
73         WRITE_PAUSE
75         /* Init our caches, etc. */
76         set     poke_srmmu, %g5
77         ld      [%g5], %g5
78         call    %g5
79          nop
81         /* Start this processor. */
82         call    smp4m_callin
83          nop
85         b,a     smp_do_cpu_idle
87         .text
88         .align  4
90 smp_do_cpu_idle:
91         call    cpu_idle
92          mov    0, %o0
94         call    cpu_panic
95          nop
97 __smp4m_processor_id:
98         rd      %tbr, %g2
99         srl     %g2, 12, %g2
100         and     %g2, 3, %g2
101         retl
102          mov    %g1, %o7
104 __smp4d_processor_id:
105         lda     [%g0] ASI_M_VIKING_TMP1, %g2
106         retl
107          mov    %g1, %o7
109 /* CPUID in bootbus can be found at PA 0xff0140000 */
110 #define SUN4D_BOOTBUS_CPUID     0xf0140000
112         __INIT
113         .align  4
115 sun4d_cpu_startup:
116         /* Set up a sane %psr -- PIL<0xf> S<0x1> PS<0x1> CWP<0x0> */
117         set     (PSR_PIL | PSR_S | PSR_PS), %g1
118         wr      %g1, 0x0, %psr          ! traps off though
119         WRITE_PAUSE
121         /* Our %wim is one behind CWP */
122         mov     2, %g1
123         wr      %g1, 0x0, %wim
124         WRITE_PAUSE
126         /* Set tbr - we use just one trap table. */
127         set     trapbase, %g1
128         wr      %g1, 0x0, %tbr
129         WRITE_PAUSE
131         /* Get our CPU id out of bootbus */
132         set     SUN4D_BOOTBUS_CPUID, %g3
133         lduba   [%g3] ASI_M_CTL, %g3
134         and     %g3, 0xf8, %g3
135         srl     %g3, 3, %g1
136         sta     %g1, [%g0] ASI_M_VIKING_TMP1
138         /* Give ourselves a stack and curptr. */
139         set     current_set, %g5
140         srl     %g3, 1, %g4
141         ld      [%g5 + %g4], %g6
143         sethi   %hi(THREAD_SIZE - STACKFRAME_SZ), %sp
144         or      %sp, %lo(THREAD_SIZE - STACKFRAME_SZ), %sp
145         add     %g6, %sp, %sp
147         /* Turn on traps (PSR_ET). */
148         rd      %psr, %g1
149         wr      %g1, PSR_ET, %psr       ! traps on
150         WRITE_PAUSE
152         /* Init our caches, etc. */
153         set     poke_srmmu, %g5
154         ld      [%g5], %g5
155         call    %g5
156          nop
158         /* Start this processor. */
159         call    smp4d_callin
160          nop
162         b,a     smp_do_cpu_idle