cp15_asm.S
上传用户:jnhtjd
上传日期:2022-07-16
资源大小:403k
文件大小:6k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /* ----------------------------------------------------------------------------
  2.  *         ATMEL Microcontroller Software Support 
  3.  * ----------------------------------------------------------------------------
  4.  * Copyright (c) 2008, Atmel Corporation
  5.  *
  6.  * All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions are met:
  10.  *
  11.  * - Redistributions of source code must retain the above copyright notice,
  12.  * this list of conditions and the disclaimer below.
  13.  *
  14.  * Atmel's name may not be used to endorse or promote products derived from
  15.  * this software without specific prior written permission.
  16.  *
  17.  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  19.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  20.  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  22.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  23.  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  24.  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  25.  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  26.  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  * ----------------------------------------------------------------------------
  28.  */
  29. //------------------------------------------------------------------------------
  30. //         Headers
  31. //------------------------------------------------------------------------------
  32. #define __ASSEMBLY__
  33. #include "board.h"
  34. #ifdef CP15_PRESENT
  35. //------------------------------------------------------------------------------
  36. /// Functions to access CP15 coprocessor register
  37. //------------------------------------------------------------------------------
  38.         .global _readControlRegister
  39.         .global _writeControlRegister
  40.         .global _waitForInterrupt
  41.         .global _writeTTB
  42.         .global _writeDomain
  43.         .global _writeITLBLockdown
  44.         .global _prefetchICacheLine
  45. //------------------------------------------------------------------------------
  46. /// Control Register c1
  47. /// Register c1 is the Control Register for the ARM926EJ-S processor. 
  48. /// This register specifies the configuration used to enable and disable the 
  49. /// caches and MMU. It is recommended that you access this register using a 
  50. /// read-modify-write sequence.
  51. //------------------------------------------------------------------------------
  52. // CP15 Read Control Register
  53. _readControlRegister:
  54.         mov     r0, #0
  55.         mrc     p15, 0, r0, c1, c0, 0
  56.         bx      lr
  57. // CP15 Write Control Register
  58. _writeControlRegister:
  59.         mcr     p15, 0, r0, c1, c0, 0
  60.         bx      lr
  61. //------------------------------------------------------------------------------
  62. /// CP15 Wait For Interrupt operation
  63. /// The purpose of the Wait For Interrupt operation is to put the processor in
  64. /// to a low power state.
  65. /// This puts the processor into a low-power state and stops it executing more
  66. /// instructions until an interrupt, or debug request occurs, regardless of
  67. /// whether the interrupts are disabled by the masks in the CPSR. 
  68. /// When an interrupt does occur, the MCR instruction completes and the IRQ or
  69. /// FIQ handler is entered as normal. The return link in r14_irq or r14_fiq 
  70. /// contains the address of the MCR instruction plus 8, so that the normal 
  71. /// instruction used for interrupt return (SUBS PC,R14,#4) returns to the 
  72. /// instruction following the MCR.
  73. /// Wait For Interrupt : MCR p15, 0, <Rd>, c7, c0, 4
  74. //------------------------------------------------------------------------------
  75. _waitForInterrupt:
  76.         mov     r0, #0
  77.         mcr     p15, 0, r0, c7, c0, 4
  78.         bx      lr
  79. //------------------------------------------------------------------------------
  80. /// CP15 Translation Table Base Register c2
  81. /// Register c2 is the Translation Table Base Register (TTBR), for the base 
  82. /// address of the first-level translation table.
  83. /// Reading from c2 returns the pointer to the currently active first-level
  84. /// translation table in bits [31:14] and an Unpredictable value in bits [13:0]. 
  85. /// Writing to register c2 updates the pointer to the first-level translation 
  86. /// table from the value in bits [31:14] of the written value. Bits [13:0] 
  87. /// Should Be Zero.
  88. /// You can use the following instructions to access the TTBR:
  89. /// Read TTBR  : MRC p15, 0, <Rd>, c2, c0, 0
  90. /// Write TTBR : MCR p15, 0, <Rd>, c2, c0, 0
  91. //------------------------------------------------------------------------------
  92. _writeTTB:
  93.         MCR     p15, 0, r0, c2, c0, 0
  94.         bx      lr
  95. //------------------------------------------------------------------------------
  96. /// Domain Access Control Register c3
  97. /// Read domain access permissions  : MRC p15, 0, <Rd>, c3, c0, 0
  98. /// Write domain access permissions : MCR p15, 0, <Rd>, c3, c0, 0
  99. //------------------------------------------------------------------------------
  100. _writeDomain:
  101.         MCR     p15, 0, r0, c3, c0, 0
  102.         bx      lr
  103. //------------------------------------------------------------------------------
  104. /// TLB Lockdown Register c10
  105. /// The TLB Lockdown Register controls where hardware page table walks place the
  106. /// TLB entry, in the set associative region or the lockdown region of the TLB, 
  107. /// and if in the lockdown region, which entry is written. The lockdown region 
  108. /// of the TLB contains eight entries. See TLB structure for a description of 
  109. /// the structure of the TLB.
  110. /// Read data TLB lockdown victim  : MRC p15,0,<Rd>,c10,c0,0
  111. /// Write data TLB lockdown victim : MCR p15,0,<Rd>,c10,c0,0
  112. //------------------------------------------------------------------------------
  113. _writeITLBLockdown:
  114.         MCR     p15, 0, r0, c10, c0, 0
  115.         bx      lr
  116. //------------------------------------------------------------------------------
  117. /// Prefetch ICache line
  118. /// Performs an ICache lookup of the specified modified virtual address.
  119. /// If the cache misses, and the region is cacheable, a linefill is performed.
  120. /// Prefetch ICache line (MVA): MCR p15, 0, <Rd>, c7, c13, 1
  121. //------------------------------------------------------------------------------
  122. _prefetchICacheLine:
  123.         MCR     p15, 0, r0, c7, c13, 1
  124.         bx      lr
  125. #endif