~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/sparc/kernel/fpu_traps.S

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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
 15 
 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
 22 
 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
 70 
 71 661:    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 
 80 661:    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 
106 2:      andcc           %g5, FPRS_DU, %g0
107         bne,pt          %icc, 3f
108          fzero          %f32
109         mov             SECONDARY_CONTEXT, %g3
110         fzero           %f34
111 
112 661:    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 
122 661:    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 
150 3:      mov             SECONDARY_CONTEXT, %g3
151         add             %g6, TI_FPREGS, %g1
152 
153 661:    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 
162 661:    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
177 fpdis_exit:
178 
179 661:    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
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
195 
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
203 
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
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 
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
281 
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
290 
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
324 
325 fitos_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
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
344 
345 661:    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 
354 661:    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
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
374 
375 661:    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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php