cp15_gcc.S 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /*
  2. * File : cp15_gcc.S
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2013, RT-Thread Development Team
  5. * http://www.rt-thread.org
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License along
  18. * with this program; if not, write to the Free Software Foundation, Inc.,
  19. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  20. *
  21. * Change Logs:
  22. * Date Author Notes
  23. * 2013-07-05 Bernard the first version
  24. */
  25. .globl rt_cpu_vector_set_base
  26. rt_cpu_vector_set_base:
  27. mcr p15, #0, r0, c12, c0, #0
  28. dsb
  29. bx lr
  30. .globl rt_cpu_vector_get_base
  31. rt_cpu_vector_get_base:
  32. mrc p15, #0, r0, c12, c0, #0
  33. bx lr
  34. .globl rt_cpu_get_sctlr
  35. rt_cpu_get_sctlr:
  36. mrc p15, #0, r0, c1, c0, #0
  37. bx lr
  38. .globl rt_cpu_dcache_enable
  39. rt_cpu_dcache_enable:
  40. mrc p15, #0, r0, c1, c0, #0
  41. orr r0, r0, #0x00000004
  42. mcr p15, #0, r0, c1, c0, #0
  43. bx lr
  44. .globl rt_cpu_icache_enable
  45. rt_cpu_icache_enable:
  46. mrc p15, #0, r0, c1, c0, #0
  47. orr r0, r0, #0x00001000
  48. mcr p15, #0, r0, c1, c0, #0
  49. bx lr
  50. _FLD_MAX_WAY:
  51. .word 0x3ff
  52. _FLD_MAX_IDX:
  53. .word 0x7ff
  54. .globl rt_cpu_dcache_clean_flush
  55. rt_cpu_dcache_clean_flush:
  56. push {r4-r11}
  57. dmb
  58. mrc p15, #1, r0, c0, c0, #1 @ read clid register
  59. ands r3, r0, #0x7000000 @ get level of coherency
  60. mov r3, r3, lsr #23
  61. beq finished
  62. mov r10, #0
  63. loop1:
  64. add r2, r10, r10, lsr #1
  65. mov r1, r0, lsr r2
  66. and r1, r1, #7
  67. cmp r1, #2
  68. blt skip
  69. mcr p15, #2, r10, c0, c0, #0
  70. isb
  71. mrc p15, #1, r1, c0, c0, #0
  72. and r2, r1, #7
  73. add r2, r2, #4
  74. ldr r4, _FLD_MAX_WAY
  75. ands r4, r4, r1, lsr #3
  76. clz r5, r4
  77. ldr r7, _FLD_MAX_IDX
  78. ands r7, r7, r1, lsr #13
  79. loop2:
  80. mov r9, r4
  81. loop3:
  82. orr r11, r10, r9, lsl r5
  83. orr r11, r11, r7, lsl r2
  84. mcr p15, #0, r11, c7, c14, #2
  85. subs r9, r9, #1
  86. bge loop3
  87. subs r7, r7, #1
  88. bge loop2
  89. skip:
  90. add r10, r10, #2
  91. cmp r3, r10
  92. bgt loop1
  93. finished:
  94. dsb
  95. isb
  96. pop {r4-r11}
  97. bx lr
  98. .globl rt_cpu_dcache_disable
  99. rt_cpu_dcache_disable:
  100. push {r4-r11, lr}
  101. mrc p15, #0, r0, c1, c0, #0
  102. bic r0, r0, #0x00000004
  103. mcr p15, #0, r0, c1, c0, #0
  104. bl rt_cpu_dcache_clean_flush
  105. pop {r4-r11, lr}
  106. bx lr
  107. .globl rt_cpu_icache_disable
  108. rt_cpu_icache_disable:
  109. mrc p15, #0, r0, c1, c0, #0
  110. bic r0, r0, #0x00001000
  111. mcr p15, #0, r0, c1, c0, #0
  112. bx lr
  113. .globl rt_cpu_mmu_disable
  114. rt_cpu_mmu_disable:
  115. mcr p15, #0, r0, c8, c7, #0 @ invalidate tlb
  116. mrc p15, #0, r0, c1, c0, #0
  117. bic r0, r0, #1
  118. mcr p15, #0, r0, c1, c0, #0 @ clear mmu bit
  119. dsb
  120. bx lr
  121. .globl rt_cpu_mmu_enable
  122. rt_cpu_mmu_enable:
  123. mrc p15, #0, r0, c1, c0, #0
  124. orr r0, r0, #0x001
  125. mcr p15, #0, r0, c1, c0, #0 @ set mmu enable bit
  126. dsb
  127. bx lr
  128. .globl rt_cpu_tlb_set
  129. rt_cpu_tlb_set:
  130. mcr p15, #0, r0, c2, c0, #0
  131. dmb
  132. bx lr