aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-arm/cacheflush.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/asm-arm/cacheflush.h')
-rw-r--r--include/asm-arm/cacheflush.h40
1 files changed, 34 insertions, 6 deletions
diff --git a/include/asm-arm/cacheflush.h b/include/asm-arm/cacheflush.h
index fe0c744e0266..f0845646aacb 100644
--- a/include/asm-arm/cacheflush.h
+++ b/include/asm-arm/cacheflush.h
@@ -25,7 +25,7 @@
25#undef _CACHE 25#undef _CACHE
26#undef MULTI_CACHE 26#undef MULTI_CACHE
27 27
28#if defined(CONFIG_CPU_ARM610) || defined(CONFIG_CPU_ARM710) 28#if defined(CONFIG_CPU_CACHE_V3)
29# ifdef _CACHE 29# ifdef _CACHE
30# define MULTI_CACHE 1 30# define MULTI_CACHE 1
31# else 31# else
@@ -33,7 +33,7 @@
33# endif 33# endif
34#endif 34#endif
35 35
36#if defined(CONFIG_CPU_ARM720T) 36#if defined(CONFIG_CPU_CACHE_V4)
37# ifdef _CACHE 37# ifdef _CACHE
38# define MULTI_CACHE 1 38# define MULTI_CACHE 1
39# else 39# else
@@ -54,7 +54,23 @@
54# endif 54# endif
55#endif 55#endif
56 56
57#if defined(CONFIG_CPU_SA110) || defined(CONFIG_CPU_SA1100) 57#if defined(CONFIG_CPU_ARM940T)
58# ifdef _CACHE
59# define MULTI_CACHE 1
60# else
61# define _CACHE arm940
62# endif
63#endif
64
65#if defined(CONFIG_CPU_ARM946E)
66# ifdef _CACHE
67# define MULTI_CACHE 1
68# else
69# define _CACHE arm946
70# endif
71#endif
72
73#if defined(CONFIG_CPU_CACHE_V4WB)
58# ifdef _CACHE 74# ifdef _CACHE
59# define MULTI_CACHE 1 75# define MULTI_CACHE 1
60# else 76# else
@@ -247,14 +263,12 @@ extern void dmac_flush_range(unsigned long, unsigned long);
247 */ 263 */
248#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ 264#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
249 do { \ 265 do { \
250 flush_cache_page(vma, vaddr, page_to_pfn(page));\
251 memcpy(dst, src, len); \ 266 memcpy(dst, src, len); \
252 flush_dcache_page(page); \ 267 flush_ptrace_access(vma, page, vaddr, dst, len, 1);\
253 } while (0) 268 } while (0)
254 269
255#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ 270#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
256 do { \ 271 do { \
257 flush_cache_page(vma, vaddr, page_to_pfn(page));\
258 memcpy(dst, src, len); \ 272 memcpy(dst, src, len); \
259 } while (0) 273 } while (0)
260 274
@@ -285,10 +299,24 @@ flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned l
285 __cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags); 299 __cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags);
286 } 300 }
287} 301}
302
303static inline void
304flush_ptrace_access(struct vm_area_struct *vma, struct page *page,
305 unsigned long uaddr, void *kaddr,
306 unsigned long len, int write)
307{
308 if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask)) {
309 unsigned long addr = (unsigned long)kaddr;
310 __cpuc_coherent_kern_range(addr, addr + len);
311 }
312}
288#else 313#else
289extern void flush_cache_mm(struct mm_struct *mm); 314extern void flush_cache_mm(struct mm_struct *mm);
290extern void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end); 315extern void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end);
291extern void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn); 316extern void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn);
317extern void flush_ptrace_access(struct vm_area_struct *vma, struct page *page,
318 unsigned long uaddr, void *kaddr,
319 unsigned long len, int write);
292#endif 320#endif
293 321
294/* 322/*