root/arch/sparc/kernel/fpu_traps.S

/* [<][>][^][v][top][bottom][index][help] */
   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

/* [<][>][^][v][top][bottom][index][help] */