^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* This is trivial with the new code... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) .globl do_fpdis
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) .type do_fpdis,#function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) do_fpdis:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) sethi %hi(TSTATE_PEF), %g4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) rdpr %tstate, %g5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) andcc %g5, %g4, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) be,pt %xcc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) rd %fprs, %g5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) andcc %g5, FPRS_FEF, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) be,pt %xcc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) /* Legal state when DCR_IFPOE is set in Cheetah %dcr. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) sethi %hi(109f), %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) ba,pt %xcc, etrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) 109: or %g7, %lo(109b), %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) add %g0, %g0, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) ba,a,pt %xcc, rtrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) 1: TRAP_LOAD_THREAD_REG(%g6, %g1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) ldub [%g6 + TI_FPSAVED], %g5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) wr %g0, FPRS_FEF, %fprs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) andcc %g5, FPRS_FEF, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) be,a,pt %icc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) clr %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) ldx [%g6 + TI_GSR], %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) 1: andcc %g5, FPRS_DL, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) bne,pn %icc, 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) fzero %f0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) andcc %g5, FPRS_DU, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) bne,pn %icc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) fzero %f2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) faddd %f0, %f2, %f4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) fmuld %f0, %f2, %f6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) faddd %f0, %f2, %f8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) fmuld %f0, %f2, %f10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) faddd %f0, %f2, %f12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) fmuld %f0, %f2, %f14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) faddd %f0, %f2, %f16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) fmuld %f0, %f2, %f18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) faddd %f0, %f2, %f20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) fmuld %f0, %f2, %f22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) faddd %f0, %f2, %f24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) fmuld %f0, %f2, %f26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) faddd %f0, %f2, %f28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) fmuld %f0, %f2, %f30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) faddd %f0, %f2, %f32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) fmuld %f0, %f2, %f34
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) faddd %f0, %f2, %f36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) fmuld %f0, %f2, %f38
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) faddd %f0, %f2, %f40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) fmuld %f0, %f2, %f42
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) faddd %f0, %f2, %f44
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) fmuld %f0, %f2, %f46
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) faddd %f0, %f2, %f48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) fmuld %f0, %f2, %f50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) faddd %f0, %f2, %f52
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) fmuld %f0, %f2, %f54
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) faddd %f0, %f2, %f56
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) fmuld %f0, %f2, %f58
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) b,pt %xcc, fpdis_exit2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) faddd %f0, %f2, %f60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) 1: mov SECONDARY_CONTEXT, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) add %g6, TI_FPREGS + 0x80, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) faddd %f0, %f2, %f4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) fmuld %f0, %f2, %f6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) 661: ldxa [%g3] ASI_DMMU, %g5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) .section .sun4v_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) .word 661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) ldxa [%g3] ASI_MMU, %g5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) .previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) sethi %hi(sparc64_kern_sec_context), %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) 661: stxa %g2, [%g3] ASI_DMMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) .section .sun4v_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) .word 661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) stxa %g2, [%g3] ASI_MMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) .previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) membar #Sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) add %g6, TI_FPREGS + 0xc0, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) faddd %f0, %f2, %f8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) fmuld %f0, %f2, %f10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) membar #Sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) ldda [%g1] ASI_BLK_S, %f32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) ldda [%g2] ASI_BLK_S, %f48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) membar #Sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) faddd %f0, %f2, %f12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) fmuld %f0, %f2, %f14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) faddd %f0, %f2, %f16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) fmuld %f0, %f2, %f18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) faddd %f0, %f2, %f20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) fmuld %f0, %f2, %f22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) faddd %f0, %f2, %f24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) fmuld %f0, %f2, %f26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) faddd %f0, %f2, %f28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) fmuld %f0, %f2, %f30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) ba,a,pt %xcc, fpdis_exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 2: andcc %g5, FPRS_DU, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) bne,pt %icc, 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) fzero %f32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) mov SECONDARY_CONTEXT, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) fzero %f34
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 661: ldxa [%g3] ASI_DMMU, %g5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) .section .sun4v_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) .word 661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) ldxa [%g3] ASI_MMU, %g5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) .previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) add %g6, TI_FPREGS, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) sethi %hi(sparc64_kern_sec_context), %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 661: stxa %g2, [%g3] ASI_DMMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) .section .sun4v_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) .word 661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) stxa %g2, [%g3] ASI_MMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) .previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) membar #Sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) add %g6, TI_FPREGS + 0x40, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) faddd %f32, %f34, %f36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) fmuld %f32, %f34, %f38
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) membar #Sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) ldda [%g1] ASI_BLK_S, %f0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) ldda [%g2] ASI_BLK_S, %f16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) membar #Sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) faddd %f32, %f34, %f40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) fmuld %f32, %f34, %f42
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) faddd %f32, %f34, %f44
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) fmuld %f32, %f34, %f46
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) faddd %f32, %f34, %f48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) fmuld %f32, %f34, %f50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) faddd %f32, %f34, %f52
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) fmuld %f32, %f34, %f54
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) faddd %f32, %f34, %f56
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) fmuld %f32, %f34, %f58
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) faddd %f32, %f34, %f60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) fmuld %f32, %f34, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) ba,a,pt %xcc, fpdis_exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 3: mov SECONDARY_CONTEXT, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) add %g6, TI_FPREGS, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 661: ldxa [%g3] ASI_DMMU, %g5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) .section .sun4v_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) .word 661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) ldxa [%g3] ASI_MMU, %g5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) .previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) sethi %hi(sparc64_kern_sec_context), %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 661: stxa %g2, [%g3] ASI_DMMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) .section .sun4v_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) .word 661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) stxa %g2, [%g3] ASI_MMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) .previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) membar #Sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) mov 0x40, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) membar #Sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) ldda [%g1] ASI_BLK_S, %f0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) ldda [%g1 + %g2] ASI_BLK_S, %f16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) add %g1, 0x80, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) ldda [%g1] ASI_BLK_S, %f32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) ldda [%g1 + %g2] ASI_BLK_S, %f48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) membar #Sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) fpdis_exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 661: stxa %g5, [%g3] ASI_DMMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) .section .sun4v_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) .word 661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) stxa %g5, [%g3] ASI_MMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) .previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) membar #Sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) fpdis_exit2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) wr %g7, 0, %gsr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) ldx [%g6 + TI_XFSR], %fsr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) rdpr %tstate, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) or %g3, %g4, %g3 ! anal...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) wrpr %g3, %tstate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) wr %g0, FPRS_FEF, %fprs ! clean DU/DL bits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) retry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) .size do_fpdis,.-do_fpdis
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) .align 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) .type fp_other_bounce,#function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) fp_other_bounce:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) call do_fpother
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) add %sp, PTREGS_OFF, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) ba,a,pt %xcc, rtrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) .size fp_other_bounce,.-fp_other_bounce
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) .align 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) .globl do_fpother_check_fitos
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) .type do_fpother_check_fitos,#function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) do_fpother_check_fitos:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) TRAP_LOAD_THREAD_REG(%g6, %g1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) sethi %hi(fp_other_bounce - 4), %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) or %g7, %lo(fp_other_bounce - 4), %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) /* NOTE: Need to preserve %g7 until we fully commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) * to the fitos fixup.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) stx %fsr, [%g6 + TI_XFSR]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) rdpr %tstate, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) andcc %g3, TSTATE_PRIV, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) bne,pn %xcc, do_fptrap_after_fsr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) ldx [%g6 + TI_XFSR], %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) srlx %g3, 14, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) and %g1, 7, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) cmp %g1, 2 ! Unfinished FP-OP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) bne,pn %xcc, do_fptrap_after_fsr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) sethi %hi(1 << 23), %g1 ! Inexact
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) andcc %g3, %g1, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) bne,pn %xcc, do_fptrap_after_fsr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) rdpr %tpc, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) lduwa [%g1] ASI_AIUP, %g3 ! This cannot ever fail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) #define FITOS_MASK 0xc1f83fe0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) #define FITOS_COMPARE 0x81a01880
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) sethi %hi(FITOS_MASK), %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) or %g1, %lo(FITOS_MASK), %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) and %g3, %g1, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) sethi %hi(FITOS_COMPARE), %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) or %g2, %lo(FITOS_COMPARE), %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) cmp %g1, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) bne,pn %xcc, do_fptrap_after_fsr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) std %f62, [%g6 + TI_FPREGS + (62 * 4)]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) sethi %hi(fitos_table_1), %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) and %g3, 0x1f, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) or %g1, %lo(fitos_table_1), %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) sllx %g2, 2, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) jmpl %g1 + %g2, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) ba,pt %xcc, fitos_emul_continue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) fitos_table_1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) fitod %f0, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) fitod %f1, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) fitod %f2, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) fitod %f3, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) fitod %f4, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) fitod %f5, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) fitod %f6, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) fitod %f7, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) fitod %f8, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) fitod %f9, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) fitod %f10, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) fitod %f11, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) fitod %f12, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) fitod %f13, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) fitod %f14, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) fitod %f15, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) fitod %f16, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) fitod %f17, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) fitod %f18, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) fitod %f19, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) fitod %f20, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) fitod %f21, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) fitod %f22, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) fitod %f23, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) fitod %f24, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) fitod %f25, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) fitod %f26, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) fitod %f27, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) fitod %f28, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) fitod %f29, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) fitod %f30, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) fitod %f31, %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) fitos_emul_continue:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) sethi %hi(fitos_table_2), %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) srl %g3, 25, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) or %g1, %lo(fitos_table_2), %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) and %g2, 0x1f, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) sllx %g2, 2, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) jmpl %g1 + %g2, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) ba,pt %xcc, fitos_emul_fini
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) fitos_table_2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) fdtos %f62, %f0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) fdtos %f62, %f1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) fdtos %f62, %f2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) fdtos %f62, %f3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) fdtos %f62, %f4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) fdtos %f62, %f5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) fdtos %f62, %f6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) fdtos %f62, %f7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) fdtos %f62, %f8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) fdtos %f62, %f9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) fdtos %f62, %f10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) fdtos %f62, %f11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) fdtos %f62, %f12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) fdtos %f62, %f13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) fdtos %f62, %f14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) fdtos %f62, %f15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) fdtos %f62, %f16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) fdtos %f62, %f17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) fdtos %f62, %f18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) fdtos %f62, %f19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) fdtos %f62, %f20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) fdtos %f62, %f21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) fdtos %f62, %f22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) fdtos %f62, %f23
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) fdtos %f62, %f24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) fdtos %f62, %f25
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) fdtos %f62, %f26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) fdtos %f62, %f27
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) fdtos %f62, %f28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) fdtos %f62, %f29
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) fdtos %f62, %f30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) fdtos %f62, %f31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) fitos_emul_fini:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) ldd [%g6 + TI_FPREGS + (62 * 4)], %f62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) .size do_fpother_check_fitos,.-do_fpother_check_fitos
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) .align 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) .globl do_fptrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) .type do_fptrap,#function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) do_fptrap:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) TRAP_LOAD_THREAD_REG(%g6, %g1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) stx %fsr, [%g6 + TI_XFSR]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) do_fptrap_after_fsr:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) ldub [%g6 + TI_FPSAVED], %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) rd %fprs, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) or %g3, %g1, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) stb %g3, [%g6 + TI_FPSAVED]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) rd %gsr, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) stx %g3, [%g6 + TI_GSR]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) mov SECONDARY_CONTEXT, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 661: ldxa [%g3] ASI_DMMU, %g5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) .section .sun4v_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) .word 661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) ldxa [%g3] ASI_MMU, %g5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) .previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) sethi %hi(sparc64_kern_sec_context), %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 661: stxa %g2, [%g3] ASI_DMMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) .section .sun4v_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) .word 661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) stxa %g2, [%g3] ASI_MMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) .previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) membar #Sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) add %g6, TI_FPREGS, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) andcc %g1, FPRS_DL, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) be,pn %icc, 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) mov 0x40, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) stda %f0, [%g2] ASI_BLK_S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) stda %f16, [%g2 + %g3] ASI_BLK_S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) andcc %g1, FPRS_DU, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) be,pn %icc, 5f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 4: add %g2, 128, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) stda %f32, [%g2] ASI_BLK_S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) stda %f48, [%g2 + %g3] ASI_BLK_S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 5: mov SECONDARY_CONTEXT, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) membar #Sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 661: stxa %g5, [%g1] ASI_DMMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) .section .sun4v_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) .word 661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) stxa %g5, [%g1] ASI_MMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) .previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) membar #Sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) ba,pt %xcc, etrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) wr %g0, 0, %fprs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) .size do_fptrap,.-do_fptrap