diff options
Diffstat (limited to 'include/asm-arm/cacheflush.h')
| -rw-r--r-- | include/asm-arm/cacheflush.h | 40 |
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 | |||
| 303 | static inline void | ||
| 304 | flush_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 |
| 289 | extern void flush_cache_mm(struct mm_struct *mm); | 314 | extern void flush_cache_mm(struct mm_struct *mm); |
| 290 | extern void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end); | 315 | extern void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end); |
| 291 | extern void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn); | 316 | extern void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn); |
| 317 | extern 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 | /* |
