1/* SPDX-License-Identifier: GPL-2.0 */
2 /* This is trivial with the new code... */
3 .globl do_fpdis
4 .type do_fpdis,#function
5do_fpdis:
6 sethi %hi(TSTATE_PEF), %g4
7 rdpr %tstate, %g5
8 andcc %g5, %g4, %g0
9 be,pt %xcc, 1f
10 nop
11 rd %fprs, %g5
12 andcc %g5, FPRS_FEF, %g0
13 be,pt %xcc, 1f
14 nop
15
16 /* Legal state when DCR_IFPOE is set in Cheetah %dcr. */
17 sethi %hi(109f), %g7
18 ba,pt %xcc, etrap
19109: or %g7, %lo(109b), %g7
20 add %g0, %g0, %g0
21 ba,a,pt %xcc, rtrap
22
231: TRAP_LOAD_THREAD_REG(%g6, %g1)
24 ldub [%g6 + TI_FPSAVED], %g5
25 wr %g0, FPRS_FEF, %fprs
26 andcc %g5, FPRS_FEF, %g0
27 be,a,pt %icc, 1f
28 clr %g7
29 ldx [%g6 + TI_GSR], %g7
301: andcc %g5, FPRS_DL, %g0
31 bne,pn %icc, 2f
32 fzero %f0
33 andcc %g5, FPRS_DU, %g0
34 bne,pn %icc, 1f
35 fzero %f2
36 faddd %f0, %f2, %f4
37 fmuld %f0, %f2, %f6
38 faddd %f0, %f2, %f8
39 fmuld %f0, %f2, %f10
40 faddd %f0, %f2, %f12
41 fmuld %f0, %f2, %f14
42 faddd %f0, %f2, %f16
43 fmuld %f0, %f2, %f18
44 faddd %f0, %f2, %f20
45 fmuld %f0, %f2, %f22
46 faddd %f0, %f2, %f24
47 fmuld %f0, %f2, %f26
48 faddd %f0, %f2, %f28
49 fmuld %f0, %f2, %f30
50 faddd %f0, %f2, %f32
51 fmuld %f0, %f2, %f34
52 faddd %f0, %f2, %f36
53 fmuld %f0, %f2, %f38
54 faddd %f0, %f2, %f40
55 fmuld %f0, %f2, %f42
56 faddd %f0, %f2, %f44
57 fmuld %f0, %f2, %f46
58 faddd %f0, %f2, %f48
59 fmuld %f0, %f2, %f50
60 faddd %f0, %f2, %f52
61 fmuld %f0, %f2, %f54
62 faddd %f0, %f2, %f56
63 fmuld %f0, %f2, %f58
64 b,pt %xcc, fpdis_exit2
65 faddd %f0, %f2, %f60
661: mov SECONDARY_CONTEXT, %g3
67 add %g6, TI_FPREGS + 0x80, %g1
68 faddd %f0, %f2, %f4
69 fmuld %f0, %f2, %f6
70
71661: ldxa [%g3] ASI_DMMU, %g5
72 .section .sun4v_1insn_patch, "ax"
73 .word 661b
74 ldxa [%g3] ASI_MMU, %g5
75 .previous
76
77 sethi %hi(sparc64_kern_sec_context), %g2
78 ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2
79
80661: stxa %g2, [%g3] ASI_DMMU
81 .section .sun4v_1insn_patch, "ax"
82 .word 661b
83 stxa %g2, [%g3] ASI_MMU
84 .previous
85
86 membar #Sync
87 add %g6, TI_FPREGS + 0xc0, %g2
88 faddd %f0, %f2, %f8
89 fmuld %f0, %f2, %f10
90 membar #Sync
91 ldda [%g1] ASI_BLK_S, %f32
92 ldda [%g2] ASI_BLK_S, %f48
93 membar #Sync
94 faddd %f0, %f2, %f12
95 fmuld %f0, %f2, %f14
96 faddd %f0, %f2, %f16
97 fmuld %f0, %f2, %f18
98 faddd %f0, %f2, %f20
99 fmuld %f0, %f2, %f22
100 faddd %f0, %f2, %f24
101 fmuld %f0, %f2, %f26
102 faddd %f0, %f2, %f28
103 fmuld %f0, %f2, %f30
104 ba,a,pt %xcc, fpdis_exit
105
1062: andcc %g5, FPRS_DU, %g0
107 bne,pt %icc, 3f
108 fzero %f32
109 mov SECONDARY_CONTEXT, %g3
110 fzero %f34
111
112661: ldxa [%g3] ASI_DMMU, %g5
113 .section .sun4v_1insn_patch, "ax"
114 .word 661b
115 ldxa [%g3] ASI_MMU, %g5
116 .previous
117
118 add %g6, TI_FPREGS, %g1
119 sethi %hi(sparc64_kern_sec_context), %g2
120 ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2
121
122661: stxa %g2, [%g3] ASI_DMMU
123 .section .sun4v_1insn_patch, "ax"
124 .word 661b
125 stxa %g2, [%g3] ASI_MMU
126 .previous
127
128 membar #Sync
129 add %g6, TI_FPREGS + 0x40, %g2
130 faddd %f32, %f34, %f36
131 fmuld %f32, %f34, %f38
132 membar #Sync
133 ldda [%g1] ASI_BLK_S, %f0
134 ldda [%g2] ASI_BLK_S, %f16
135 membar #Sync
136 faddd %f32, %f34, %f40
137 fmuld %f32, %f34, %f42
138 faddd %f32, %f34, %f44
139 fmuld %f32, %f34, %f46
140 faddd %f32, %f34, %f48
141 fmuld %f32, %f34, %f50
142 faddd %f32, %f34, %f52
143 fmuld %f32, %f34, %f54
144 faddd %f32, %f34, %f56
145 fmuld %f32, %f34, %f58
146 faddd %f32, %f34, %f60
147 fmuld %f32, %f34, %f62
148 ba,a,pt %xcc, fpdis_exit
149
1503: mov SECONDARY_CONTEXT, %g3
151 add %g6, TI_FPREGS, %g1
152
153661: ldxa [%g3] ASI_DMMU, %g5
154 .section .sun4v_1insn_patch, "ax"
155 .word 661b
156 ldxa [%g3] ASI_MMU, %g5
157 .previous
158
159 sethi %hi(sparc64_kern_sec_context), %g2
160 ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2
161
162661: stxa %g2, [%g3] ASI_DMMU
163 .section .sun4v_1insn_patch, "ax"
164 .word 661b
165 stxa %g2, [%g3] ASI_MMU
166 .previous
167
168 membar #Sync
169 mov 0x40, %g2
170 membar #Sync
171 ldda [%g1] ASI_BLK_S, %f0
172 ldda [%g1 + %g2] ASI_BLK_S, %f16
173 add %g1, 0x80, %g1
174 ldda [%g1] ASI_BLK_S, %f32
175 ldda [%g1 + %g2] ASI_BLK_S, %f48
176 membar #Sync
177fpdis_exit:
178
179661: stxa %g5, [%g3] ASI_DMMU
180 .section .sun4v_1insn_patch, "ax"
181 .word 661b
182 stxa %g5, [%g3] ASI_MMU
183 .previous
184
185 membar #Sync
186fpdis_exit2:
187 wr %g7, 0, %gsr
188 ldx [%g6 + TI_XFSR], %fsr
189 rdpr %tstate, %g3
190 or %g3, %g4, %g3 ! anal...
191 wrpr %g3, %tstate
192 wr %g0, FPRS_FEF, %fprs ! clean DU/DL bits
193 retry
194 .size do_fpdis,.-do_fpdis
195
196 .align 32
197 .type fp_other_bounce,#function
198fp_other_bounce:
199 call do_fpother
200 add %sp, PTREGS_OFF, %o0
201 ba,a,pt %xcc, rtrap
202 .size fp_other_bounce,.-fp_other_bounce
203
204 .align 32
205 .globl do_fpother_check_fitos
206 .type do_fpother_check_fitos,#function
207do_fpother_check_fitos:
208 TRAP_LOAD_THREAD_REG(%g6, %g1)
209 sethi %hi(fp_other_bounce - 4), %g7
210 or %g7, %lo(fp_other_bounce - 4), %g7
211
212 /* NOTE: Need to preserve %g7 until we fully commit
213 * to the fitos fixup.
214 */
215 stx %fsr, [%g6 + TI_XFSR]
216 rdpr %tstate, %g3
217 andcc %g3, TSTATE_PRIV, %g0
218 bne,pn %xcc, do_fptrap_after_fsr
219 nop
220 ldx [%g6 + TI_XFSR], %g3
221 srlx %g3, 14, %g1
222 and %g1, 7, %g1
223 cmp %g1, 2 ! Unfinished FP-OP
224 bne,pn %xcc, do_fptrap_after_fsr
225 sethi %hi(1 << 23), %g1 ! Inexact
226 andcc %g3, %g1, %g0
227 bne,pn %xcc, do_fptrap_after_fsr
228 rdpr %tpc, %g1
229 lduwa [%g1] ASI_AIUP, %g3 ! This cannot ever fail
230#define FITOS_MASK 0xc1f83fe0
231#define FITOS_COMPARE 0x81a01880
232 sethi %hi(FITOS_MASK), %g1
233 or %g1, %lo(FITOS_MASK), %g1
234 and %g3, %g1, %g1
235 sethi %hi(FITOS_COMPARE), %g2
236 or %g2, %lo(FITOS_COMPARE), %g2
237 cmp %g1, %g2
238 bne,pn %xcc, do_fptrap_after_fsr
239 nop
240 std %f62, [%g6 + TI_FPREGS + (62 * 4)]
241 sethi %hi(fitos_table_1), %g1
242 and %g3, 0x1f, %g2
243 or %g1, %lo(fitos_table_1), %g1
244 sllx %g2, 2, %g2
245 jmpl %g1 + %g2, %g0
246 ba,pt %xcc, fitos_emul_continue
247
248fitos_table_1:
249 fitod %f0, %f62
250 fitod %f1, %f62
251 fitod %f2, %f62
252 fitod %f3, %f62
253 fitod %f4, %f62
254 fitod %f5, %f62
255 fitod %f6, %f62
256 fitod %f7, %f62
257 fitod %f8, %f62
258 fitod %f9, %f62
259 fitod %f10, %f62
260 fitod %f11, %f62
261 fitod %f12, %f62
262 fitod %f13, %f62
263 fitod %f14, %f62
264 fitod %f15, %f62
265 fitod %f16, %f62
266 fitod %f17, %f62
267 fitod %f18, %f62
268 fitod %f19, %f62
269 fitod %f20, %f62
270 fitod %f21, %f62
271 fitod %f22, %f62
272 fitod %f23, %f62
273 fitod %f24, %f62
274 fitod %f25, %f62
275 fitod %f26, %f62
276 fitod %f27, %f62
277 fitod %f28, %f62
278 fitod %f29, %f62
279 fitod %f30, %f62
280 fitod %f31, %f62
281
282fitos_emul_continue:
283 sethi %hi(fitos_table_2), %g1
284 srl %g3, 25, %g2
285 or %g1, %lo(fitos_table_2), %g1
286 and %g2, 0x1f, %g2
287 sllx %g2, 2, %g2
288 jmpl %g1 + %g2, %g0
289 ba,pt %xcc, fitos_emul_fini
290
291fitos_table_2:
292 fdtos %f62, %f0
293 fdtos %f62, %f1
294 fdtos %f62, %f2
295 fdtos %f62, %f3
296 fdtos %f62, %f4
297 fdtos %f62, %f5
298 fdtos %f62, %f6
299 fdtos %f62, %f7
300 fdtos %f62, %f8
301 fdtos %f62, %f9
302 fdtos %f62, %f10
303 fdtos %f62, %f11
304 fdtos %f62, %f12
305 fdtos %f62, %f13
306 fdtos %f62, %f14
307 fdtos %f62, %f15
308 fdtos %f62, %f16
309 fdtos %f62, %f17
310 fdtos %f62, %f18
311 fdtos %f62, %f19
312 fdtos %f62, %f20
313 fdtos %f62, %f21
314 fdtos %f62, %f22
315 fdtos %f62, %f23
316 fdtos %f62, %f24
317 fdtos %f62, %f25
318 fdtos %f62, %f26
319 fdtos %f62, %f27
320 fdtos %f62, %f28
321 fdtos %f62, %f29
322 fdtos %f62, %f30
323 fdtos %f62, %f31
324
325fitos_emul_fini:
326 ldd [%g6 + TI_FPREGS + (62 * 4)], %f62
327 done
328 .size do_fpother_check_fitos,.-do_fpother_check_fitos
329
330 .align 32
331 .globl do_fptrap
332 .type do_fptrap,#function
333do_fptrap:
334 TRAP_LOAD_THREAD_REG(%g6, %g1)
335 stx %fsr, [%g6 + TI_XFSR]
336do_fptrap_after_fsr:
337 ldub [%g6 + TI_FPSAVED], %g3
338 rd %fprs, %g1
339 or %g3, %g1, %g3
340 stb %g3, [%g6 + TI_FPSAVED]
341 rd %gsr, %g3
342 stx %g3, [%g6 + TI_GSR]
343 mov SECONDARY_CONTEXT, %g3
344
345661: ldxa [%g3] ASI_DMMU, %g5
346 .section .sun4v_1insn_patch, "ax"
347 .word 661b
348 ldxa [%g3] ASI_MMU, %g5
349 .previous
350
351 sethi %hi(sparc64_kern_sec_context), %g2
352 ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2
353
354661: stxa %g2, [%g3] ASI_DMMU
355 .section .sun4v_1insn_patch, "ax"
356 .word 661b
357 stxa %g2, [%g3] ASI_MMU
358 .previous
359
360 membar #Sync
361 add %g6, TI_FPREGS, %g2
362 andcc %g1, FPRS_DL, %g0
363 be,pn %icc, 4f
364 mov 0x40, %g3
365 stda %f0, [%g2] ASI_BLK_S
366 stda %f16, [%g2 + %g3] ASI_BLK_S
367 andcc %g1, FPRS_DU, %g0
368 be,pn %icc, 5f
3694: add %g2, 128, %g2
370 stda %f32, [%g2] ASI_BLK_S
371 stda %f48, [%g2 + %g3] ASI_BLK_S
3725: mov SECONDARY_CONTEXT, %g1
373 membar #Sync
374
375661: stxa %g5, [%g1] ASI_DMMU
376 .section .sun4v_1insn_patch, "ax"
377 .word 661b
378 stxa %g5, [%g1] ASI_MMU
379 .previous
380
381 membar #Sync
382 ba,pt %xcc, etrap
383 wr %g0, 0, %fprs
384 .size do_fptrap,.-do_fptrap
385

source code of linux/arch/sparc/kernel/fpu_traps.S