diff options
Diffstat (limited to 'arch/mips/include/asm/pgtable.h')
| -rw-r--r-- | arch/mips/include/asm/pgtable.h | 31 | 
1 files changed, 19 insertions, 12 deletions
diff --git a/arch/mips/include/asm/pgtable.h b/arch/mips/include/asm/pgtable.h index 1854336e56a..7e40f377817 100644 --- a/arch/mips/include/asm/pgtable.h +++ b/arch/mips/include/asm/pgtable.h @@ -22,23 +22,24 @@ struct mm_struct;  struct vm_area_struct;  #define PAGE_NONE	__pgprot(_PAGE_PRESENT | _CACHE_CACHABLE_NONCOHERENT) -#define PAGE_SHARED	__pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \ +#define PAGE_SHARED	__pgprot(_PAGE_PRESENT | _PAGE_WRITE | (kernel_uses_smartmips_rixi ? 0 : _PAGE_READ) | \  				 _page_cachable_default) -#define PAGE_COPY	__pgprot(_PAGE_PRESENT | _PAGE_READ | \ -				 _page_cachable_default) -#define PAGE_READONLY	__pgprot(_PAGE_PRESENT | _PAGE_READ | \ +#define PAGE_COPY	__pgprot(_PAGE_PRESENT | (kernel_uses_smartmips_rixi ? 0 : _PAGE_READ) | \ +				 (kernel_uses_smartmips_rixi ?  _PAGE_NO_EXEC : 0) | _page_cachable_default) +#define PAGE_READONLY	__pgprot(_PAGE_PRESENT | (kernel_uses_smartmips_rixi ? 0 : _PAGE_READ) | \  				 _page_cachable_default)  #define PAGE_KERNEL	__pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \  				 _PAGE_GLOBAL | _page_cachable_default) -#define PAGE_USERIO	__pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \ +#define PAGE_USERIO	__pgprot(_PAGE_PRESENT | (kernel_uses_smartmips_rixi ? 0 : _PAGE_READ) | _PAGE_WRITE | \  				 _page_cachable_default)  #define PAGE_KERNEL_UNCACHED __pgprot(_PAGE_PRESENT | __READABLE | \  			__WRITEABLE | _PAGE_GLOBAL | _CACHE_UNCACHED)  /* - * MIPS can't do page protection for execute, and considers that the same like - * read. Also, write permissions imply read permissions. This is the closest - * we can get by reasonable means.. + * If _PAGE_NO_EXEC is not defined, we can't do page protection for + * execute, and consider it to be the same as read. Also, write + * permissions imply read permissions. This is the closest we can get + * by reasonable means..   */  /* @@ -177,7 +178,7 @@ static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *pt   */  #define set_pmd(pmdptr, pmdval) do { *(pmdptr) = (pmdval); } while(0) -#ifdef CONFIG_64BIT +#ifndef __PAGETABLE_PMD_FOLDED  /*   * (puds are folded into pgds so this doesn't get actually called,   * but the define is needed for a generic inline function.) @@ -298,8 +299,13 @@ static inline pte_t pte_mkdirty(pte_t pte)  static inline pte_t pte_mkyoung(pte_t pte)  {  	pte_val(pte) |= _PAGE_ACCESSED; -	if (pte_val(pte) & _PAGE_READ) -		pte_val(pte) |= _PAGE_SILENT_READ; +	if (kernel_uses_smartmips_rixi) { +		if (!(pte_val(pte) & _PAGE_NO_READ)) +			pte_val(pte) |= _PAGE_SILENT_READ; +	} else { +		if (pte_val(pte) & _PAGE_READ) +			pte_val(pte) |= _PAGE_SILENT_READ; +	}  	return pte;  } @@ -362,8 +368,9 @@ extern void __update_cache(struct vm_area_struct *vma, unsigned long address,  	pte_t pte);  static inline void update_mmu_cache(struct vm_area_struct *vma, -	unsigned long address, pte_t pte) +	unsigned long address, pte_t *ptep)  { +	pte_t pte = *ptep;  	__update_tlb(vma, address, pte);  	__update_cache(vma, address, pte);  }  |