diff options
Diffstat (limited to 'arch/mips/mm/init.c')
-rw-r--r-- | arch/mips/mm/init.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c index ea2d15370bb7..30245c09d025 100644 --- a/arch/mips/mm/init.c +++ b/arch/mips/mm/init.c | |||
@@ -203,6 +203,31 @@ static inline void kunmap_coherent(struct page *page) | |||
203 | preempt_check_resched(); | 203 | preempt_check_resched(); |
204 | } | 204 | } |
205 | 205 | ||
206 | void copy_user_highpage(struct page *to, struct page *from, | ||
207 | unsigned long vaddr, struct vm_area_struct *vma) | ||
208 | { | ||
209 | void *vfrom, *vto; | ||
210 | |||
211 | vto = kmap_atomic(to, KM_USER1); | ||
212 | if (cpu_has_dc_aliases) { | ||
213 | vfrom = kmap_coherent(from, vaddr); | ||
214 | copy_page(vto, vfrom); | ||
215 | kunmap_coherent(from); | ||
216 | } else { | ||
217 | vfrom = kmap_atomic(from, KM_USER0); | ||
218 | copy_page(vto, vfrom); | ||
219 | kunmap_atomic(vfrom, KM_USER0); | ||
220 | } | ||
221 | if (((vma->vm_flags & VM_EXEC) && !cpu_has_ic_fills_f_dc) || | ||
222 | pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK)) | ||
223 | flush_data_cache_page((unsigned long)vto); | ||
224 | kunmap_atomic(vto, KM_USER1); | ||
225 | /* Make sure this page is cleared on other CPU's too before using it */ | ||
226 | smp_wmb(); | ||
227 | } | ||
228 | |||
229 | EXPORT_SYMBOL(copy_user_highpage); | ||
230 | |||
206 | void copy_to_user_page(struct vm_area_struct *vma, | 231 | void copy_to_user_page(struct vm_area_struct *vma, |
207 | struct page *page, unsigned long vaddr, void *dst, const void *src, | 232 | struct page *page, unsigned long vaddr, void *dst, const void *src, |
208 | unsigned long len) | 233 | unsigned long len) |