diff options
Diffstat (limited to 'arch/arm/mm/flush.c')
| -rw-r--r-- | arch/arm/mm/flush.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c index b103e56806bd..d438ce41cdd5 100644 --- a/arch/arm/mm/flush.c +++ b/arch/arm/mm/flush.c | |||
| @@ -87,6 +87,32 @@ void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsig | |||
| 87 | if (cache_is_vipt_aliasing()) | 87 | if (cache_is_vipt_aliasing()) |
| 88 | flush_pfn_alias(pfn, user_addr); | 88 | flush_pfn_alias(pfn, user_addr); |
| 89 | } | 89 | } |
| 90 | |||
| 91 | void flush_ptrace_access(struct vm_area_struct *vma, struct page *page, | ||
| 92 | unsigned long uaddr, void *kaddr, | ||
| 93 | unsigned long len, int write) | ||
| 94 | { | ||
| 95 | if (cache_is_vivt()) { | ||
| 96 | if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask)) { | ||
| 97 | unsigned long addr = (unsigned long)kaddr; | ||
| 98 | __cpuc_coherent_kern_range(addr, addr + len); | ||
| 99 | } | ||
| 100 | return; | ||
| 101 | } | ||
| 102 | |||
| 103 | if (cache_is_vipt_aliasing()) { | ||
| 104 | flush_pfn_alias(page_to_pfn(page), uaddr); | ||
| 105 | return; | ||
| 106 | } | ||
| 107 | |||
| 108 | /* VIPT non-aliasing cache */ | ||
| 109 | if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask) && | ||
| 110 | vma->vm_flags | VM_EXEC) { | ||
| 111 | unsigned long addr = (unsigned long)kaddr; | ||
| 112 | /* only flushing the kernel mapping on non-aliasing VIPT */ | ||
| 113 | __cpuc_coherent_kern_range(addr, addr + len); | ||
| 114 | } | ||
| 115 | } | ||
| 90 | #else | 116 | #else |
| 91 | #define flush_pfn_alias(pfn,vaddr) do { } while (0) | 117 | #define flush_pfn_alias(pfn,vaddr) do { } while (0) |
| 92 | #endif | 118 | #endif |
