]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Library/ArmLib/ArmV7/ArmV7Support.asm
Cleanup MMU code to do book required sync. Update exception handler to clear fault...
[mirror_edk2.git] / ArmPkg / Library / ArmLib / ArmV7 / ArmV7Support.asm
CommitLineData
2ef2b01e
A
1//------------------------------------------------------------------------------
2//
3// Copyright (c) 2008-2009 Apple Inc. All rights reserved.
4//
5// All rights reserved. This program and the accompanying materials
6// are licensed and made available under the terms and conditions of the BSD License
7// which accompanies this distribution. The full text of the license may be found at
8// http://opensource.org/licenses/bsd-license.php
9//
10// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12//
13//------------------------------------------------------------------------------
14
15 EXPORT ArmInvalidateInstructionCache
16 EXPORT ArmInvalidateDataCacheEntryByMVA
17 EXPORT ArmCleanDataCacheEntryByMVA
18 EXPORT ArmCleanInvalidateDataCacheEntryByMVA
19 EXPORT ArmInvalidateDataCacheEntryBySetWay
20 EXPORT ArmCleanDataCacheEntryBySetWay
21 EXPORT ArmCleanInvalidateDataCacheEntryBySetWay
22 EXPORT ArmDrainWriteBuffer
23 EXPORT ArmEnableMmu
24 EXPORT ArmDisableMmu
c2b5ca8b 25 EXPORT ArmMmuEnabled
2ef2b01e
A
26 EXPORT ArmEnableDataCache
27 EXPORT ArmDisableDataCache
28 EXPORT ArmEnableInstructionCache
29 EXPORT ArmDisableInstructionCache
30 EXPORT ArmEnableBranchPrediction
31 EXPORT ArmDisableBranchPrediction
37b91c49 32 EXPORT ArmV7AllDataCachesOperation
026c3d34 33 EXPORT ArmDataMemoryBarrier
34 EXPORT ArmDataSyncronizationBarrier
35 EXPORT ArmInstructionSynchronizationBarrier
36
548af3e7 37 AREA ArmCacheLib, CODE, READONLY
38 PRESERVE8
2ef2b01e
A
39
40DC_ON EQU ( 0x1:SHL:2 )
41IC_ON EQU ( 0x1:SHL:12 )
2ef2b01e
A
42
43
2ef2b01e
A
44
45ArmInvalidateDataCacheEntryByMVA
548af3e7 46 mcr p15, 0, r0, c7, c6, 1 ; invalidate single data cache line
47 dsb
48 isb
49 bx lr
2ef2b01e
A
50
51
52ArmCleanDataCacheEntryByMVA
548af3e7 53 mcr p15, 0, r0, c7, c10, 1 ; clean single data cache line
54 dsb
55 isb
56 bx lr
2ef2b01e
A
57
58
59ArmCleanInvalidateDataCacheEntryByMVA
548af3e7 60 mcr p15, 0, r0, c7, c14, 1 ; clean and invalidate single data cache line
61 dsb
62 isb
63 bx lr
2ef2b01e
A
64
65
66ArmInvalidateDataCacheEntryBySetWay
67 mcr p15, 0, r0, c7, c6, 2 ; Invalidate this line
548af3e7 68 dsb
69 isb
2ef2b01e
A
70 bx lr
71
72
73ArmCleanInvalidateDataCacheEntryBySetWay
74 mcr p15, 0, r0, c7, c14, 2 ; Clean and Invalidate this line
548af3e7 75 dsb
76 isb
2ef2b01e
A
77 bx lr
78
79
80ArmCleanDataCacheEntryBySetWay
81 mcr p15, 0, r0, c7, c10, 2 ; Clean this line
548af3e7 82 dsb
83 isb
2ef2b01e
A
84 bx lr
85
86
2ef2b01e 87ArmInvalidateInstructionCache
548af3e7 88 mcr p15,0,R0,c7,c5,0 ;Invalidate entire instruction cache
548af3e7 89 dsb
90 isb
91 bx LR
2ef2b01e
A
92
93ArmEnableMmu
94 mrc p15,0,R0,c1,c0,0
95 orr R0,R0,#1
96 mcr p15,0,R0,c1,c0,0
548af3e7 97 dsb
98 isb
2ef2b01e
A
99 bx LR
100
c2b5ca8b
A
101ArmMmuEnabled
102 mrc p15,0,R0,c1,c0,0
103 and R0,R0,#1
104 bx LR
105
2ef2b01e 106ArmDisableMmu
2ef2b01e
A
107 mrc p15,0,R0,c1,c0,0
108 bic R0,R0,#1
109 mcr p15,0,R0,c1,c0,0 ;Disable MMU
7800c283 110
111 mcr p15,0,R0,c8,c7,0 ;Invalidate TLB
112 mcr p15,0,R0,c7,c5,6 ;Invalidate Branch predictor array
548af3e7 113 dsb
114 isb
2ef2b01e
A
115 bx LR
116
bb02cb80 117
2ef2b01e 118ArmEnableDataCache
548af3e7 119 ldr R1,=DC_ON
120 mrc p15,0,R0,c1,c0,0 ;Read control register configuration data
121 orr R0,R0,R1 ;Set C bit
7800c283 122 mcr p15,0,R0,c1,c0,0 ;Write control register configuration data
548af3e7 123 dsb
124 isb
125 bx LR
2ef2b01e
A
126
127ArmDisableDataCache
548af3e7 128 ldr R1,=DC_ON
129 mrc p15,0,R0,c1,c0,0 ;Read control register configuration data
130 bic R0,R0,R1 ;Clear C bit
7800c283 131 mcr p15,0,R0,c1,c0,0 ;Write control register configuration data
548af3e7 132 isb
133 bx LR
2ef2b01e
A
134
135ArmEnableInstructionCache
548af3e7 136 ldr R1,=IC_ON
137 mrc p15,0,R0,c1,c0,0 ;Read control register configuration data
138 orr R0,R0,R1 ;Set I bit
7800c283 139 mcr p15,0,R0,c1,c0,0 ;Write control register configuration data
548af3e7 140 dsb
141 isb
142 bx LR
2ef2b01e
A
143
144ArmDisableInstructionCache
548af3e7 145 ldr R1,=IC_ON
146 mrc p15,0,R0,c1,c0,0 ;Read control register configuration data
2ef2b01e 147 BIC R0,R0,R1 ;Clear I bit.
7800c283 148 mcr p15,0,R0,c1,c0,0 ;Write control register configuration data
548af3e7 149 isb
150 bx LR
2ef2b01e
A
151
152ArmEnableBranchPrediction
153 mrc p15, 0, r0, c1, c0, 0
154 orr r0, r0, #0x00000800
155 mcr p15, 0, r0, c1, c0, 0
548af3e7 156 isb
2ef2b01e
A
157 bx LR
158
159ArmDisableBranchPrediction
160 mrc p15, 0, r0, c1, c0, 0
161 bic r0, r0, #0x00000800
162 mcr p15, 0, r0, c1, c0, 0
548af3e7 163 isb
2ef2b01e
A
164 bx LR
165
98bc0c8c 166
167ArmV7AllDataCachesOperation
548af3e7 168 stmfd SP!,{r4-r12, LR}
169 mov R1, R0 ; Save Function call in R1
170 mrc p15, 1, R6, c0, c0, 1 ; Read CLIDR
171 ands R3, R6, #&7000000 ; Mask out all but Level of Coherency (LoC)
172 mov R3, R3, LSR #23 ; Cache level value (naturally aligned)
173 beq Finished
174 mov R10, #0
98bc0c8c 175
176Loop1
548af3e7 177 add R2, R10, R10, LSR #1 ; Work out 3xcachelevel
178 mov R12, R6, LSR R2 ; bottom 3 bits are the Cache type for this level
179 and R12, R12, #7 ; get those 3 bits alone
180 cmp R12, #2
181 blt Skip ; no cache or only instruction cache at this level
182 mcr p15, 2, R10, c0, c0, 0 ; write the Cache Size selection register (CSSELR) // OR in 1 for Instruction
183 isb ; isb to sync the change to the CacheSizeID reg
184 mrc p15, 1, R12, c0, c0, 0 ; reads current Cache Size ID register (CCSIDR)
185 and R2, R12, #&7 ; extract the line length field
186 add R2, R2, #4 ; add 4 for the line length offset (log2 16 bytes)
187 ldr R4, =0x3FF
188 ands R4, R4, R12, LSR #3 ; R4 is the max number on the way size (right aligned)
189 clz R5, R4 ; R5 is the bit position of the way size increment
190 ldr R7, =0x00007FFF
191 ands R7, R7, R12, LSR #13 ; R7 is the max number of the index size (right aligned)
98bc0c8c 192
193Loop2
548af3e7 194 mov R9, R4 ; R9 working copy of the max way size (right aligned)
98bc0c8c 195
196Loop3
548af3e7 197 orr R0, R10, R9, LSL R5 ; factor in the way number and cache number into R11
198 orr R0, R0, R7, LSL R2 ; factor in the index number
98bc0c8c 199
548af3e7 200 blx R1
98bc0c8c 201
548af3e7 202 subs R9, R9, #1 ; decrement the way number
203 bge Loop3
204 subs R7, R7, #1 ; decrement the index
205 bge Loop2
98bc0c8c 206Skip
548af3e7 207 add R10, R10, #2 ; increment the cache number
208 cmp R3, R10
209 bgt Loop1
98bc0c8c 210
211Finished
7800c283 212 dsb
548af3e7 213 ldmfd SP!, {r4-r12, lr}
214 bx LR
98bc0c8c 215
026c3d34 216
217ArmDataMemoryBarrier
548af3e7 218 dmb
219 bx LR
026c3d34 220
221ArmDataSyncronizationBarrier
7800c283 222ArmDrainWriteBuffer
548af3e7 223 dsb
224 bx LR
026c3d34 225
226ArmInstructionSynchronizationBarrier
548af3e7 227 isb
228 bx LR
026c3d34 229
2ef2b01e 230 END