| @@ -89,26 +89,30 @@ ENTRY(armv7_setttb) | | | @@ -89,26 +89,30 @@ ENTRY(armv7_setttb) |
89 | dsb @ data synchronization barrier | | 89 | dsb @ data synchronization barrier |
90 | isb | | 90 | isb |
91 | bx lr | | 91 | bx lr |
92 | END(armv7_setttb) | | 92 | END(armv7_setttb) |
93 | | | 93 | |
94 | /* Cache operations. */ | | 94 | /* Cache operations. */ |
95 | | | 95 | |
96 | /* LINTSTUB: void armv7_icache_sync_range(vaddr_t, vsize_t); */ | | 96 | /* LINTSTUB: void armv7_icache_sync_range(vaddr_t, vsize_t); */ |
97 | ENTRY_NP(armv7_icache_sync_range) | | 97 | ENTRY_NP(armv7_icache_sync_range) |
98 | mrc p15, 1, r2, c0, c0, 0 @ read CCSIDR | | 98 | mrc p15, 1, r2, c0, c0, 0 @ read CCSIDR |
99 | and r2, r2, #7 @ get line size (log2(size)-4, 0=16) | | 99 | and r2, r2, #7 @ get line size (log2(size)-4, 0=16) |
100 | mov ip, #16 @ make a bit mask | | 100 | mov ip, #16 @ make a bit mask |
101 | lsl r2, ip, r2 @ and shift into position | | 101 | lsl r2, ip, r2 @ and shift into position |
| | | 102 | sub ip, r2, #1 @ make into a mask |
| | | 103 | and r3, r0, ip @ get offset into cache line |
| | | 104 | add r1, r1, r3 @ add to length |
| | | 105 | bic r0, r0, ip @ clear offset from start. |
102 | 1: | | 106 | 1: |
103 | mcr p15, 0, r0, c7, c10, 1 @ wb the D-Cache line | | 107 | mcr p15, 0, r0, c7, c10, 1 @ wb the D-Cache line |
104 | mcr p15, 0, r0, c7, c5, 1 @ invalidate the I-Cache line | | 108 | mcr p15, 0, r0, c7, c5, 1 @ invalidate the I-Cache line |
105 | add r0, r0, r2 | | 109 | add r0, r0, r2 |
106 | subs r1, r1, r2 | | 110 | subs r1, r1, r2 |
107 | bhi 1b | | 111 | bhi 1b |
108 | | | 112 | |
109 | dsb @ data synchronization barrier | | 113 | dsb @ data synchronization barrier |
110 | isb | | 114 | isb |
111 | bx lr | | 115 | bx lr |
112 | END(armv7_icache_sync_range) | | 116 | END(armv7_icache_sync_range) |
113 | | | 117 | |
114 | /* LINTSTUB: void armv7_icache_sync_all(void); */ | | 118 | /* LINTSTUB: void armv7_icache_sync_all(void); */ |
| @@ -121,73 +125,89 @@ ENTRY_NP(armv7_icache_sync_all) | | | @@ -121,73 +125,89 @@ ENTRY_NP(armv7_icache_sync_all) |
121 | stmdb sp!, {r0, lr} | | 125 | stmdb sp!, {r0, lr} |
122 | bl _C_LABEL(armv7_idcache_wbinv_all) @clean the D cache | | 126 | bl _C_LABEL(armv7_idcache_wbinv_all) @clean the D cache |
123 | ldmia sp!, {r0, lr} | | 127 | ldmia sp!, {r0, lr} |
124 | dsb @ data synchronization barrier | | 128 | dsb @ data synchronization barrier |
125 | isb | | 129 | isb |
126 | bx lr | | 130 | bx lr |
127 | END(armv7_icache_sync_all) | | 131 | END(armv7_icache_sync_all) |
128 | | | 132 | |
129 | ENTRY(armv7_dcache_wb_range) | | 133 | ENTRY(armv7_dcache_wb_range) |
130 | mrc p15, 1, r2, c0, c0, 0 @ read CCSIDR | | 134 | mrc p15, 1, r2, c0, c0, 0 @ read CCSIDR |
131 | and r2, r2, #7 @ get line size (log2(size)-4, 0=16) | | 135 | and r2, r2, #7 @ get line size (log2(size)-4, 0=16) |
132 | mov ip, #16 @ make a bit mask | | 136 | mov ip, #16 @ make a bit mask |
133 | lsl r2, ip, r2 @ and shift into position | | 137 | lsl r2, ip, r2 @ and shift into position |
| | | 138 | sub ip, r2, #1 @ make into a mask |
| | | 139 | and r3, r0, ip @ get offset into cache line |
| | | 140 | add r1, r1, r3 @ add to length |
| | | 141 | bic r0, r0, ip @ clear offset from start. |
134 | 1: | | 142 | 1: |
135 | mcr p15, 0, r0, c7, c10, 1 @ wb the D-Cache to PoC | | 143 | mcr p15, 0, r0, c7, c10, 1 @ wb the D-Cache to PoC |
136 | add r0, r0, r2 | | 144 | add r0, r0, r2 |
137 | subs r1, r1, r2 | | 145 | subs r1, r1, r2 |
138 | bhi 1b | | 146 | bhi 1b |
139 | dsb @ data synchronization barrier | | 147 | dsb @ data synchronization barrier |
140 | bx lr | | 148 | bx lr |
141 | END(armv7_dcache_wb_range) | | 149 | END(armv7_dcache_wb_range) |
142 | | | 150 | |
143 | /* LINTSTUB: void armv7_dcache_wbinv_range(vaddr_t, vsize_t); */ | | 151 | /* LINTSTUB: void armv7_dcache_wbinv_range(vaddr_t, vsize_t); */ |
144 | ENTRY(armv7_dcache_wbinv_range) | | 152 | ENTRY(armv7_dcache_wbinv_range) |
145 | mrc p15, 1, r2, c0, c0, 0 @ read CCSIDR | | 153 | mrc p15, 1, r2, c0, c0, 0 @ read CCSIDR |
146 | and r2, r2, #7 @ get line size (log2(size)-4, 0=16) | | 154 | and r2, r2, #7 @ get line size (log2(size)-4, 0=16) |
147 | mov ip, #16 @ make a bit mask | | 155 | mov ip, #16 @ make a bit mask |
148 | lsl r2, ip, r2 @ and shift into position | | 156 | lsl r2, ip, r2 @ and shift into position |
| | | 157 | sub ip, r2, #1 @ make into a mask |
| | | 158 | and r3, r0, ip @ get offset into cache line |
| | | 159 | add r1, r1, r3 @ add to length |
| | | 160 | bic r0, r0, ip @ clear offset from start. |
149 | 1: | | 161 | 1: |
150 | mcr p15, 0, r0, c7, c14, 1 @ wb and inv the D-Cache line | | 162 | mcr p15, 0, r0, c7, c14, 1 @ wb and inv the D-Cache line |
151 | add r0, r0, r2 | | 163 | add r0, r0, r2 |
152 | subs r1, r1, r2 | | 164 | subs r1, r1, r2 |
153 | bhi 1b | | 165 | bhi 1b |
154 | dsb @ data synchronization barrier | | 166 | dsb @ data synchronization barrier |
155 | bx lr | | 167 | bx lr |
156 | END(armv7_dcache_wbinv_range) | | 168 | END(armv7_dcache_wbinv_range) |
157 | | | 169 | |
158 | /* * LINTSTUB: void armv7_dcache_inv_range(vaddr_t, vsize_t); */ | | 170 | /* * LINTSTUB: void armv7_dcache_inv_range(vaddr_t, vsize_t); */ |
159 | ENTRY(armv7_dcache_inv_range) | | 171 | ENTRY(armv7_dcache_inv_range) |
160 | mrc p15, 1, r2, c0, c0, 0 @ read CCSIDR | | 172 | mrc p15, 1, r2, c0, c0, 0 @ read CCSIDR |
161 | and r2, r2, #7 @ get line size (log2(size)-4, 0=16) | | 173 | and r2, r2, #7 @ get line size (log2(size)-4, 0=16) |
162 | mov ip, #16 @ make a bit mask | | 174 | mov ip, #16 @ make a bit mask |
163 | lsl r2, ip, r2 @ and shift into position | | 175 | lsl r2, ip, r2 @ and shift into position |
| | | 176 | sub ip, r2, #1 @ make into a mask |
| | | 177 | and r3, r0, ip @ get offset into cache line |
| | | 178 | add r1, r1, r3 @ add to length |
| | | 179 | bic r0, r0, ip @ clear offset from start. |
164 | 1: | | 180 | 1: |
165 | mcr p15, 0, r0, c7, c6, 1 @ invalidate the D-Cache line | | 181 | mcr p15, 0, r0, c7, c6, 1 @ invalidate the D-Cache line |
166 | add r0, r0, r2 | | 182 | add r0, r0, r2 |
167 | subs r1, r1, r2 | | 183 | subs r1, r1, r2 |
168 | bhi 1b | | 184 | bhi 1b |
169 | | | 185 | |
170 | dsb @ data synchronization barrier | | 186 | dsb @ data synchronization barrier |
171 | bx lr | | 187 | bx lr |
172 | END(armv7_dcache_inv_range) | | 188 | END(armv7_dcache_inv_range) |
173 | | | 189 | |
174 | | | 190 | |
175 | /* * LINTSTUB: void armv7_idcache_wbinv_range(vaddr_t, vsize_t); */ | | 191 | /* * LINTSTUB: void armv7_idcache_wbinv_range(vaddr_t, vsize_t); */ |
176 | ENTRY(armv7_idcache_wbinv_range) | | 192 | ENTRY(armv7_idcache_wbinv_range) |
177 | mrc p15, 1, r2, c0, c0, 0 @ read CCSIDR | | 193 | mrc p15, 1, r2, c0, c0, 0 @ read CCSIDR |
178 | and r2, r2, #7 @ get line size (log2(size)-4, 0=16) | | 194 | and r2, r2, #7 @ get line size (log2(size)-4, 0=16) |
179 | mov ip, #16 @ make a bit mask | | 195 | mov ip, #16 @ make a bit mask |
180 | lsl r2, ip, r2 @ and shift into position | | 196 | lsl r2, ip, r2 @ and shift into position |
| | | 197 | sub ip, r2, #1 @ make into a mask |
| | | 198 | and r3, r0, ip @ get offset into cache line |
| | | 199 | add r1, r1, r3 @ add to length |
| | | 200 | bic r0, r0, ip @ clear offset from start. |
181 | 1: | | 201 | 1: |
182 | mcr p15, 0, r0, c7, c5, 1 @ invalidate the I-Cache line | | 202 | mcr p15, 0, r0, c7, c5, 1 @ invalidate the I-Cache line |
183 | mcr p15, 0, r0, c7, c14, 1 @ wb and inv the D-Cache line | | 203 | mcr p15, 0, r0, c7, c14, 1 @ wb and inv the D-Cache line |
184 | add r0, r0, r2 | | 204 | add r0, r0, r2 |
185 | subs r1, r1, r2 | | 205 | subs r1, r1, r2 |
186 | bhi 1b | | 206 | bhi 1b |
187 | | | 207 | |
188 | dsb @ data synchronization barrier | | 208 | dsb @ data synchronization barrier |
189 | isb | | 209 | isb |
190 | bx lr | | 210 | bx lr |
191 | END(armv7_idcache_wbinv_range) | | 211 | END(armv7_idcache_wbinv_range) |
192 | | | 212 | |
193 | /* * LINTSTUB: void armv7_idcache_wbinv_all(void); */ | | 213 | /* * LINTSTUB: void armv7_idcache_wbinv_all(void); */ |