cp15_iar.s 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2015-04-06 zchong change to iar compiler from convert from cp15_gcc.S
  9. */
  10. SECTION .text:CODE:NOROOT(2)
  11. ARM
  12. EXPORT rt_cpu_vector_set_base
  13. rt_cpu_vector_set_base:
  14. MCR p15, #0, r0, c12, c0, #0
  15. DSB
  16. BX lr
  17. EXPORT rt_cpu_vector_get_base
  18. rt_cpu_vector_get_base:
  19. MRC p15, #0, r0, c12, c0, #0
  20. BX lr
  21. EXPORT rt_cpu_get_sctlr
  22. rt_cpu_get_sctlr:
  23. MRC p15, #0, r0, c1, c0, #0
  24. BX lr
  25. EXPORT rt_cpu_dcache_enable
  26. rt_cpu_dcache_enable:
  27. MRC p15, #0, r0, c1, c0, #0
  28. ORR r0, r0, #0x00000004
  29. MCR p15, #0, r0, c1, c0, #0
  30. BX lr
  31. EXPORT rt_cpu_icache_enable
  32. rt_cpu_icache_enable:
  33. MRC p15, #0, r0, c1, c0, #0
  34. ORR r0, r0, #0x00001000
  35. MCR p15, #0, r0, c1, c0, #0
  36. BX lr
  37. ;_FLD_MAX_WAY DEFINE 0x3ff
  38. ;_FLD_MAX_IDX DEFINE 0x7ff
  39. EXPORT rt_cpu_dcache_clean_flush
  40. rt_cpu_dcache_clean_flush:
  41. PUSH {r4-r11}
  42. DMB
  43. MRC p15, #1, r0, c0, c0, #1 ; read clid register
  44. ANDS r3, r0, #0x7000000 ; get level of coherency
  45. MOV r3, r3, lsr #23
  46. BEQ finished
  47. MOV r10, #0
  48. loop1:
  49. ADD r2, r10, r10, lsr #1
  50. MOV r1, r0, lsr r2
  51. AND r1, r1, #7
  52. CMP r1, #2
  53. BLT skip
  54. MCR p15, #2, r10, c0, c0, #0
  55. ISB
  56. MRC p15, #1, r1, c0, c0, #0
  57. AND r2, r1, #7
  58. ADD r2, r2, #4
  59. ;LDR r4, _FLD_MAX_WAY
  60. LDR r4, =0x3FF
  61. ANDS r4, r4, r1, lsr #3
  62. CLZ r5, r4
  63. ;LDR r7, _FLD_MAX_IDX
  64. LDR r7, =0x7FF
  65. ANDS r7, r7, r1, lsr #13
  66. loop2:
  67. MOV r9, r4
  68. loop3:
  69. ORR r11, r10, r9, lsl r5
  70. ORR r11, r11, r7, lsl r2
  71. MCR p15, #0, r11, c7, c14, #2
  72. SUBS r9, r9, #1
  73. BGE loop3
  74. SUBS r7, r7, #1
  75. BGE loop2
  76. skip:
  77. ADD r10, r10, #2
  78. CMP r3, r10
  79. BGT loop1
  80. finished:
  81. DSB
  82. ISB
  83. POP {r4-r11}
  84. BX lr
  85. EXPORT rt_cpu_dcache_disable
  86. rt_cpu_dcache_disable:
  87. PUSH {r4-r11, lr}
  88. MRC p15, #0, r0, c1, c0, #0
  89. BIC r0, r0, #0x00000004
  90. MCR p15, #0, r0, c1, c0, #0
  91. BL rt_cpu_dcache_clean_flush
  92. POP {r4-r11, lr}
  93. BX lr
  94. EXPORT rt_cpu_icache_disable
  95. rt_cpu_icache_disable:
  96. MRC p15, #0, r0, c1, c0, #0
  97. BIC r0, r0, #0x00001000
  98. MCR p15, #0, r0, c1, c0, #0
  99. BX lr
  100. EXPORT rt_cpu_mmu_disable
  101. rt_cpu_mmu_disable:
  102. MCR p15, #0, r0, c8, c7, #0 ; invalidate tlb
  103. MRC p15, #0, r0, c1, c0, #0
  104. BIC r0, r0, #1
  105. MCR p15, #0, r0, c1, c0, #0 ; clear mmu bit
  106. DSB
  107. BX lr
  108. EXPORT rt_cpu_mmu_enable
  109. rt_cpu_mmu_enable:
  110. MRC p15, #0, r0, c1, c0, #0
  111. ORR r0, r0, #0x001
  112. MCR p15, #0, r0, c1, c0, #0 ; set mmu enable bit
  113. DSB
  114. BX lr
  115. EXPORT rt_cpu_tlb_set
  116. rt_cpu_tlb_set:
  117. MCR p15, #0, r0, c2, c0, #0
  118. DMB
  119. BX lr
  120. END