1 //------------------------------------------------------------------------------
3 // Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
4 // Copyright (c) 2011 - 2014, ARM Limited. All rights reserved.
6 // This program and the accompanying materials
7 // are licensed and made available under the terms and conditions of the BSD License
8 // which accompanies this distribution. The full text of the license may be found at
9 // http://opensource.org/licenses/bsd-license.php
11 // THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 //------------------------------------------------------------------------------
16 EXPORT ArmInvalidateInstructionCache
17 EXPORT ArmInvalidateDataCacheEntryByMVA
18 EXPORT ArmCleanDataCacheEntryByMVA
19 EXPORT ArmCleanInvalidateDataCacheEntryByMVA
20 EXPORT ArmInvalidateDataCacheEntryBySetWay
21 EXPORT ArmCleanDataCacheEntryBySetWay
22 EXPORT ArmCleanInvalidateDataCacheEntryBySetWay
23 EXPORT ArmDrainWriteBuffer
26 EXPORT ArmDisableCachesAndMmu
28 EXPORT ArmEnableDataCache
29 EXPORT ArmDisableDataCache
30 EXPORT ArmEnableInstructionCache
31 EXPORT ArmDisableInstructionCache
32 EXPORT ArmEnableSWPInstruction
33 EXPORT ArmEnableBranchPrediction
34 EXPORT ArmDisableBranchPrediction
35 EXPORT ArmSetLowVectors
36 EXPORT ArmSetHighVectors
37 EXPORT ArmV7AllDataCachesOperation
38 EXPORT ArmDataMemoryBarrier
39 EXPORT ArmDataSynchronizationBarrier
40 EXPORT ArmInstructionSynchronizationBarrier
47 EXPORT ArmReadTpidrurw
48 EXPORT ArmWriteTpidrurw
49 EXPORT ArmIsArchTimerImplemented
53 AREA ArmV7Support, CODE, READONLY
56 DC_ON EQU ( 0x1:SHL:2 )
57 IC_ON EQU ( 0x1:SHL:12 )
58 CTRL_M_BIT EQU (1 << 0)
59 CTRL_C_BIT EQU (1 << 2)
60 CTRL_B_BIT EQU (1 << 7)
61 CTRL_I_BIT EQU (1 << 12)
64 ArmInvalidateDataCacheEntryByMVA
65 mcr p15, 0, r0, c7, c6, 1 ; invalidate single data cache line
68 ArmCleanDataCacheEntryByMVA
69 mcr p15, 0, r0, c7, c10, 1 ; clean single data cache line
73 ArmCleanInvalidateDataCacheEntryByMVA
74 mcr p15, 0, r0, c7, c14, 1 ; clean and invalidate single data cache line
78 ArmInvalidateDataCacheEntryBySetWay
79 mcr p15, 0, r0, c7, c6, 2 ; Invalidate this line
83 ArmCleanInvalidateDataCacheEntryBySetWay
84 mcr p15, 0, r0, c7, c14, 2 ; Clean and Invalidate this line
88 ArmCleanDataCacheEntryBySetWay
89 mcr p15, 0, r0, c7, c10, 2 ; Clean this line
93 ArmInvalidateInstructionCache
94 mcr p15,0,R0,c7,c5,0 ;Invalidate entire instruction cache
99 mrc p15,0,R0,c1,c0,0 ; Read SCTLR into R0 (Read control register configuration data)
100 orr R0,R0,#1 ; Set SCTLR.M bit : Enable MMU
101 mcr p15,0,R0,c1,c0,0 ; Write R0 into SCTLR (Write control register configuration data)
107 mrc p15,0,R0,c1,c0,0 ; Read SCTLR into R0 (Read control register configuration data)
108 bic R0,R0,#1 ; Clear SCTLR.M bit : Disable MMU
109 mcr p15,0,R0,c1,c0,0 ; Write R0 into SCTLR (Write control register configuration data)
111 mcr p15,0,R0,c8,c7,0 ; TLBIALL : Invalidate unified TLB
112 mcr p15,0,R0,c7,c5,6 ; BPIALL : Invalidate entire branch predictor array
117 ArmDisableCachesAndMmu
118 mrc p15, 0, r0, c1, c0, 0 ; Get control register
119 bic r0, r0, #CTRL_M_BIT ; Disable MMU
120 bic r0, r0, #CTRL_C_BIT ; Disable D Cache
121 bic r0, r0, #CTRL_I_BIT ; Disable I Cache
122 mcr p15, 0, r0, c1, c0, 0 ; Write control register
128 mrc p15,0,R0,c1,c0,0 ; Read SCTLR into R0 (Read control register configuration data)
133 ldr R1,=DC_ON ; Specify SCTLR.C bit : (Data) Cache enable bit
134 mrc p15,0,R0,c1,c0,0 ; Read SCTLR into R0 (Read control register configuration data)
135 orr R0,R0,R1 ; Set SCTLR.C bit : Data and unified caches enabled
136 mcr p15,0,R0,c1,c0,0 ; Write R0 into SCTLR (Write control register configuration data)
142 ldr R1,=DC_ON ; Specify SCTLR.C bit : (Data) Cache enable bit
143 mrc p15,0,R0,c1,c0,0 ; Read SCTLR into R0 (Read control register configuration data)
144 bic R0,R0,R1 ; Clear SCTLR.C bit : Data and unified caches disabled
145 mcr p15,0,R0,c1,c0,0 ; Write R0 into SCTLR (Write control register configuration data)
150 ArmEnableInstructionCache
151 ldr R1,=IC_ON ; Specify SCTLR.I bit : Instruction cache enable bit
152 mrc p15,0,R0,c1,c0,0 ; Read SCTLR into R0 (Read control register configuration data)
153 orr R0,R0,R1 ; Set SCTLR.I bit : Instruction caches enabled
154 mcr p15,0,R0,c1,c0,0 ; Write R0 into SCTLR (Write control register configuration data)
159 ArmDisableInstructionCache
160 ldr R1,=IC_ON ; Specify SCTLR.I bit : Instruction cache enable bit
161 mrc p15,0,R0,c1,c0,0 ; Read SCTLR into R0 (Read control register configuration data)
162 BIC R0,R0,R1 ; Clear SCTLR.I bit : Instruction caches disabled
163 mcr p15,0,R0,c1,c0,0 ; Write R0 into SCTLR (Write control register configuration data)
167 ArmEnableSWPInstruction
168 mrc p15, 0, r0, c1, c0, 0
169 orr r0, r0, #0x00000400
170 mcr p15, 0, r0, c1, c0, 0
174 ArmEnableBranchPrediction
175 mrc p15, 0, r0, c1, c0, 0 ; Read SCTLR into R0 (Read control register configuration data)
176 orr r0, r0, #0x00000800 ;
177 mcr p15, 0, r0, c1, c0, 0 ; Write R0 into SCTLR (Write control register configuration data)
182 ArmDisableBranchPrediction
183 mrc p15, 0, r0, c1, c0, 0 ; Read SCTLR into R0 (Read control register configuration data)
184 bic r0, r0, #0x00000800 ;
185 mcr p15, 0, r0, c1, c0, 0 ; Write R0 into SCTLR (Write control register configuration data)
191 mrc p15, 0, r0, c1, c0, 0 ; Read SCTLR into R0 (Read control register configuration data)
192 bic r0, r0, #0x00002000 ; clear V bit
193 mcr p15, 0, r0, c1, c0, 0 ; Write R0 into SCTLR (Write control register configuration data)
198 mrc p15, 0, r0, c1, c0, 0 ; Read SCTLR into R0 (Read control register configuration data)
199 orr r0, r0, #0x00002000 ; Set V bit
200 mcr p15, 0, r0, c1, c0, 0 ; Write R0 into SCTLR (Write control register configuration data)
204 ArmV7AllDataCachesOperation
205 stmfd SP!,{r4-r12, LR}
206 mov R1, R0 ; Save Function call in R1
207 mrc p15, 1, R6, c0, c0, 1 ; Read CLIDR
208 ands R3, R6, #&7000000 ; Mask out all but Level of Coherency (LoC)
209 mov R3, R3, LSR #23 ; Cache level value (naturally aligned)
214 add R2, R10, R10, LSR #1 ; Work out 3xcachelevel
215 mov R12, R6, LSR R2 ; bottom 3 bits are the Cache type for this level
216 and R12, R12, #7 ; get those 3 bits alone
218 blt Skip ; no cache or only instruction cache at this level
219 mcr p15, 2, R10, c0, c0, 0 ; write the Cache Size selection register (CSSELR) // OR in 1 for Instruction
220 isb ; isb to sync the change to the CacheSizeID reg
221 mrc p15, 1, R12, c0, c0, 0 ; reads current Cache Size ID register (CCSIDR)
222 and R2, R12, #&7 ; extract the line length field
223 add R2, R2, #4 ; add 4 for the line length offset (log2 16 bytes)
225 ands R4, R4, R12, LSR #3 ; R4 is the max number on the way size (right aligned)
226 clz R5, R4 ; R5 is the bit position of the way size increment
228 ands R7, R7, R12, LSR #13 ; R7 is the max number of the index size (right aligned)
231 mov R9, R4 ; R9 working copy of the max way size (right aligned)
234 orr R0, R10, R9, LSL R5 ; factor in the way number and cache number into R11
235 orr R0, R0, R7, LSL R2 ; factor in the index number
239 subs R9, R9, #1 ; decrement the way number
241 subs R7, R7, #1 ; decrement the index
244 add R10, R10, #2 ; increment the cache number
250 ldmfd SP!, {r4-r12, lr}
257 ArmDataSynchronizationBarrier
262 ArmInstructionSynchronizationBarrier
267 // Set the Address of the Vector Table in the VBAR register
268 mrc p15, 0, r0, c12, c0, 0
272 // Set the Address of the Vector Table in the VBAR register
273 mcr p15, 0, r0, c12, c0, 0
274 // Ensure the SCTLR.V bit is clear
275 mrc p15, 0, r0, c1, c0, 0 ; Read SCTLR into R0 (Read control register configuration data)
276 bic r0, r0, #0x00002000 ; clear V bit
277 mcr p15, 0, r0, c1, c0, 0 ; Write R0 into SCTLR (Write control register configuration data)
282 // Read CPACR (Coprocessor Access Control Register)
283 mrc p15, 0, r0, c1, c0, 2
284 // Enable VPF access (Full Access to CP10, CP11) (V* instructions)
285 orr r0, r0, #0x00f00000
286 // Write back CPACR (Coprocessor Access Control Register)
287 mcr p15, 0, r0, c1, c0, 2
289 // Set EN bit in FPEXC. The Advanced SIMD and VFP extensions are enabled and operate normally.
291 mcr p10,#0x7,r0,c8,c0,#0
298 //Note: Return 0 in Uniprocessor implementation
300 mrc p15, 4, r0, c15, c0, 0 //Read Configuration Base Address Register
304 mrc p15, 0, r0, c0, c0, 5 ; read MPIDR
308 mrc p15, 0, r0, c13, c0, 2 ; read TPIDRURW
312 mcr p15, 0, r0, c13, c0, 2 ; write TPIDRURW
315 ArmIsArchTimerImplemented
316 mrc p15, 0, r0, c0, c1, 1 ; Read ID_PFR1
317 and r0, r0, #0x000F0000
321 mrc p15, 0, r0, c0, c1, 1 ; Read ID_PFR1 Register
325 mrc p15, 0, r0, c0, c1, 4 ; Read ID_MMFR0 Register