]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/sparc64/sparc64/mp_locore.S
This commit was generated by cvs2svn to compensate for changes in r155364,
[FreeBSD/FreeBSD.git] / sys / sparc64 / sparc64 / mp_locore.S
1 /*-
2  * Copyright (c) 2002 Jake Burkholder.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26
27 #include <machine/asm.h>
28 __FBSDID("$FreeBSD$");
29
30 #include <machine/asi.h>
31 #include <machine/asmacros.h>
32 #include <machine/ktr.h>
33 #include <machine/pstate.h>
34 #include <machine/upa.h>
35
36 #include "assym.s"
37
38         .register       %g2, #ignore
39         .register       %g3, #ignore
40
41         .text
42         _ALIGN_TEXT
43 1:      rd      %pc, %l0
44         ldx     [%l0 + (4f-1b)], %l1
45         add     %l0, (6f-1b), %l2
46         clr     %l3
47 2:      cmp     %l3, %l1
48         be      %xcc, 3f
49          nop
50         ldx     [%l2 + TTE_VPN], %l4
51         ldx     [%l2 + TTE_DATA], %l5
52         srlx    %l4, TV_SIZE_BITS, %l4
53         sllx    %l4, PAGE_SHIFT_4M, %l4
54         wr      %g0, ASI_DMMU, %asi
55         stxa    %l4, [%g0 + AA_DMMU_TAR] %asi
56         stxa    %l5, [%g0] ASI_DTLB_DATA_IN_REG
57         wr      %g0, ASI_IMMU, %asi
58         stxa    %l4, [%g0 + AA_IMMU_TAR] %asi
59         stxa    %l5, [%g0] ASI_ITLB_DATA_IN_REG
60         membar  #Sync
61         flush   %l4
62         add     %l2, 1 << TTE_SHIFT, %l2
63         add     %l3, 1, %l3
64         ba      %xcc, 2b
65          nop
66 3:      ldx     [%l0 + (5f-1b)], %l1
67         jmpl    %l1, %g0
68          nop
69         _ALIGN_DATA
70 4:      .xword  0x0
71 5:      .xword  0x0
72 6:
73
74 DATA(mp_tramp_code)
75         .xword  1b
76 DATA(mp_tramp_code_len)
77         .xword  6b-1b
78 DATA(mp_tramp_tlb_slots)
79         .xword  4b-1b
80 DATA(mp_tramp_func)
81         .xword  5b-1b
82
83 /*
84  * void mp_startup(void)
85  */
86 ENTRY(mp_startup)
87         wrpr    %g0, PSTATE_NORMAL, %pstate
88         wrpr    %g0, 0, %cleanwin
89         wrpr    %g0, 0, %pil
90         wr      %g0, 0, %fprs
91
92         SET(cpu_start_args, %l1, %l0)
93
94         mov     CPU_CLKSYNC, %l1
95         membar  #StoreLoad
96         stw     %l1, [%l0 + CSA_STATE]
97
98 1:      ldx     [%l0 + CSA_TICK], %l1
99         brz     %l1, 1b
100          nop
101         wrpr    %l1, 0, %tick
102
103         UPA_GET_MID(%o0)
104
105 #if KTR_COMPILE & KTR_SMP
106         CATR(KTR_SMP, "mp_start: cpu %d entered kernel"
107             , %g1, %g2, %g3, 7, 8, 9)
108         stx     %o0, [%g1 + KTR_PARM1]
109 9:
110 #endif
111
112         rdpr    %ver, %l1
113         stx     %l1, [%l0 + CSA_VER]
114
115         /*
116          * Inform the boot processor we have inited.
117          */
118         mov     CPU_INIT, %l1
119         membar  #LoadStore
120         stw     %l1, [%l0 + CSA_STATE]
121
122         /*
123          * Wait till its our turn to bootstrap.
124          */
125 2:      lduw    [%l0 + CSA_MID], %l1
126         cmp     %l1, %o0
127         bne     %xcc, 2b
128          nop
129
130 #if KTR_COMPILE & KTR_SMP
131         CATR(KTR_SMP, "_mp_start: cpu %d got start signal"
132             , %g1, %g2, %g3, 7, 8, 9)
133         stx     %o0, [%g1 + KTR_PARM1]
134 9:
135 #endif
136
137         add     %l0, CSA_TTES, %l1
138         clr     %l2
139
140         /*
141          * Map the per-cpu pages.
142          */
143 3:      sllx    %l2, TTE_SHIFT, %l3
144         add     %l1, %l3, %l3
145
146         ldx     [%l3 + TTE_VPN], %l4
147         ldx     [%l3 + TTE_DATA], %l5
148
149         wr      %g0, ASI_DMMU, %asi
150         srlx    %l4, TV_SIZE_BITS, %l4
151         sllx    %l4, PAGE_SHIFT_8K, %l4
152         stxa    %l4, [%g0 + AA_DMMU_TAR] %asi
153         stxa    %l5, [%g0] ASI_DTLB_DATA_IN_REG
154         membar  #Sync
155
156         add     %l2, 1, %l2
157         cmp     %l2, PCPU_PAGES
158         bne     %xcc, 3b
159          nop
160
161         /*
162          * Get onto our per-cpu panic stack, which precedes the struct pcpu
163          * in the per-cpu page.
164          */
165         ldx     [%l0 + CSA_PCPU], %l1
166         set     PCPU_PAGES * PAGE_SIZE - PC_SIZEOF, %l2
167         add     %l1, %l2, %l1
168         sub     %l1, SPOFF + CCFSZ, %sp
169
170         /*
171          * Enable interrupts.
172          */
173         wrpr    %g0, PSTATE_KERNEL, %pstate
174
175 #if KTR_COMPILE & KTR_SMP
176         CATR(KTR_SMP,
177             "_mp_start: bootstrap cpuid=%d mid=%d pcpu=%#lx data=%#lx sp=%#lx"
178             , %g1, %g2, %g3, 7, 8, 9)
179         lduw    [%l1 + PC_CPUID], %g2
180         stx     %g2, [%g1 + KTR_PARM1]
181         lduw    [%l1 + PC_MID], %g2
182         stx     %g2, [%g1 + KTR_PARM2]
183         stx     %l1, [%g1 + KTR_PARM3]
184         stx     %sp, [%g1 + KTR_PARM5]
185 9:
186 #endif
187
188         /*
189          * And away we go.  This doesn't return.
190          */
191         call    cpu_mp_bootstrap
192          mov    %l1, %o0
193         sir
194         ! NOTREACHED
195 END(mp_startup)