fpu_traps.S 8.1 KB

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