From d5822cf172f9f5dfe13c03750e727ea5bbe09123 Mon Sep 17 00:00:00 2001 From: Atsushi Nemoto Date: Tue, 12 Dec 2006 17:14:56 +0000 Subject: [PATCH] --- yaml --- r: 44555 b: refs/heads/master c: bcd022801ee514e28c32837f0b3ce18c775f1a7b h: refs/heads/master i: 44553: 43a2d978294c62b9828694b8384b1f90e8f9602f 44551: f65230b33d52dcf98b8704447f706915cbf3b96d v: v3 --- [refs] | 2 +- trunk/arch/mips/mm/init.c | 25 +++++++++++++++++++++++++ trunk/include/asm-mips/page.h | 16 ++++++---------- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/[refs] b/[refs] index f63fe9a65a54..a9d5ba51f5a1 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9de455b20705f36384a711d4a20bcf7ba1ab180b +refs/heads/master: bcd022801ee514e28c32837f0b3ce18c775f1a7b diff --git a/trunk/arch/mips/mm/init.c b/trunk/arch/mips/mm/init.c index ea2d15370bb7..30245c09d025 100644 --- a/trunk/arch/mips/mm/init.c +++ b/trunk/arch/mips/mm/init.c @@ -203,6 +203,31 @@ static inline void kunmap_coherent(struct page *page) preempt_check_resched(); } +void copy_user_highpage(struct page *to, struct page *from, + unsigned long vaddr, struct vm_area_struct *vma) +{ + void *vfrom, *vto; + + vto = kmap_atomic(to, KM_USER1); + if (cpu_has_dc_aliases) { + vfrom = kmap_coherent(from, vaddr); + copy_page(vto, vfrom); + kunmap_coherent(from); + } else { + vfrom = kmap_atomic(from, KM_USER0); + copy_page(vto, vfrom); + kunmap_atomic(vfrom, KM_USER0); + } + if (((vma->vm_flags & VM_EXEC) && !cpu_has_ic_fills_f_dc) || + pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK)) + flush_data_cache_page((unsigned long)vto); + kunmap_atomic(vto, KM_USER1); + /* Make sure this page is cleared on other CPU's too before using it */ + smp_wmb(); +} + +EXPORT_SYMBOL(copy_user_highpage); + void copy_to_user_page(struct vm_area_struct *vma, struct page *page, unsigned long vaddr, void *dst, const void *src, unsigned long len) diff --git a/trunk/include/asm-mips/page.h b/trunk/include/asm-mips/page.h index 0dc1a45c27ed..2f9e1a9ec51f 100644 --- a/trunk/include/asm-mips/page.h +++ b/trunk/include/asm-mips/page.h @@ -35,7 +35,6 @@ #ifndef __ASSEMBLY__ #include -#include #include extern void clear_page(void * page); @@ -61,16 +60,13 @@ static inline void clear_user_page(void *addr, unsigned long vaddr, flush_data_cache_page((unsigned long)addr); } -static inline void copy_user_page(void *vto, void *vfrom, unsigned long vaddr, - struct page *to) -{ - extern void (*flush_data_cache_page)(unsigned long addr); +extern void copy_user_page(void *vto, void *vfrom, unsigned long vaddr, + struct page *to); +struct vm_area_struct; +extern void copy_user_highpage(struct page *to, struct page *from, + unsigned long vaddr, struct vm_area_struct *vma); - copy_page(vto, vfrom); - if (!cpu_has_ic_fills_f_dc || - pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK)) - flush_data_cache_page((unsigned long)vto); -} +#define __HAVE_ARCH_COPY_USER_HIGHPAGE /* * These are used to make use of C type-checking..