swift.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:5k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: swift.S,v 1.7 2000/07/16 21:48:52 anton Exp $
  2.  * swift.S: MicroSparc-II mmu/cache operations.
  3.  *
  4.  * Copyright (C) 1999 David S. Miller (davem@redhat.com)
  5.  */
  6. #include <linux/config.h>
  7. #include <asm/psr.h>
  8. #include <asm/asi.h>
  9. #include <asm/page.h>
  10. #include <asm/pgtsrmmu.h>
  11. #include <asm/asm_offsets.h>
  12. .text
  13. .align 4
  14. #if 1 /* XXX screw this, I can't get the VAC flushes working
  15.  * XXX reliably... -DaveM
  16.  */
  17. .globl swift_flush_cache_all, swift_flush_cache_mm
  18. .globl swift_flush_cache_range, swift_flush_cache_page
  19. .globl swift_flush_page_for_dma
  20. .globl swift_flush_page_to_ram
  21. swift_flush_cache_all:
  22. swift_flush_cache_mm:
  23. swift_flush_cache_range:
  24. swift_flush_cache_page:
  25. swift_flush_page_for_dma:
  26. swift_flush_page_to_ram:
  27. sethi %hi(0x2000), %o0
  28. 1: subcc %o0, 0x10, %o0
  29. add %o0, %o0, %o1
  30. sta %g0, [%o0] ASI_M_DATAC_TAG
  31. bne 1b
  32.  sta %g0, [%o1] ASI_M_TXTC_TAG
  33. retl
  34.  nop
  35. #else
  36. .globl swift_flush_cache_all
  37. swift_flush_cache_all:
  38. WINDOW_FLUSH(%g4, %g5)
  39. /* Just clear out all the tags. */
  40. sethi %hi(16 * 1024), %o0
  41. 1: subcc %o0, 16, %o0
  42. sta %g0, [%o0] ASI_M_TXTC_TAG
  43. bne 1b
  44.  sta %g0, [%o0] ASI_M_DATAC_TAG
  45. retl
  46.  nop
  47. .globl swift_flush_cache_mm
  48. swift_flush_cache_mm:
  49. ld [%o0 + AOFF_mm_context], %g2
  50. cmp %g2, -1
  51. be swift_flush_cache_mm_out
  52. WINDOW_FLUSH(%g4, %g5)
  53. rd %psr, %g1
  54. andn %g1, PSR_ET, %g3
  55. wr %g3, 0x0, %psr
  56. nop
  57. nop
  58. mov SRMMU_CTX_REG, %g7
  59. lda [%g7] ASI_M_MMUREGS, %g5
  60. sta %g2, [%g7] ASI_M_MMUREGS
  61. #if 1
  62. sethi %hi(0x2000), %o0
  63. 1: subcc %o0, 0x10, %o0
  64. sta %g0, [%o0] ASI_M_FLUSH_CTX
  65. bne 1b
  66.  nop
  67. #else
  68. clr %o0
  69. or %g0, 2048, %g7
  70. or %g0, 2048, %o1
  71. add %o1, 2048, %o2
  72. add %o2, 2048, %o3
  73. mov 16, %o4
  74. add %o4, 2048, %o5
  75. add %o5, 2048, %g2
  76. add %g2, 2048, %g3
  77. 1: sta %g0, [%o0      ] ASI_M_FLUSH_CTX
  78. sta %g0, [%o0 + %o1] ASI_M_FLUSH_CTX
  79. sta %g0, [%o0 + %o2] ASI_M_FLUSH_CTX
  80. sta %g0, [%o0 + %o3] ASI_M_FLUSH_CTX
  81. sta %g0, [%o0 + %o4] ASI_M_FLUSH_CTX
  82. sta %g0, [%o0 + %o5] ASI_M_FLUSH_CTX
  83. sta %g0, [%o0 + %g2] ASI_M_FLUSH_CTX
  84. sta %g0, [%o0 + %g3] ASI_M_FLUSH_CTX
  85. subcc %g7, 32, %g7
  86. bne 1b
  87.  add %o0, 32, %o0
  88. #endif
  89. mov SRMMU_CTX_REG, %g7
  90. sta %g5, [%g7] ASI_M_MMUREGS
  91. wr %g1, 0x0, %psr
  92. nop
  93. nop
  94. swift_flush_cache_mm_out:
  95. retl
  96.  nop
  97. .globl swift_flush_cache_range
  98. swift_flush_cache_range:
  99. sub %o2, %o1, %o2
  100. sethi %hi(4096), %o3
  101. cmp %o2, %o3
  102. bgu swift_flush_cache_mm
  103.  nop
  104. b 70f
  105.  nop
  106. .globl swift_flush_cache_page
  107. swift_flush_cache_page:
  108. ld [%o0 + 0x0], %o0 /* XXX vma->vm_mm, GROSS XXX */
  109. 70:
  110. ld [%o0 + AOFF_mm_context], %g2
  111. cmp %g2, -1
  112. be swift_flush_cache_page_out
  113. WINDOW_FLUSH(%g4, %g5)
  114. rd %psr, %g1
  115. andn %g1, PSR_ET, %g3
  116. wr %g3, 0x0, %psr
  117. nop
  118. nop
  119. mov SRMMU_CTX_REG, %g7
  120. lda [%g7] ASI_M_MMUREGS, %g5
  121. sta %g2, [%g7] ASI_M_MMUREGS
  122. andn %o1, (PAGE_SIZE - 1), %o1
  123. #if 1
  124. sethi %hi(0x1000), %o0
  125. 1: subcc %o0, 0x10, %o0
  126. sta %g0, [%o1 + %o0] ASI_M_FLUSH_PAGE
  127. bne 1b
  128.  nop
  129. #else
  130. or %g0, 512, %g7
  131. or %g0, 512, %o0
  132. add %o0, 512, %o2
  133. add %o2, 512, %o3
  134. add %o3, 512, %o4
  135. add %o4, 512, %o5
  136. add %o5, 512, %g3
  137. add %g3, 512, %g4
  138. 1: sta %g0, [%o1      ] ASI_M_FLUSH_PAGE
  139. sta %g0, [%o1 + %o0] ASI_M_FLUSH_PAGE
  140. sta %g0, [%o1 + %o2] ASI_M_FLUSH_PAGE
  141. sta %g0, [%o1 + %o3] ASI_M_FLUSH_PAGE
  142. sta %g0, [%o1 + %o4] ASI_M_FLUSH_PAGE
  143. sta %g0, [%o1 + %o5] ASI_M_FLUSH_PAGE
  144. sta %g0, [%o1 + %g3] ASI_M_FLUSH_PAGE
  145. sta %g0, [%o1 + %g4] ASI_M_FLUSH_PAGE
  146. subcc %g7, 16, %g7
  147. bne 1b
  148.  add %o1, 16, %o1
  149. #endif
  150. mov SRMMU_CTX_REG, %g7
  151. sta %g5, [%g7] ASI_M_MMUREGS
  152. wr %g1, 0x0, %psr
  153. nop
  154. nop
  155. swift_flush_cache_page_out:
  156. retl
  157.  nop
  158. /* Swift is write-thru, however it is not
  159.  * I/O nor TLB-walk coherent.  Also it has
  160.  * caches which are virtually indexed and tagged.
  161.  */
  162. .globl swift_flush_page_for_dma
  163. .globl swift_flush_page_to_ram
  164. swift_flush_page_for_dma:
  165. swift_flush_page_to_ram:
  166. andn %o0, (PAGE_SIZE - 1), %o1
  167. #if 1
  168. sethi %hi(0x1000), %o0
  169. 1: subcc %o0, 0x10, %o0
  170. sta %g0, [%o1 + %o0] ASI_M_FLUSH_PAGE
  171. bne 1b
  172.  nop
  173. #else
  174. or %g0, 512, %g7
  175. or %g0, 512, %o0
  176. add %o0, 512, %o2
  177. add %o2, 512, %o3
  178. add %o3, 512, %o4
  179. add %o4, 512, %o5
  180. add %o5, 512, %g3
  181. add %g3, 512, %g4
  182. 1: sta %g0, [%o1      ] ASI_M_FLUSH_PAGE
  183. sta %g0, [%o1 + %o0] ASI_M_FLUSH_PAGE
  184. sta %g0, [%o1 + %o2] ASI_M_FLUSH_PAGE
  185. sta %g0, [%o1 + %o3] ASI_M_FLUSH_PAGE
  186. sta %g0, [%o1 + %o4] ASI_M_FLUSH_PAGE
  187. sta %g0, [%o1 + %o5] ASI_M_FLUSH_PAGE
  188. sta %g0, [%o1 + %g3] ASI_M_FLUSH_PAGE
  189. sta %g0, [%o1 + %g4] ASI_M_FLUSH_PAGE
  190. subcc %g7, 16, %g7
  191. bne 1b
  192.  add %o1, 16, %o1
  193. #endif
  194. retl
  195.  nop
  196. #endif
  197. .globl swift_flush_sig_insns
  198. swift_flush_sig_insns:
  199. flush %o1
  200. retl
  201.  flush %o1 + 4
  202. .globl swift_flush_tlb_mm
  203. .globl swift_flush_tlb_range
  204. .globl swift_flush_tlb_all
  205. swift_flush_tlb_mm:
  206. swift_flush_tlb_range:
  207. ld [%o0 + AOFF_mm_context], %g2
  208. cmp %g2, -1
  209. be swift_flush_tlb_all_out
  210. swift_flush_tlb_all:
  211. mov 0x400, %o1
  212. sta %g0, [%o1] ASI_M_FLUSH_PROBE
  213. swift_flush_tlb_all_out:
  214. retl
  215.  nop
  216. .globl swift_flush_tlb_page
  217. swift_flush_tlb_page:
  218. ld [%o0 + 0x00], %o0 /* XXX vma->vm_mm GROSS XXX */
  219. mov SRMMU_CTX_REG, %g1
  220. ld [%o0 + AOFF_mm_context], %o3
  221. andn %o1, (PAGE_SIZE - 1), %o1
  222. cmp %o3, -1
  223. be swift_flush_tlb_page_out
  224.  nop
  225. #if 1
  226. mov 0x400, %o1
  227. sta %g0, [%o1] ASI_M_FLUSH_PROBE
  228. #else
  229. lda [%g1] ASI_M_MMUREGS, %g5
  230. sta %o3, [%g1] ASI_M_MMUREGS
  231. sta %g0, [%o1] ASI_M_FLUSH_PAGE /* rem. virt. cache. prot. */
  232. sta %g0, [%o1] ASI_M_FLUSH_PROBE
  233. sta %g5, [%g1] ASI_M_MMUREGS
  234. #endif
  235. swift_flush_tlb_page_out:
  236. retl
  237.  nop