linux/arch/sparc/kernel/fpu_traps.S
<<
>>
Prefs
   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