 d369d92fc7
			
		
	
	d369d92fc7
	
	
	
		
			
			Ethernet, switch, LEDs, buttons, USB, sysupgrade & LuCI were
successfully tested on BCM4706.
WARNING: Hack for BCM4710 adding BCM4710_PROTECTED_FILL_TLB() to the
local_r4k_flush_cache_sigtramp() could not be ported. That function has
been dropped in:
commit adcc81f148d7 ("MIPS: math-emu: Write-protect delay slot emulation pages")
commit 3315b6b336c8 ("MIPS: Delete unused flush_cache_sigtramp()")
it's unsure if that chipset will still work reliably.
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
		
	
		
			
				
	
	
		
			75 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From: Jeff Hansen <jhansen@cardaccess-inc.com>
 | |
| Subject: [PATCH] no highpage
 | |
| 
 | |
| On ASUS WL-500gP there are many unexpected "Segmentation fault"s that
 | |
| seem to be caused by a kernel. They can be avoided by:
 | |
| 1) Disabling highpage
 | |
| 2) Using flush_cache_mm in flush_cache_dup_mm
 | |
| 
 | |
| For details see OpenWrt ticket #2035 https://dev.openwrt.org/ticket/2035
 | |
| ---
 | |
| --- a/arch/mips/include/asm/page.h
 | |
| +++ b/arch/mips/include/asm/page.h
 | |
| @@ -71,6 +71,7 @@ static inline unsigned int page_size_ftl
 | |
|  #endif /* CONFIG_MIPS_HUGE_TLB_SUPPORT */
 | |
|  
 | |
|  #include <linux/pfn.h>
 | |
| +#include <asm/cpu-features.h>
 | |
|  
 | |
|  extern void build_clear_page(void);
 | |
|  extern void build_copy_page(void);
 | |
| @@ -110,11 +111,16 @@ static inline void clear_user_page(void
 | |
|  		flush_data_cache_page((unsigned long)addr);
 | |
|  }
 | |
|  
 | |
| -struct vm_area_struct;
 | |
| -extern void copy_user_highpage(struct page *to, struct page *from,
 | |
| -	unsigned long vaddr, struct vm_area_struct *vma);
 | |
| +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);
 | |
|  
 | |
| -#define __HAVE_ARCH_COPY_USER_HIGHPAGE
 | |
| +	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);
 | |
| +}
 | |
|  
 | |
|  /*
 | |
|   * These are used to make use of C type-checking..
 | |
| --- a/arch/mips/mm/init.c
 | |
| +++ b/arch/mips/mm/init.c
 | |
| @@ -168,30 +168,6 @@ void kunmap_coherent(void)
 | |
|  	preempt_enable();
 | |
|  }
 | |
|  
 | |
| -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);
 | |
| -	if (cpu_has_dc_aliases && cpu_use_kmap_coherent &&
 | |
| -	    page_mapcount(from) && !Page_dcache_dirty(from)) {
 | |
| -		vfrom = kmap_coherent(from, vaddr);
 | |
| -		copy_page(vto, vfrom);
 | |
| -		kunmap_coherent();
 | |
| -	} else {
 | |
| -		vfrom = kmap_atomic(from);
 | |
| -		copy_page(vto, vfrom);
 | |
| -		kunmap_atomic(vfrom);
 | |
| -	}
 | |
| -	if ((!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);
 | |
| -	/* Make sure this page is cleared on other CPU's too before using it */
 | |
| -	smp_wmb();
 | |
| -}
 | |
| -
 | |
|  void copy_to_user_page(struct vm_area_struct *vma,
 | |
|  	struct page *page, unsigned long vaddr, void *dst, const void *src,
 | |
|  	unsigned long len)
 |