fpu_traps.S 8.1 KB

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