1
2
3
4
5
6
7#include <asm/asm-offsets.h>
8#include <asm/thread_info.h>
9
10#ifdef CONFIG_CPU_V7M
11#include <asm/v7m.h>
12#endif
13
14
15
16
17 .macro vma_vm_mm, rd, rn
18 ldr \rd, [\rn,
19 .endm
20
21
22
23
24 .macro vma_vm_flags, rd, rn
25 ldr \rd, [\rn,
26 .endm
27
28 .macro tsk_mm, rd, rn
29 ldr \rd, [\rn,
30 ldr \rd, [\rd,
31 .endm
32
33
34
35
36 .macro act_mm, rd
37 bic \rd, sp,
38 bic \rd, \rd,
39 ldr \rd, [\rd,
40 ldr \rd, [\rd,
41 .endm
42
43
44
45
46
47 .macro mmid, rd, rn
48#ifdef __ARMEB__
49 ldr \rd, [\rn,
50#else
51 ldr \rd, [\rn,
52#endif
53 .endm
54
55
56
57
58 .macro asid, rd, rn
59 and \rd, \rn,
60 .endm
61
62 .macro crval, clear, mmuset, ucset
63#ifdef CONFIG_MMU
64 .word \clear
65 .word \mmuset
66#else
67 .word \clear
68 .word \ucset
69#endif
70 .endm
71
72
73
74
75
76 .macro dcache_line_size, reg, tmp
77#ifdef CONFIG_CPU_V7M
78 movw \tmp,
79 movt \tmp,
80 ldr \tmp, [\tmp]
81#else
82 mrc p15, 0, \tmp, c0, c0, 1 @ read ctr
83#endif
84 lsr \tmp, \tmp,
85 and \tmp, \tmp,
86 mov \reg,
87 mov \reg, \reg, lsl \tmp @ actual cache line size
88 .endm
89
90
91
92
93
94 .macro icache_line_size, reg, tmp
95#ifdef CONFIG_CPU_V7M
96 movw \tmp,
97 movt \tmp,
98 ldr \tmp, [\tmp]
99#else
100 mrc p15, 0, \tmp, c0, c0, 1 @ read ctr
101#endif
102 and \tmp, \tmp,
103 mov \reg,
104 mov \reg, \reg, lsl \tmp @ actual cache line size
105 .endm
106
107
108
109
110
111#ifdef CONFIG_MMU
112
113
114#endif
115
116 (L_PTE_XN+L_PTE_USER+L_PTE_RDONLY+L_PTE_DIRTY+L_PTE_YOUNG+\
117 L_PTE_PRESENT) > L_PTE_SHARED
118
119#endif
120#endif
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 .macro armv6_mt_table pfx
136\pfx\()_mt_table:
137 .long 0x00 @ L_PTE_MT_UNCACHED
138 .long PTE_EXT_TEX(1) @ L_PTE_MT_BUFFERABLE
139 .long PTE_CACHEABLE @ L_PTE_MT_WRITETHROUGH
140 .long PTE_CACHEABLE | PTE_BUFFERABLE @ L_PTE_MT_WRITEBACK
141 .long PTE_BUFFERABLE @ L_PTE_MT_DEV_SHARED
142 .long 0x00 @ unused
143 .long 0x00 @ L_PTE_MT_MINICACHE (not present)
144 .long PTE_EXT_TEX(1) | PTE_CACHEABLE | PTE_BUFFERABLE @ L_PTE_MT_WRITEALLOC
145 .long 0x00 @ unused
146 .long PTE_EXT_TEX(1) @ L_PTE_MT_DEV_WC
147 .long 0x00 @ unused
148 .long PTE_CACHEABLE | PTE_BUFFERABLE @ L_PTE_MT_DEV_CACHED
149 .long PTE_EXT_TEX(2) @ L_PTE_MT_DEV_NONSHARED
150 .long 0x00 @ unused
151 .long 0x00 @ unused
152 .long PTE_CACHEABLE | PTE_BUFFERABLE | PTE_EXT_APX @ L_PTE_MT_VECTORS
153 .endm
154
155 .macro armv6_set_pte_ext pfx
156 str r1, [r0],
157
158 bic r3, r1,
159 bic r3, r3,
160 orr r3, r3, r2
161 orr r3, r3,
162
163 adr ip, \pfx\()_mt_table
164 and r2, r1,
165 ldr r2, [ip, r2]
166
167 eor r1, r1,
168 tst r1,
169 orrne r3, r3,
170
171 tst r1,
172 orrne r3, r3,
173 tstne r3,
174
175 @ user read-only -> kernel read-only
176 bicne r3, r3,
177
178 tst r1,
179 orrne r3, r3,
180
181 eor r3, r3, r2
182
183 tst r1,
184 tstne r1,
185 moveq r3,
186 tstne r1,
187 movne r3,
188
189 str r3, [r0]
190 mcr p15, 0, r0, c7, c10, 1 @ flush_pte
191 .endm
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208 .macro armv3_set_pte_ext wc_disable=1
209 str r1, [r0],
210
211 eor r3, r1,
212
213 bic r2, r1,
214 bic r2, r2,
215 orr r2, r2,
216
217 tst r3,
218 orrne r2, r2,
219
220 tst r3,
221 orreq r2, r2,
222
223 tst r3,
224 movne r2,
225
226 .if \wc_disable
227#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
228 tst r2,
229 bicne r2, r2,
230#endif
231 .endif
232 str r2, [r0] @ hardware version
233 .endm
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251 .macro xscale_set_pte_ext_prologue
252 str r1, [r0] @ linux version
253
254 eor r3, r1,
255
256 bic r2, r1,
257 orr r2, r2,
258
259 tst r3,
260 orrne r2, r2,
261
262 tst r3,
263 orreq r2, r2,
264 @ combined with user -> user r/w
265 .endm
266
267 .macro xscale_set_pte_ext_epilogue
268 tst r3,
269 movne r2,
270
271 str r2, [r0,
272 mov ip,
273 mcr p15, 0, r0, c7, c10, 1 @ clean L1 D line
274 mcr p15, 0, ip, c7, c10, 4 @ data write barrier
275 .endm
276
277.macro define_processor_functions name:req, dabort:req, pabort:req, nommu=0, suspend=0
278 .type \name\()_processor_functions,
279 .align 2
280ENTRY(\name\()_processor_functions)
281 .word \dabort
282 .word \pabort
283 .word cpu_\name\()_proc_init
284 .word cpu_\name\()_proc_fin
285 .word cpu_\name\()_reset
286 .word cpu_\name\()_do_idle
287 .word cpu_\name\()_dcache_clean_area
288 .word cpu_\name\()_switch_mm
289
290 .if \nommu
291 .word 0
292 .else
293 .word cpu_\name\()_set_pte_ext
294 .endif
295
296 .if \suspend
297 .word cpu_\name\()_suspend_size
298#ifdef CONFIG_ARM_CPU_SUSPEND
299 .word cpu_\name\()_do_suspend
300 .word cpu_\name\()_do_resume
301#else
302 .word 0
303 .word 0
304#endif
305 .else
306 .word 0
307 .word 0
308 .word 0
309 .endif
310
311 .size \name\()_processor_functions, . - \name\()_processor_functions
312.endm
313
314.macro define_cache_functions name:req
315 .align 2
316 .type \name\()_cache_fns,
317ENTRY(\name\()_cache_fns)
318 .long \name\()_flush_icache_all
319 .long \name\()_flush_kern_cache_all
320 .long \name\()_flush_kern_cache_louis
321 .long \name\()_flush_user_cache_all
322 .long \name\()_flush_user_cache_range
323 .long \name\()_coherent_kern_range
324 .long \name\()_coherent_user_range
325 .long \name\()_flush_kern_dcache_area
326 .long \name\()_dma_map_area
327 .long \name\()_dma_unmap_area
328 .long \name\()_dma_flush_range
329 .size \name\()_cache_fns, . - \name\()_cache_fns
330.endm
331
332.macro define_tlb_functions name:req, flags_up:req, flags_smp
333 .type \name\()_tlb_fns,
334ENTRY(\name\()_tlb_fns)
335 .long \name\()_flush_user_tlb_range
336 .long \name\()_flush_kern_tlb_range
337 .ifnb \flags_smp
338 ALT_SMP(.long \flags_smp )
339 ALT_UP(.long \flags_up )
340 .else
341 .long \flags_up
342 .endif
343 .size \name\()_tlb_fns, . - \name\()_tlb_fns
344.endm
345
346.macro globl_equ x, y
347 .globl \x
348 .equ \x, \y
349.endm
350
351.macro initfn, func, base
352 .long \func - \base
353.endm
354
355
356
357
358
359
360.macro pr_sz, rd, size, tmp
361 mov \tmp, \size, lsr
362 mov \rd,
3631: movs \tmp, \tmp, lsr
364 addne \rd, \rd,
365 bne 1b
366.endm
367
368
369
370
371
372
373.macro pr_val, dest, addr, size, enable
374 pr_sz \dest, \size, \size @ calculate log2(size) - 1
375 orr \dest, \addr, \dest, lsl
376 orr \dest, \dest, \enable
377.endm
378