blockops.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:11k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: blockops.S,v 1.41 2001/12/05 06:05:35 davem Exp $
  2.  * blockops.S: UltraSparc block zero optimized routines.
  3.  *
  4.  * Copyright (C) 1996, 1998, 1999, 2000 David S. Miller (davem@redhat.com)
  5.  * Copyright (C) 1997 Jakub Jelinek (jakub@redhat.com)
  6.  */
  7. #include "VIS.h"
  8. #include <asm/visasm.h>
  9. #include <asm/page.h>
  10. #include <asm/pgtable.h>
  11. #include <asm/asm_offsets.h>
  12. #define TOUCH(reg0, reg1, reg2, reg3, reg4, reg5, reg6, reg7)
  13. fmovd %reg0, %f48;  fmovd %reg1, %f50;
  14. fmovd %reg2, %f52;  fmovd %reg3, %f54;
  15. fmovd %reg4, %f56;  fmovd %reg5, %f58;
  16. fmovd %reg6, %f60;  fmovd %reg7, %f62;
  17. #define DCACHE_SIZE (PAGE_SIZE * 2)
  18. #define TLBTEMP_ENT1 (60 << 3)
  19. #define TLBTEMP_ENT2 (61 << 3)
  20. #define TLBTEMP_ENTSZ (1 << 3)
  21. #if (PAGE_SHIFT == 13) || (PAGE_SHIFT == 19)
  22. #define PAGE_SIZE_REM 0x80
  23. #elif (PAGE_SHIFT == 16) || (PAGE_SHIFT == 22)
  24. #define PAGE_SIZE_REM 0x100
  25. #else
  26. #error Wrong PAGE_SHIFT specified
  27. #endif
  28. .text
  29. .align 32
  30. .globl copy_user_page
  31. .type copy_user_page,@function
  32. copy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */
  33. VISEntry
  34. sethi %hi(PAGE_SIZE), %g3
  35. sub %o0, %g4, %g1
  36. and %o2, %g3, %o0
  37. sethi %hi(TLBTEMP_BASE), %o3
  38. sethi %uhi(_PAGE_VALID | _PAGE_SZBITS), %g3
  39. sub %o1, %g4, %g2
  40. sllx %g3, 32, %g3
  41. mov TLB_TAG_ACCESS, %o2
  42. or %g3, (_PAGE_CP | _PAGE_CV | _PAGE_P | _PAGE_L | _PAGE_W), %g3
  43. sethi %hi(DCACHE_SIZE), %o1
  44. or %g1, %g3, %g1
  45. or %g2, %g3, %g2
  46. add %o0, %o3, %o0
  47. add %o0, %o1, %o1
  48. #define FIX_INSN_1 0x96102060 /* mov (12 << 3), %o3 */
  49. cheetah_patch_1:
  50. mov TLBTEMP_ENT1, %o3
  51. rdpr %pstate, %g3
  52. wrpr %g3, PSTATE_IE, %pstate
  53. /* Do this now, before loading the fixed TLB entries for copying,
  54.  * so we do not risk a multiple TLB match condition later when
  55.  * restoring those entries.
  56.  */
  57. ldub [%g6 + AOFF_task_thread + AOFF_thread_use_blkcommit], %g3
  58. /* Spitfire Errata #32 workaround */
  59. mov 0x8, %o4
  60. stxa %g0, [%o4] ASI_DMMU
  61. membar #Sync
  62. ldxa [%o3] ASI_DTLB_TAG_READ, %o4
  63. /* Spitfire Errata #32 workaround */
  64. mov 0x8, %o5
  65. stxa %g0, [%o5] ASI_DMMU
  66. membar #Sync
  67. ldxa [%o3] ASI_DTLB_DATA_ACCESS, %g0
  68. ldxa [%o3] ASI_DTLB_DATA_ACCESS, %o5
  69. stxa %o0, [%o2] ASI_DMMU
  70. stxa %g1, [%o3] ASI_DTLB_DATA_ACCESS
  71. membar #Sync
  72. add %o3, (TLBTEMP_ENTSZ), %o3
  73. /* Spitfire Errata #32 workaround */
  74. mov 0x8, %g5
  75. stxa %g0, [%g5] ASI_DMMU
  76. membar #Sync
  77. ldxa [%o3] ASI_DTLB_TAG_READ, %g5
  78. /* Spitfire Errata #32 workaround */
  79. mov 0x8, %g7
  80. stxa %g0, [%g7] ASI_DMMU
  81. membar #Sync
  82. ldxa [%o3] ASI_DTLB_DATA_ACCESS, %g0
  83. ldxa [%o3] ASI_DTLB_DATA_ACCESS, %g7
  84. stxa %o1, [%o2] ASI_DMMU
  85. stxa %g2, [%o3] ASI_DTLB_DATA_ACCESS
  86. membar #Sync
  87. cmp %g3, 0
  88. bne,pn %xcc, copy_page_using_blkcommit
  89.  nop
  90. rdpr %ver, %g3
  91. sllx %g3, 16, %g3
  92. srlx %g3, 32 + 16, %g3
  93. cmp %g3, 0x14
  94. bne,pt %icc, spitfire_copy_user_page
  95.  nop
  96. cheetah_copy_user_page:
  97. sethi %hi((PAGE_SIZE/64)-7), %o2 ! A0 Group
  98. prefetch [%o1 + 0x000], #one_read ! MS
  99. or %o2, %lo((PAGE_SIZE/64)-7), %o2 ! A1 Group
  100. prefetch [%o1 + 0x040], #one_read ! MS
  101. prefetch [%o1 + 0x080], #one_read ! MS Group
  102. prefetch [%o1 + 0x0c0], #one_read ! MS Group
  103. ldd [%o1 + 0x000], %f0 ! MS Group
  104. prefetch [%o1 + 0x100], #one_read ! MS Group
  105. ldd [%o1 + 0x008], %f2 ! AX
  106. prefetch [%o1 + 0x140], #one_read ! MS Group
  107. ldd [%o1 + 0x010], %f4 ! AX
  108. prefetch [%o1 + 0x180], #one_read ! MS Group
  109. fmovd %f0, %f32 ! FGA Group
  110. ldd [%o1 + 0x018], %f6 ! AX
  111. fmovd %f2, %f34 ! FGA Group
  112. ldd [%o1 + 0x020], %f8 ! MS
  113. fmovd %f4, %f36 ! FGA Group
  114. ldd [%o1 + 0x028], %f10 ! AX
  115. membar #StoreStore ! MS
  116. fmovd %f6, %f38 ! FGA Group
  117. ldd [%o1 + 0x030], %f12 ! MS
  118. fmovd %f8, %f40 ! FGA Group
  119. ldd [%o1 + 0x038], %f14 ! AX
  120. fmovd %f10, %f42 ! FGA Group
  121. ldd [%o1 + 0x040], %f16 ! MS
  122. 1: ldd [%o1 + 0x048], %f2 ! AX (Group)
  123. fmovd %f12, %f44 ! FGA
  124. ldd [%o1 + 0x050], %f4 ! MS
  125. fmovd %f14, %f46 ! FGA Group
  126. stda %f32, [%o0] ASI_BLK_P ! MS
  127. ldd [%o1 + 0x058], %f6 ! AX
  128. fmovd %f16, %f32 ! FGA Group (8-cycle stall)
  129. ldd [%o1 + 0x060], %f8 ! MS
  130. fmovd %f2, %f34 ! FGA Group
  131. ldd [%o1 + 0x068], %f10 ! AX
  132. fmovd %f4, %f36 ! FGA Group
  133. ldd [%o1 + 0x070], %f12 ! MS
  134. fmovd %f6, %f38 ! FGA Group
  135. ldd [%o1 + 0x078], %f14 ! AX
  136. fmovd %f8, %f40 ! FGA Group
  137. ldd [%o1 + 0x080], %f16 ! AX
  138. prefetch [%o1 + 0x180], #one_read ! MS
  139. fmovd %f10, %f42 ! FGA Group
  140. subcc %o2, 1, %o2 ! A0
  141. add %o0, 0x40, %o0 ! A1
  142. bne,pt %xcc, 1b ! BR
  143.  add %o1, 0x40, %o1 ! A0 Group
  144. mov 5, %o2 ! A0 Group
  145. 1: ldd [%o1 + 0x048], %f2 ! AX
  146. fmovd %f12, %f44 ! FGA
  147. ldd [%o1 + 0x050], %f4 ! MS
  148. fmovd %f14, %f46 ! FGA Group
  149. stda %f32, [%o0] ASI_BLK_P ! MS
  150. ldd [%o1 + 0x058], %f6 ! AX
  151. fmovd %f16, %f32 ! FGA Group (8-cycle stall)
  152. ldd [%o1 + 0x060], %f8 ! MS
  153. fmovd %f2, %f34 ! FGA Group
  154. ldd [%o1 + 0x068], %f10 ! AX
  155. fmovd %f4, %f36 ! FGA Group
  156. ldd [%o1 + 0x070], %f12 ! MS
  157. fmovd %f6, %f38 ! FGA Group
  158. ldd [%o1 + 0x078], %f14 ! AX
  159. fmovd %f8, %f40 ! FGA Group
  160. ldd [%o1 + 0x080], %f16 ! MS
  161. fmovd %f10, %f42 ! FGA Group
  162. subcc %o2, 1, %o2 ! A0
  163. add %o0, 0x40, %o0 ! A1
  164. bne,pt %xcc, 1b ! BR
  165.  add %o1, 0x40, %o1 ! A0 Group
  166. ldd [%o1 + 0x048], %f2 ! AX
  167. fmovd %f12, %f44 ! FGA
  168. ldd [%o1 + 0x050], %f4 ! MS
  169. fmovd %f14, %f46 ! FGA Group
  170. stda %f32, [%o0] ASI_BLK_P ! MS
  171. ldd [%o1 + 0x058], %f6 ! AX
  172. fmovd %f16, %f32 ! FGA Group (8-cycle stall)
  173. ldd [%o1 + 0x060], %f8 ! MS
  174. fmovd %f2, %f34 ! FGA Group
  175. ldd [%o1 + 0x068], %f10 ! AX
  176. fmovd %f4, %f36 ! FGA Group
  177. ldd [%o1 + 0x070], %f12 ! MS
  178. fmovd %f6, %f38 ! FGA Group
  179. add %o0, 0x40, %o0 ! A0
  180. ldd [%o1 + 0x078], %f14 ! AX
  181. fmovd %f8, %f40 ! FGA Group
  182. fmovd %f10, %f42 ! FGA Group
  183. fmovd %f12, %f44 ! FGA Group
  184. fmovd %f14, %f46 ! FGA Group
  185. stda %f32, [%o0] ASI_BLK_P ! MS
  186. ba,a,pt %xcc, copy_user_page_continue
  187. spitfire_copy_user_page:
  188. ldda [%o1] ASI_BLK_P, %f0
  189. add %o1, 0x40, %o1
  190. ldda [%o1] ASI_BLK_P, %f16
  191. add %o1, 0x40, %o1
  192. sethi %hi(PAGE_SIZE), %o2
  193. 1: TOUCH(f0, f2, f4, f6, f8, f10, f12, f14)
  194. ldda [%o1] ASI_BLK_P, %f32
  195. stda %f48, [%o0] ASI_BLK_P
  196. add %o1, 0x40, %o1
  197. sub %o2, 0x40, %o2
  198. add %o0, 0x40, %o0
  199. TOUCH(f16, f18, f20, f22, f24, f26, f28, f30)
  200. ldda [%o1] ASI_BLK_P, %f0
  201. stda %f48, [%o0] ASI_BLK_P
  202. add %o1, 0x40, %o1
  203. sub %o2, 0x40, %o2
  204. add %o0, 0x40, %o0
  205. TOUCH(f32, f34, f36, f38, f40, f42, f44, f46)
  206. ldda [%o1] ASI_BLK_P, %f16
  207. stda %f48, [%o0] ASI_BLK_P
  208. sub %o2, 0x40, %o2
  209. add %o1, 0x40, %o1
  210. cmp %o2, PAGE_SIZE_REM
  211. bne,pt %xcc, 1b
  212.  add %o0, 0x40, %o0
  213. #if (PAGE_SHIFT == 16) || (PAGE_SHIFT == 22)
  214. TOUCH(f0, f2, f4, f6, f8, f10, f12, f14)
  215. ldda [%o1] ASI_BLK_P, %f32
  216. stda %f48, [%o0] ASI_BLK_P
  217. add %o1, 0x40, %o1
  218. sub %o2, 0x40, %o2
  219. add %o0, 0x40, %o0
  220. TOUCH(f16, f18, f20, f22, f24, f26, f28, f30)
  221. ldda [%o1] ASI_BLK_P, %f0
  222. stda %f48, [%o0] ASI_BLK_P
  223. add %o1, 0x40, %o1
  224. sub %o2, 0x40, %o2
  225. add %o0, 0x40, %o0
  226. membar #Sync
  227. stda %f32, [%o0] ASI_BLK_P
  228. add %o0, 0x40, %o0
  229. stda %f0, [%o0] ASI_BLK_P
  230. #else
  231. membar #Sync
  232. stda %f0, [%o0] ASI_BLK_P
  233. add %o0, 0x40, %o0
  234. stda %f16, [%o0] ASI_BLK_P
  235. #endif
  236. copy_user_page_continue:
  237. membar #Sync
  238. VISExit
  239. mov TLB_TAG_ACCESS, %o2
  240. stxa %g5, [%o2] ASI_DMMU
  241. stxa %g7, [%o3] ASI_DTLB_DATA_ACCESS
  242. membar #Sync
  243. sub %o3, (TLBTEMP_ENTSZ), %o3
  244. stxa %o4, [%o2] ASI_DMMU
  245. stxa %o5, [%o3] ASI_DTLB_DATA_ACCESS
  246. membar #Sync
  247. rdpr %pstate, %g3
  248. jmpl %o7 + 0x8, %g0
  249.  wrpr %g3, PSTATE_IE, %pstate
  250. copy_page_using_blkcommit:
  251. membar #LoadStore | #StoreStore | #StoreLoad
  252. ldda [%o1] ASI_BLK_P, %f0
  253. add %o1, 0x40, %o1
  254. ldda [%o1] ASI_BLK_P, %f16
  255. add %o1, 0x40, %o1
  256. sethi %hi(PAGE_SIZE), %o2
  257. 1: TOUCH(f0, f2, f4, f6, f8, f10, f12, f14)
  258. ldda [%o1] ASI_BLK_P, %f32
  259. stda %f48, [%o0] ASI_BLK_COMMIT_P
  260. add %o1, 0x40, %o1
  261. sub %o2, 0x40, %o2
  262. add %o0, 0x40, %o0
  263. TOUCH(f16, f18, f20, f22, f24, f26, f28, f30)
  264. ldda [%o1] ASI_BLK_P, %f0
  265. stda %f48, [%o0] ASI_BLK_COMMIT_P
  266. add %o1, 0x40, %o1
  267. sub %o2, 0x40, %o2
  268. add %o0, 0x40, %o0
  269. TOUCH(f32, f34, f36, f38, f40, f42, f44, f46)
  270. ldda [%o1] ASI_BLK_P, %f16
  271. stda %f48, [%o0] ASI_BLK_COMMIT_P
  272. sub %o2, 0x40, %o2
  273. add %o1, 0x40, %o1
  274. cmp %o2, PAGE_SIZE_REM
  275. bne,pt %xcc, 1b
  276.  add %o0, 0x40, %o0
  277. #if (PAGE_SHIFT == 16) || (PAGE_SHIFT == 22)
  278. TOUCH(f0, f2, f4, f6, f8, f10, f12, f14)
  279. ldda [%o1] ASI_BLK_P, %f32
  280. stda %f48, [%o0] ASI_BLK_COMMIT_P
  281. add %o1, 0x40, %o1
  282. sub %o2, 0x40, %o2
  283. add %o0, 0x40, %o0
  284. TOUCH(f16, f18, f20, f22, f24, f26, f28, f30)
  285. ldda [%o1] ASI_BLK_P, %f0
  286. stda %f48, [%o0] ASI_BLK_COMMIT_P
  287. add %o1, 0x40, %o1
  288. sub %o2, 0x40, %o2
  289. add %o0, 0x40, %o0
  290. membar #Sync
  291. stda %f32, [%o0] ASI_BLK_COMMIT_P
  292. add %o0, 0x40, %o0
  293. ba,pt %xcc, copy_user_page_continue
  294.  stda %f0, [%o0] ASI_BLK_COMMIT_P
  295. #else
  296. membar #Sync
  297. stda %f0, [%o0] ASI_BLK_COMMIT_P
  298. add %o0, 0x40, %o0
  299. ba,pt %xcc, copy_user_page_continue
  300.  stda %f16, [%o0] ASI_BLK_COMMIT_P
  301. #endif
  302. .align 32
  303. .globl _clear_page
  304. .type _clear_page,@function
  305. _clear_page: /* %o0=dest */
  306. VISEntryHalf
  307. ba,pt %xcc, clear_page_common
  308.  clr %o4
  309. .align 32
  310. .globl clear_user_page
  311. .type clear_user_page,@function
  312. clear_user_page: /* %o0=dest, %o1=vaddr */
  313. VISEntryHalf
  314. sethi %hi(PAGE_SIZE), %g3
  315. sub %o0, %g4, %g1
  316. and %o1, %g3, %o0
  317. mov TLB_TAG_ACCESS, %o2
  318. sethi %uhi(_PAGE_VALID | _PAGE_SZBITS), %g3
  319. sethi %hi(TLBTEMP_BASE), %o3
  320. sllx %g3, 32, %g3
  321. or %g3, (_PAGE_CP | _PAGE_CV | _PAGE_P | _PAGE_L | _PAGE_W), %g3
  322. or %g1, %g3, %g1
  323. add %o0, %o3, %o0
  324. #define FIX_INSN_2 0x96102068 /* mov (13 << 3), %o3 */
  325. cheetah_patch_2:
  326. mov TLBTEMP_ENT2, %o3
  327. rdpr %pstate, %g3
  328. wrpr %g3, PSTATE_IE, %pstate
  329. /* Spitfire Errata #32 workaround */
  330. mov 0x8, %g5
  331. stxa %g0, [%g5] ASI_DMMU
  332. membar #Sync
  333. ldxa [%o3] ASI_DTLB_TAG_READ, %g5
  334. /* Spitfire Errata #32 workaround */
  335. mov 0x8, %g7
  336. stxa %g0, [%g7] ASI_DMMU
  337. membar #Sync
  338. ldxa [%o3] ASI_DTLB_DATA_ACCESS, %g0
  339. ldxa [%o3] ASI_DTLB_DATA_ACCESS, %g7
  340. stxa %o0, [%o2] ASI_DMMU
  341. stxa %g1, [%o3] ASI_DTLB_DATA_ACCESS
  342. membar #Sync
  343. mov 1, %o4
  344. clear_page_common:
  345. membar #StoreLoad | #StoreStore | #LoadStore ! LSU Group
  346. fzero %f0 ! FPA Group
  347. sethi %hi(PAGE_SIZE/256), %o1 ! IEU0
  348. fzero %f2 ! FPA Group
  349. or %o1, %lo(PAGE_SIZE/256), %o1 ! IEU0
  350. faddd %f0, %f2, %f4 ! FPA Group
  351. fmuld %f0, %f2, %f6 ! FPM
  352. faddd %f0, %f2, %f8 ! FPA Group
  353. fmuld %f0, %f2, %f10 ! FPM
  354. faddd %f0, %f2, %f12 ! FPA Group
  355. fmuld %f0, %f2, %f14 ! FPM
  356. 1: stda %f0, [%o0 + %g0] ASI_BLK_P ! Store Group
  357. add %o0, 0x40, %o0 ! IEU0
  358. stda %f0, [%o0 + %g0] ASI_BLK_P ! Store Group
  359. add %o0, 0x40, %o0 ! IEU0
  360. stda %f0, [%o0 + %g0] ASI_BLK_P ! Store Group
  361. add %o0, 0x40, %o0 ! IEU0 Group
  362. stda %f0, [%o0 + %g0] ASI_BLK_P ! Store Group
  363. subcc %o1, 1, %o1 ! IEU1
  364. bne,pt %icc, 1b ! CTI
  365.  add %o0, 0x40, %o0 ! IEU0 Group
  366. membar #Sync ! LSU Group
  367. VISExitHalf
  368. brnz,pt %o4, 1f
  369.  nop
  370. retl
  371.  nop
  372. 1: stxa %g5, [%o2] ASI_DMMU
  373. stxa %g7, [%o3] ASI_DTLB_DATA_ACCESS
  374. membar #Sync
  375. jmpl %o7 + 0x8, %g0
  376.  wrpr %g3, 0x0, %pstate
  377. .globl cheetah_patch_pgcopyops
  378. cheetah_patch_pgcopyops:
  379. sethi %hi(FIX_INSN_1), %g1
  380. or %g1, %lo(FIX_INSN_1), %g1
  381. sethi %hi(cheetah_patch_1), %g2
  382. or %g2, %lo(cheetah_patch_1), %g2
  383. stw %g1, [%g2]
  384. flush %g2
  385. sethi %hi(FIX_INSN_2), %g1
  386. or %g1, %lo(FIX_INSN_2), %g1
  387. sethi %hi(cheetah_patch_2), %g2
  388. or %g2, %lo(cheetah_patch_2), %g2
  389. stw %g1, [%g2]
  390. flush %g2
  391. retl
  392.  nop
  393. #undef FIX_INSN1
  394. #undef FIX_INSN2
  395. #undef PAGE_SIZE_REM