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