Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002     /* This is trivial with the new code... */
0003     .globl      do_fpdis
0004     .type       do_fpdis,#function
0005 do_fpdis:
0006     sethi       %hi(TSTATE_PEF), %g4
0007     rdpr        %tstate, %g5
0008     andcc       %g5, %g4, %g0
0009     be,pt       %xcc, 1f
0010      nop
0011     rd      %fprs, %g5
0012     andcc       %g5, FPRS_FEF, %g0
0013     be,pt       %xcc, 1f
0014      nop
0015 
0016     /* Legal state when DCR_IFPOE is set in Cheetah %dcr. */
0017     sethi       %hi(109f), %g7
0018     ba,pt       %xcc, etrap
0019 109:     or     %g7, %lo(109b), %g7
0020     add     %g0, %g0, %g0
0021     ba,a,pt     %xcc, rtrap
0022 
0023 1:  TRAP_LOAD_THREAD_REG(%g6, %g1)
0024     ldub        [%g6 + TI_FPSAVED], %g5
0025     wr      %g0, FPRS_FEF, %fprs
0026     andcc       %g5, FPRS_FEF, %g0
0027     be,a,pt     %icc, 1f
0028      clr        %g7
0029     ldx     [%g6 + TI_GSR], %g7
0030 1:  andcc       %g5, FPRS_DL, %g0
0031     bne,pn      %icc, 2f
0032      fzero      %f0
0033     andcc       %g5, FPRS_DU, %g0
0034     bne,pn      %icc, 1f
0035      fzero      %f2
0036     faddd       %f0, %f2, %f4
0037     fmuld       %f0, %f2, %f6
0038     faddd       %f0, %f2, %f8
0039     fmuld       %f0, %f2, %f10
0040     faddd       %f0, %f2, %f12
0041     fmuld       %f0, %f2, %f14
0042     faddd       %f0, %f2, %f16
0043     fmuld       %f0, %f2, %f18
0044     faddd       %f0, %f2, %f20
0045     fmuld       %f0, %f2, %f22
0046     faddd       %f0, %f2, %f24
0047     fmuld       %f0, %f2, %f26
0048     faddd       %f0, %f2, %f28
0049     fmuld       %f0, %f2, %f30
0050     faddd       %f0, %f2, %f32
0051     fmuld       %f0, %f2, %f34
0052     faddd       %f0, %f2, %f36
0053     fmuld       %f0, %f2, %f38
0054     faddd       %f0, %f2, %f40
0055     fmuld       %f0, %f2, %f42
0056     faddd       %f0, %f2, %f44
0057     fmuld       %f0, %f2, %f46
0058     faddd       %f0, %f2, %f48
0059     fmuld       %f0, %f2, %f50
0060     faddd       %f0, %f2, %f52
0061     fmuld       %f0, %f2, %f54
0062     faddd       %f0, %f2, %f56
0063     fmuld       %f0, %f2, %f58
0064     b,pt        %xcc, fpdis_exit2
0065      faddd      %f0, %f2, %f60
0066 1:  mov     SECONDARY_CONTEXT, %g3
0067     add     %g6, TI_FPREGS + 0x80, %g1
0068     faddd       %f0, %f2, %f4
0069     fmuld       %f0, %f2, %f6
0070 
0071 661:    ldxa        [%g3] ASI_DMMU, %g5
0072     .section    .sun4v_1insn_patch, "ax"
0073     .word       661b
0074     ldxa        [%g3] ASI_MMU, %g5
0075     .previous
0076 
0077     sethi       %hi(sparc64_kern_sec_context), %g2
0078     ldx     [%g2 + %lo(sparc64_kern_sec_context)], %g2
0079 
0080 661:    stxa        %g2, [%g3] ASI_DMMU
0081     .section    .sun4v_1insn_patch, "ax"
0082     .word       661b
0083     stxa        %g2, [%g3] ASI_MMU
0084     .previous
0085 
0086     membar      #Sync
0087     add     %g6, TI_FPREGS + 0xc0, %g2
0088     faddd       %f0, %f2, %f8
0089     fmuld       %f0, %f2, %f10
0090     membar      #Sync
0091     ldda        [%g1] ASI_BLK_S, %f32
0092     ldda        [%g2] ASI_BLK_S, %f48
0093     membar      #Sync
0094     faddd       %f0, %f2, %f12
0095     fmuld       %f0, %f2, %f14
0096     faddd       %f0, %f2, %f16
0097     fmuld       %f0, %f2, %f18
0098     faddd       %f0, %f2, %f20
0099     fmuld       %f0, %f2, %f22
0100     faddd       %f0, %f2, %f24
0101     fmuld       %f0, %f2, %f26
0102     faddd       %f0, %f2, %f28
0103     fmuld       %f0, %f2, %f30
0104     ba,a,pt     %xcc, fpdis_exit
0105 
0106 2:  andcc       %g5, FPRS_DU, %g0
0107     bne,pt      %icc, 3f
0108      fzero      %f32
0109     mov     SECONDARY_CONTEXT, %g3
0110     fzero       %f34
0111 
0112 661:    ldxa        [%g3] ASI_DMMU, %g5
0113     .section    .sun4v_1insn_patch, "ax"
0114     .word       661b
0115     ldxa        [%g3] ASI_MMU, %g5
0116     .previous
0117 
0118     add     %g6, TI_FPREGS, %g1
0119     sethi       %hi(sparc64_kern_sec_context), %g2
0120     ldx     [%g2 + %lo(sparc64_kern_sec_context)], %g2
0121 
0122 661:    stxa        %g2, [%g3] ASI_DMMU
0123     .section    .sun4v_1insn_patch, "ax"
0124     .word       661b
0125     stxa        %g2, [%g3] ASI_MMU
0126     .previous
0127 
0128     membar      #Sync
0129     add     %g6, TI_FPREGS + 0x40, %g2
0130     faddd       %f32, %f34, %f36
0131     fmuld       %f32, %f34, %f38
0132     membar      #Sync
0133     ldda        [%g1] ASI_BLK_S, %f0
0134     ldda        [%g2] ASI_BLK_S, %f16
0135     membar      #Sync
0136     faddd       %f32, %f34, %f40
0137     fmuld       %f32, %f34, %f42
0138     faddd       %f32, %f34, %f44
0139     fmuld       %f32, %f34, %f46
0140     faddd       %f32, %f34, %f48
0141     fmuld       %f32, %f34, %f50
0142     faddd       %f32, %f34, %f52
0143     fmuld       %f32, %f34, %f54
0144     faddd       %f32, %f34, %f56
0145     fmuld       %f32, %f34, %f58
0146     faddd       %f32, %f34, %f60
0147     fmuld       %f32, %f34, %f62
0148     ba,a,pt     %xcc, fpdis_exit
0149 
0150 3:  mov     SECONDARY_CONTEXT, %g3
0151     add     %g6, TI_FPREGS, %g1
0152 
0153 661:    ldxa        [%g3] ASI_DMMU, %g5
0154     .section    .sun4v_1insn_patch, "ax"
0155     .word       661b
0156     ldxa        [%g3] ASI_MMU, %g5
0157     .previous
0158 
0159     sethi       %hi(sparc64_kern_sec_context), %g2
0160     ldx     [%g2 + %lo(sparc64_kern_sec_context)], %g2
0161 
0162 661:    stxa        %g2, [%g3] ASI_DMMU
0163     .section    .sun4v_1insn_patch, "ax"
0164     .word       661b
0165     stxa        %g2, [%g3] ASI_MMU
0166     .previous
0167 
0168     membar      #Sync
0169     mov     0x40, %g2
0170     membar      #Sync
0171     ldda        [%g1] ASI_BLK_S, %f0
0172     ldda        [%g1 + %g2] ASI_BLK_S, %f16
0173     add     %g1, 0x80, %g1
0174     ldda        [%g1] ASI_BLK_S, %f32
0175     ldda        [%g1 + %g2] ASI_BLK_S, %f48
0176     membar      #Sync
0177 fpdis_exit:
0178 
0179 661:    stxa        %g5, [%g3] ASI_DMMU
0180     .section    .sun4v_1insn_patch, "ax"
0181     .word       661b
0182     stxa        %g5, [%g3] ASI_MMU
0183     .previous
0184 
0185     membar      #Sync
0186 fpdis_exit2:
0187     wr      %g7, 0, %gsr
0188     ldx     [%g6 + TI_XFSR], %fsr
0189     rdpr        %tstate, %g3
0190     or      %g3, %g4, %g3       ! anal...
0191     wrpr        %g3, %tstate
0192     wr      %g0, FPRS_FEF, %fprs    ! clean DU/DL bits
0193     retry
0194     .size       do_fpdis,.-do_fpdis
0195 
0196     .align      32
0197     .type       fp_other_bounce,#function
0198 fp_other_bounce:
0199     call        do_fpother
0200      add        %sp, PTREGS_OFF, %o0
0201     ba,a,pt     %xcc, rtrap
0202     .size       fp_other_bounce,.-fp_other_bounce
0203 
0204     .align      32
0205     .globl      do_fpother_check_fitos
0206     .type       do_fpother_check_fitos,#function
0207 do_fpother_check_fitos:
0208     TRAP_LOAD_THREAD_REG(%g6, %g1)
0209     sethi       %hi(fp_other_bounce - 4), %g7
0210     or      %g7, %lo(fp_other_bounce - 4), %g7
0211 
0212     /* NOTE: Need to preserve %g7 until we fully commit
0213      *       to the fitos fixup.
0214      */
0215     stx     %fsr, [%g6 + TI_XFSR]
0216     rdpr        %tstate, %g3
0217     andcc       %g3, TSTATE_PRIV, %g0
0218     bne,pn      %xcc, do_fptrap_after_fsr
0219      nop
0220     ldx     [%g6 + TI_XFSR], %g3
0221     srlx        %g3, 14, %g1
0222     and     %g1, 7, %g1
0223     cmp     %g1, 2          ! Unfinished FP-OP
0224     bne,pn      %xcc, do_fptrap_after_fsr
0225      sethi      %hi(1 << 23), %g1   ! Inexact
0226     andcc       %g3, %g1, %g0
0227     bne,pn      %xcc, do_fptrap_after_fsr
0228      rdpr       %tpc, %g1
0229     lduwa       [%g1] ASI_AIUP, %g3 ! This cannot ever fail
0230 #define FITOS_MASK  0xc1f83fe0
0231 #define FITOS_COMPARE   0x81a01880
0232     sethi       %hi(FITOS_MASK), %g1
0233     or      %g1, %lo(FITOS_MASK), %g1
0234     and     %g3, %g1, %g1
0235     sethi       %hi(FITOS_COMPARE), %g2
0236     or      %g2, %lo(FITOS_COMPARE), %g2
0237     cmp     %g1, %g2
0238     bne,pn      %xcc, do_fptrap_after_fsr
0239      nop
0240     std     %f62, [%g6 + TI_FPREGS + (62 * 4)]
0241     sethi       %hi(fitos_table_1), %g1
0242     and     %g3, 0x1f, %g2
0243     or      %g1, %lo(fitos_table_1),  %g1
0244     sllx        %g2, 2, %g2
0245     jmpl        %g1 + %g2, %g0
0246      ba,pt      %xcc, fitos_emul_continue
0247 
0248 fitos_table_1:
0249     fitod       %f0, %f62
0250     fitod       %f1, %f62
0251     fitod       %f2, %f62
0252     fitod       %f3, %f62
0253     fitod       %f4, %f62
0254     fitod       %f5, %f62
0255     fitod       %f6, %f62
0256     fitod       %f7, %f62
0257     fitod       %f8, %f62
0258     fitod       %f9, %f62
0259     fitod       %f10, %f62
0260     fitod       %f11, %f62
0261     fitod       %f12, %f62
0262     fitod       %f13, %f62
0263     fitod       %f14, %f62
0264     fitod       %f15, %f62
0265     fitod       %f16, %f62
0266     fitod       %f17, %f62
0267     fitod       %f18, %f62
0268     fitod       %f19, %f62
0269     fitod       %f20, %f62
0270     fitod       %f21, %f62
0271     fitod       %f22, %f62
0272     fitod       %f23, %f62
0273     fitod       %f24, %f62
0274     fitod       %f25, %f62
0275     fitod       %f26, %f62
0276     fitod       %f27, %f62
0277     fitod       %f28, %f62
0278     fitod       %f29, %f62
0279     fitod       %f30, %f62
0280     fitod       %f31, %f62
0281 
0282 fitos_emul_continue:
0283     sethi       %hi(fitos_table_2), %g1
0284     srl     %g3, 25, %g2
0285     or      %g1, %lo(fitos_table_2), %g1
0286     and     %g2, 0x1f, %g2
0287     sllx        %g2, 2, %g2
0288     jmpl        %g1 + %g2, %g0
0289      ba,pt      %xcc, fitos_emul_fini
0290 
0291 fitos_table_2:
0292     fdtos       %f62, %f0
0293     fdtos       %f62, %f1
0294     fdtos       %f62, %f2
0295     fdtos       %f62, %f3
0296     fdtos       %f62, %f4
0297     fdtos       %f62, %f5
0298     fdtos       %f62, %f6
0299     fdtos       %f62, %f7
0300     fdtos       %f62, %f8
0301     fdtos       %f62, %f9
0302     fdtos       %f62, %f10
0303     fdtos       %f62, %f11
0304     fdtos       %f62, %f12
0305     fdtos       %f62, %f13
0306     fdtos       %f62, %f14
0307     fdtos       %f62, %f15
0308     fdtos       %f62, %f16
0309     fdtos       %f62, %f17
0310     fdtos       %f62, %f18
0311     fdtos       %f62, %f19
0312     fdtos       %f62, %f20
0313     fdtos       %f62, %f21
0314     fdtos       %f62, %f22
0315     fdtos       %f62, %f23
0316     fdtos       %f62, %f24
0317     fdtos       %f62, %f25
0318     fdtos       %f62, %f26
0319     fdtos       %f62, %f27
0320     fdtos       %f62, %f28
0321     fdtos       %f62, %f29
0322     fdtos       %f62, %f30
0323     fdtos       %f62, %f31
0324 
0325 fitos_emul_fini:
0326     ldd     [%g6 + TI_FPREGS + (62 * 4)], %f62
0327     done
0328     .size       do_fpother_check_fitos,.-do_fpother_check_fitos
0329 
0330     .align      32
0331     .globl      do_fptrap
0332     .type       do_fptrap,#function
0333 do_fptrap:
0334     TRAP_LOAD_THREAD_REG(%g6, %g1)
0335     stx     %fsr, [%g6 + TI_XFSR]
0336 do_fptrap_after_fsr:
0337     ldub        [%g6 + TI_FPSAVED], %g3
0338     rd      %fprs, %g1
0339     or      %g3, %g1, %g3
0340     stb     %g3, [%g6 + TI_FPSAVED]
0341     rd      %gsr, %g3
0342     stx     %g3, [%g6 + TI_GSR]
0343     mov     SECONDARY_CONTEXT, %g3
0344 
0345 661:    ldxa        [%g3] ASI_DMMU, %g5
0346     .section    .sun4v_1insn_patch, "ax"
0347     .word       661b
0348     ldxa        [%g3] ASI_MMU, %g5
0349     .previous
0350 
0351     sethi       %hi(sparc64_kern_sec_context), %g2
0352     ldx     [%g2 + %lo(sparc64_kern_sec_context)], %g2
0353 
0354 661:    stxa        %g2, [%g3] ASI_DMMU
0355     .section    .sun4v_1insn_patch, "ax"
0356     .word       661b
0357     stxa        %g2, [%g3] ASI_MMU
0358     .previous
0359 
0360     membar      #Sync
0361     add     %g6, TI_FPREGS, %g2
0362     andcc       %g1, FPRS_DL, %g0
0363     be,pn       %icc, 4f
0364      mov        0x40, %g3
0365     stda        %f0, [%g2] ASI_BLK_S
0366     stda        %f16, [%g2 + %g3] ASI_BLK_S
0367     andcc       %g1, FPRS_DU, %g0
0368     be,pn       %icc, 5f
0369 4:       add        %g2, 128, %g2
0370     stda        %f32, [%g2] ASI_BLK_S
0371     stda        %f48, [%g2 + %g3] ASI_BLK_S
0372 5:  mov     SECONDARY_CONTEXT, %g1
0373     membar      #Sync
0374 
0375 661:    stxa        %g5, [%g1] ASI_DMMU
0376     .section    .sun4v_1insn_patch, "ax"
0377     .word       661b
0378     stxa        %g5, [%g1] ASI_MMU
0379     .previous
0380 
0381     membar      #Sync
0382     ba,pt       %xcc, etrap
0383      wr     %g0, 0, %fprs
0384     .size       do_fptrap,.-do_fptrap