diff options
Diffstat (limited to 'arch/sh/mm/cache.c')
| -rw-r--r-- | arch/sh/mm/cache.c | 33 | 
1 files changed, 17 insertions, 16 deletions
diff --git a/arch/sh/mm/cache.c b/arch/sh/mm/cache.c index ba401d137bb..097c2cdd117 100644 --- a/arch/sh/mm/cache.c +++ b/arch/sh/mm/cache.c @@ -60,14 +60,14 @@ void copy_to_user_page(struct vm_area_struct *vma, struct page *page,  		       unsigned long len)  {  	if (boot_cpu_data.dcache.n_aliases && page_mapped(page) && -	    !test_bit(PG_dcache_dirty, &page->flags)) { +	    test_bit(PG_dcache_clean, &page->flags)) {  		void *vto = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);  		memcpy(vto, src, len);  		kunmap_coherent(vto);  	} else {  		memcpy(dst, src, len);  		if (boot_cpu_data.dcache.n_aliases) -			set_bit(PG_dcache_dirty, &page->flags); +			clear_bit(PG_dcache_clean, &page->flags);  	}  	if (vma->vm_flags & VM_EXEC) @@ -79,14 +79,14 @@ void copy_from_user_page(struct vm_area_struct *vma, struct page *page,  			 unsigned long len)  {  	if (boot_cpu_data.dcache.n_aliases && page_mapped(page) && -	    !test_bit(PG_dcache_dirty, &page->flags)) { +	    test_bit(PG_dcache_clean, &page->flags)) {  		void *vfrom = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);  		memcpy(dst, vfrom, len);  		kunmap_coherent(vfrom);  	} else {  		memcpy(dst, src, len);  		if (boot_cpu_data.dcache.n_aliases) -			set_bit(PG_dcache_dirty, &page->flags); +			clear_bit(PG_dcache_clean, &page->flags);  	}  } @@ -95,23 +95,24 @@ void copy_user_highpage(struct page *to, struct page *from,  {  	void *vfrom, *vto; -	vto = kmap_atomic(to, KM_USER1); +	vto = kmap_atomic(to);  	if (boot_cpu_data.dcache.n_aliases && page_mapped(from) && -	    !test_bit(PG_dcache_dirty, &from->flags)) { +	    test_bit(PG_dcache_clean, &from->flags)) {  		vfrom = kmap_coherent(from, vaddr);  		copy_page(vto, vfrom);  		kunmap_coherent(vfrom);  	} else { -		vfrom = kmap_atomic(from, KM_USER0); +		vfrom = kmap_atomic(from);  		copy_page(vto, vfrom); -		kunmap_atomic(vfrom, KM_USER0); +		kunmap_atomic(vfrom);  	} -	if (pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK)) +	if (pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK) || +	    (vma->vm_flags & VM_EXEC))  		__flush_purge_region(vto, PAGE_SIZE); -	kunmap_atomic(vto, KM_USER1); +	kunmap_atomic(vto);  	/* Make sure this page is cleared on other CPU's too before using it */  	smp_wmb();  } @@ -119,14 +120,14 @@ EXPORT_SYMBOL(copy_user_highpage);  void clear_user_highpage(struct page *page, unsigned long vaddr)  { -	void *kaddr = kmap_atomic(page, KM_USER0); +	void *kaddr = kmap_atomic(page);  	clear_page(kaddr);  	if (pages_do_alias((unsigned long)kaddr, vaddr & PAGE_MASK))  		__flush_purge_region(kaddr, PAGE_SIZE); -	kunmap_atomic(kaddr, KM_USER0); +	kunmap_atomic(kaddr);  }  EXPORT_SYMBOL(clear_user_highpage); @@ -141,7 +142,7 @@ void __update_cache(struct vm_area_struct *vma,  	page = pfn_to_page(pfn);  	if (pfn_valid(pfn)) { -		int dirty = test_and_clear_bit(PG_dcache_dirty, &page->flags); +		int dirty = !test_and_set_bit(PG_dcache_clean, &page->flags);  		if (dirty)  			__flush_purge_region(page_address(page), PAGE_SIZE);  	} @@ -153,7 +154,7 @@ void __flush_anon_page(struct page *page, unsigned long vmaddr)  	if (pages_do_alias(addr, vmaddr)) {  		if (boot_cpu_data.dcache.n_aliases && page_mapped(page) && -		    !test_bit(PG_dcache_dirty, &page->flags)) { +		    test_bit(PG_dcache_clean, &page->flags)) {  			void *kaddr;  			kaddr = kmap_coherent(page, vmaddr); @@ -284,8 +285,8 @@ void __init cpu_cache_init(void)  {  	unsigned int cache_disabled = 0; -#ifdef CCR -	cache_disabled = !(__raw_readl(CCR) & CCR_CACHE_ENABLE); +#ifdef SH_CCR +	cache_disabled = !(__raw_readl(SH_CCR) & CCR_CACHE_ENABLE);  #endif  	compute_alias(&boot_cpu_data.icache);  | 
