]> CyberLeo.Net >> Repos - FreeBSD/releng/8.1.git/blob - sys/sun4v/sun4v/mp_exception.S
Copy stable/8 to releng/8.1 in preparation for 8.1-RC1.
[FreeBSD/releng/8.1.git] / sys / sun4v / sun4v / mp_exception.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/ktr.h>
32 #include <machine/asmacros.h>
33 #include <machine/pstate.h>
34
35 #include "assym.s"
36
37         .register       %g2, #ignore
38         .register       %g3, #ignore
39
40 #define IPI_DONE(r1, r2, r3, r4) \
41         lduw    [PCPU(CPUMASK)], r4 ;  \
42         ATOMIC_CLEAR_INT(r1, r2, r3, r4)
43
44 /*
45  * Invalidate a physical page in the data cache.  For UltraSPARC I and II.
46  */
47 #if 0
48 ENTRY(tl_ipi_spitfire_dcache_page_inval)
49 #if KTR_COMPILE & KTR_SMP
50         CATR(KTR_SMP, "ipi_dcache_page_inval: pa=%#lx"
51             , %g1, %g2, %g3, 7, 8, 9)
52         ldx     [%g5 + ICA_PA], %g2
53         stx     %g2, [%g1 + KTR_PARM1]
54 9:
55 #endif
56
57         ldx     [%g5 + ICA_PA], %g6
58         srlx    %g6, PAGE_SHIFT - DC_TAG_SHIFT, %g6
59
60         SET(cache, %g3, %g2)
61         lduw    [%g2 + DC_SIZE], %g3
62         lduw    [%g2 + DC_LINESIZE], %g4
63         sub     %g3, %g4, %g2
64
65 1:      ldxa    [%g2] ASI_DCACHE_TAG, %g1
66         srlx    %g1, DC_VALID_SHIFT, %g3
67         andcc   %g3, DC_VALID_MASK, %g0
68         bz,pt   %xcc, 2f
69          set    DC_TAG_MASK, %g3
70         sllx    %g3, DC_TAG_SHIFT, %g3
71         and     %g1, %g3, %g1
72         cmp     %g1, %g6
73         bne,a,pt %xcc, 2f
74          nop
75         stxa    %g1, [%g2] ASI_DCACHE_TAG
76         membar  #Sync
77
78 2:      brgz,pt %g2, 1b
79          sub    %g2, %g4, %g2
80
81         IPI_DONE(%g5, %g1, %g2, %g3)
82         retry
83 END(tl_ipi_spitfire_dcache_page_inval)
84
85 /*
86  * Invalidate a physical page in the instruction cache.  For UltraSPARC I and
87  * II.
88  */
89 ENTRY(tl_ipi_spitfire_icache_page_inval)
90 #if KTR_COMPILE & KTR_SMP
91         CATR(KTR_SMP, "ipi_icache_page_inval: pa=%#lx"
92             , %g1, %g2, %g3, 7, 8, 9)
93         ldx     [%g5 + ICA_PA], %g2
94         stx     %g2, [%g1 + KTR_PARM1]
95 9:
96 #endif
97
98         ldx     [%g5 + ICA_PA], %g6
99         srlx    %g6, PAGE_SHIFT - IC_TAG_SHIFT, %g6
100
101         SET(cache, %g3, %g2)
102         lduw    [%g2 + IC_SIZE], %g3
103         lduw    [%g2 + IC_LINESIZE], %g4
104         sub     %g3, %g4, %g2
105
106 1:      ldda    [%g2] ASI_ICACHE_TAG, %g0 /*, %g1 */
107         srlx    %g1, IC_VALID_SHIFT, %g3
108         andcc   %g3, IC_VALID_MASK, %g0
109         bz,pt   %xcc, 2f
110          set    IC_TAG_MASK, %g3
111         sllx    %g3, IC_TAG_SHIFT, %g3
112         and     %g1, %g3, %g1
113         cmp     %g1, %g6
114         bne,a,pt %xcc, 2f
115          nop
116         stxa    %g1, [%g2] ASI_ICACHE_TAG
117         membar  #Sync
118
119 2:      brgz,pt %g2, 1b
120          sub    %g2, %g4, %g2
121
122         IPI_DONE(%g5, %g1, %g2, %g3)
123         retry
124 END(tl_ipi_spitfire_icache_page_inval)
125
126 /*
127  * Invalidate a physical page in the data cache.  For UltraSPARC III.
128  */
129 ENTRY(tl_ipi_cheetah_dcache_page_inval)
130 #if KTR_COMPILE & KTR_SMP
131         CATR(KTR_SMP, "ipi_dcache_page_inval: pa=%#lx"
132             , %g1, %g2, %g3, 7, 8, 9)
133         ldx     [%g5 + ICA_PA], %g2
134         stx     %g2, [%g1 + KTR_PARM1]
135 9:
136 #endif
137
138         ldx     [%g5 + ICA_PA], %g1
139
140         set     PAGE_SIZE, %g2
141         add     %g1, %g2, %g3
142
143         SET(cache, %g4, %g2)
144         lduw    [%g2 + DC_LINESIZE], %g2
145
146 1:      stxa    %g0, [%g1] ASI_DCACHE_INVALIDATE
147         membar  #Sync
148
149         add     %g1, %g2, %g1
150         cmp     %g1, %g3
151         blt,a,pt %xcc, 1b
152          nop
153
154         IPI_DONE(%g5, %g1, %g2, %g3)
155         retry
156 END(tl_ipi_cheetah_dcache_page_inval)
157 #endif
158         
159 /*
160  * Trigger a softint at the desired level.
161  */
162 ENTRY(tl_ipi_level)
163 #if KTR_COMPILE & KTR_SMP
164         CATR(KTR_SMP, "tl_ipi_level: cpuid=%d mid=%d d1=%#lx d2=%#lx"
165             , %g1, %g2, %g3, 7, 8, 9)
166         lduw    [PCPU(CPUID)], %g2
167         stx     %g2, [%g1 + KTR_PARM1]
168         lduw    [PCPU(MID)], %g2
169         stx     %g2, [%g1 + KTR_PARM2]
170         stx     %g4, [%g1 + KTR_PARM3]
171         stx     %g5, [%g1 + KTR_PARM4]
172 9:
173 #endif
174
175         mov     1, %g2
176         sllx    %g2, %g1, %g2
177         wr      %g2, 0, %set_softint
178         retry
179 END(tl_ipi_level)
180
181 /*
182  * Demap a page from the dtlb and/or itlb.
183  */
184 #if 0
185 ENTRY(tl_ipi_tlb_page_demap)
186 #if KTR_COMPILE & KTR_SMP
187         CATR(KTR_SMP, "ipi_tlb_page_demap: pm=%p va=%#lx"
188             , %g1, %g2, %g3, 7, 8, 9)
189         ldx     [%g5 + ITA_PMAP], %g2
190         stx     %g2, [%g1 + KTR_PARM1]
191         ldx     [%g5 + ITA_VA], %g2
192         stx     %g2, [%g1 + KTR_PARM2]
193 9:
194 #endif
195
196         ldx     [%g5 + ITA_PMAP], %g1
197
198         SET(kernel_pmap_store, %g3, %g2)
199         mov     TLB_DEMAP_NUCLEUS | TLB_DEMAP_PAGE, %g3
200
201         cmp     %g1, %g2
202         movne   %xcc, TLB_DEMAP_PRIMARY | TLB_DEMAP_PAGE, %g3
203
204         ldx     [%g5 + ITA_VA], %g2
205         or      %g2, %g3, %g2
206
207         stxa    %g0, [%g2] ASI_DMMU_DEMAP
208         stxa    %g0, [%g2] ASI_IMMU_DEMAP
209         membar  #Sync
210
211         IPI_DONE(%g5, %g1, %g2, %g3)
212         retry
213 END(tl_ipi_tlb_page_demap)
214
215 /*
216  * Demap a range of pages from the dtlb and itlb.
217  */
218 ENTRY(tl_ipi_tlb_range_demap)
219 #if KTR_COMPILE & KTR_SMP
220         CATR(KTR_SMP, "ipi_tlb_range_demap: pm=%p start=%#lx end=%#lx"
221             , %g1, %g2, %g3, 7, 8, 9)
222         ldx     [%g5 + ITA_PMAP], %g2
223         stx     %g2, [%g1 + KTR_PARM1]
224         ldx     [%g5 + ITA_START], %g2
225         stx     %g2, [%g1 + KTR_PARM2]
226         ldx     [%g5 + ITA_END], %g2
227         stx     %g2, [%g1 + KTR_PARM3]
228 9:
229 #endif
230
231         ldx     [%g5 + ITA_PMAP], %g1
232
233         SET(kernel_pmap_store, %g3, %g2)
234         mov     TLB_DEMAP_NUCLEUS | TLB_DEMAP_PAGE, %g3
235
236         cmp     %g1, %g2
237         movne   %xcc, TLB_DEMAP_PRIMARY | TLB_DEMAP_PAGE, %g3
238
239         ldx     [%g5 + ITA_START], %g1
240         ldx     [%g5 + ITA_END], %g2
241
242         set     PAGE_SIZE, %g6
243
244 1:      or      %g1, %g3, %g4
245         stxa    %g0, [%g4] ASI_DMMU_DEMAP
246         stxa    %g0, [%g4] ASI_IMMU_DEMAP
247         membar  #Sync
248
249         add     %g1, %g6, %g1
250         cmp     %g1, %g2
251         blt,a,pt %xcc, 1b
252          nop
253
254         IPI_DONE(%g5, %g1, %g2, %g3)
255         retry
256 END(tl_ipi_tlb_range_demap)
257
258 /*
259  * Demap the primary context from the dtlb and itlb.
260  */
261 ENTRY(tl_ipi_tlb_context_demap)
262 #if KTR_COMPILE & KTR_SMP
263         CATR(KTR_SMP, "ipi_tlb_page_demap: pm=%p va=%#lx"
264             , %g1, %g2, %g3, 7, 8, 9)
265         ldx     [%g5 + ITA_PMAP], %g2
266         stx     %g2, [%g1 + KTR_PARM1]
267         ldx     [%g5 + ITA_VA], %g2
268         stx     %g2, [%g1 + KTR_PARM2]
269 9:
270 #endif
271
272         mov     TLB_DEMAP_PRIMARY | TLB_DEMAP_CONTEXT, %g1
273         stxa    %g0, [%g1] ASI_DMMU_DEMAP
274         stxa    %g0, [%g1] ASI_IMMU_DEMAP
275         membar  #Sync
276
277         IPI_DONE(%g5, %g1, %g2, %g3)
278         retry
279 END(tl_ipi_tlb_context_demap)
280 #endif