0001
0002
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
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
0213
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