Linux 5.8-rc4
[linux/fpc-iii.git] / arch / sparc / kernel / fpu_traps.S
blob051659e29c7a62ef57d37718ee299f24662e703e
1 /* SPDX-License-Identifier: GPL-2.0 */
2         /* This is trivial with the new code... */
3         .globl          do_fpdis
4         .type           do_fpdis,#function
5 do_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
16         /* Legal state when DCR_IFPOE is set in Cheetah %dcr. */
17         sethi           %hi(109f), %g7
18         ba,pt           %xcc, etrap
19 109:     or             %g7, %lo(109b), %g7
20         add             %g0, %g0, %g0
21         ba,a,pt         %xcc, rtrap
23 1:      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
30 1:      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
66 1:      mov             SECONDARY_CONTEXT, %g3
67         add             %g6, TI_FPREGS + 0x80, %g1
68         faddd           %f0, %f2, %f4
69         fmuld           %f0, %f2, %f6
71 661:    ldxa            [%g3] ASI_DMMU, %g5
72         .section        .sun4v_1insn_patch, "ax"
73         .word           661b
74         ldxa            [%g3] ASI_MMU, %g5
75         .previous
77         sethi           %hi(sparc64_kern_sec_context), %g2
78         ldx             [%g2 + %lo(sparc64_kern_sec_context)], %g2
80 661:    stxa            %g2, [%g3] ASI_DMMU
81         .section        .sun4v_1insn_patch, "ax"
82         .word           661b
83         stxa            %g2, [%g3] ASI_MMU
84         .previous
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
106 2:      andcc           %g5, FPRS_DU, %g0
107         bne,pt          %icc, 3f
108          fzero          %f32
109         mov             SECONDARY_CONTEXT, %g3
110         fzero           %f34
112 661:    ldxa            [%g3] ASI_DMMU, %g5
113         .section        .sun4v_1insn_patch, "ax"
114         .word           661b
115         ldxa            [%g3] ASI_MMU, %g5
116         .previous
118         add             %g6, TI_FPREGS, %g1
119         sethi           %hi(sparc64_kern_sec_context), %g2
120         ldx             [%g2 + %lo(sparc64_kern_sec_context)], %g2
122 661:    stxa            %g2, [%g3] ASI_DMMU
123         .section        .sun4v_1insn_patch, "ax"
124         .word           661b
125         stxa            %g2, [%g3] ASI_MMU
126         .previous
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
150 3:      mov             SECONDARY_CONTEXT, %g3
151         add             %g6, TI_FPREGS, %g1
153 661:    ldxa            [%g3] ASI_DMMU, %g5
154         .section        .sun4v_1insn_patch, "ax"
155         .word           661b
156         ldxa            [%g3] ASI_MMU, %g5
157         .previous
159         sethi           %hi(sparc64_kern_sec_context), %g2
160         ldx             [%g2 + %lo(sparc64_kern_sec_context)], %g2
162 661:    stxa            %g2, [%g3] ASI_DMMU
163         .section        .sun4v_1insn_patch, "ax"
164         .word           661b
165         stxa            %g2, [%g3] ASI_MMU
166         .previous
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
177 fpdis_exit:
179 661:    stxa            %g5, [%g3] ASI_DMMU
180         .section        .sun4v_1insn_patch, "ax"
181         .word           661b
182         stxa            %g5, [%g3] ASI_MMU
183         .previous
185         membar          #Sync
186 fpdis_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
196         .align          32
197         .type           fp_other_bounce,#function
198 fp_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
204         .align          32
205         .globl          do_fpother_check_fitos
206         .type           do_fpother_check_fitos,#function
207 do_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
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
248 fitos_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
282 fitos_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
291 fitos_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
325 fitos_emul_fini:
326         ldd             [%g6 + TI_FPREGS + (62 * 4)], %f62
327         done
328         .size           do_fpother_check_fitos,.-do_fpother_check_fitos
330         .align          32
331         .globl          do_fptrap
332         .type           do_fptrap,#function
333 do_fptrap:
334         TRAP_LOAD_THREAD_REG(%g6, %g1)
335         stx             %fsr, [%g6 + TI_XFSR]
336 do_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
345 661:    ldxa            [%g3] ASI_DMMU, %g5
346         .section        .sun4v_1insn_patch, "ax"
347         .word           661b
348         ldxa            [%g3] ASI_MMU, %g5
349         .previous
351         sethi           %hi(sparc64_kern_sec_context), %g2
352         ldx             [%g2 + %lo(sparc64_kern_sec_context)], %g2
354 661:    stxa            %g2, [%g3] ASI_DMMU
355         .section        .sun4v_1insn_patch, "ax"
356         .word           661b
357         stxa            %g2, [%g3] ASI_MMU
358         .previous
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
369 4:       add            %g2, 128, %g2
370         stda            %f32, [%g2] ASI_BLK_S
371         stda            %f48, [%g2 + %g3] ASI_BLK_S
372 5:      mov             SECONDARY_CONTEXT, %g1
373         membar          #Sync
375 661:    stxa            %g5, [%g1] ASI_DMMU
376         .section        .sun4v_1insn_patch, "ax"
377         .word           661b
378         stxa            %g5, [%g1] ASI_MMU
379         .previous
381         membar          #Sync
382         ba,pt           %xcc, etrap
383          wr             %g0, 0, %fprs
384         .size           do_fptrap,.-do_fptrap