diff options
Diffstat (limited to 'arch/arm/include/asm/pgtable.h')
| -rw-r--r-- | arch/arm/include/asm/pgtable.h | 40 | 
1 files changed, 21 insertions, 19 deletions
diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h index f66626d71e7..41dc31f834c 100644 --- a/arch/arm/include/asm/pgtable.h +++ b/arch/arm/include/asm/pgtable.h @@ -195,6 +195,18 @@ static inline pte_t *pmd_page_vaddr(pmd_t pmd)  #define pte_clear(mm,addr,ptep)	set_pte_ext(ptep, __pte(0), 0) +#define pte_none(pte)		(!pte_val(pte)) +#define pte_present(pte)	(pte_val(pte) & L_PTE_PRESENT) +#define pte_write(pte)		(!(pte_val(pte) & L_PTE_RDONLY)) +#define pte_dirty(pte)		(pte_val(pte) & L_PTE_DIRTY) +#define pte_young(pte)		(pte_val(pte) & L_PTE_YOUNG) +#define pte_exec(pte)		(!(pte_val(pte) & L_PTE_XN)) +#define pte_special(pte)	(0) + +#define pte_present_user(pte) \ +	((pte_val(pte) & (L_PTE_PRESENT | L_PTE_USER)) == \ +	 (L_PTE_PRESENT | L_PTE_USER)) +  #if __LINUX_ARM_ARCH__ < 6  static inline void __sync_icache_dcache(pte_t pteval)  { @@ -206,25 +218,15 @@ extern void __sync_icache_dcache(pte_t pteval);  static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,  			      pte_t *ptep, pte_t pteval)  { -	if (addr >= TASK_SIZE) -		set_pte_ext(ptep, pteval, 0); -	else { +	unsigned long ext = 0; + +	if (addr < TASK_SIZE && pte_present_user(pteval)) {  		__sync_icache_dcache(pteval); -		set_pte_ext(ptep, pteval, PTE_EXT_NG); +		ext |= PTE_EXT_NG;  	} -} -#define pte_none(pte)		(!pte_val(pte)) -#define pte_present(pte)	(pte_val(pte) & L_PTE_PRESENT) -#define pte_write(pte)		(!(pte_val(pte) & L_PTE_RDONLY)) -#define pte_dirty(pte)		(pte_val(pte) & L_PTE_DIRTY) -#define pte_young(pte)		(pte_val(pte) & L_PTE_YOUNG) -#define pte_exec(pte)		(!(pte_val(pte) & L_PTE_XN)) -#define pte_special(pte)	(0) - -#define pte_present_user(pte) \ -	((pte_val(pte) & (L_PTE_PRESENT | L_PTE_USER)) == \ -	 (L_PTE_PRESENT | L_PTE_USER)) +	set_pte_ext(ptep, pteval, ext); +}  #define PTE_BIT_FUNC(fn,op) \  static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; } @@ -251,13 +253,13 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)   *   *   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1   *   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 - *   <--------------- offset --------------------> <- type --> 0 0 0 + *   <--------------- offset ----------------------> < type -> 0 0 0   * - * This gives us up to 63 swap files and 32GB per swap file.  Note that + * This gives us up to 31 swap files and 64GB per swap file.  Note that   * the offset field is always non-zero.   */  #define __SWP_TYPE_SHIFT	3 -#define __SWP_TYPE_BITS		6 +#define __SWP_TYPE_BITS		5  #define __SWP_TYPE_MASK		((1 << __SWP_TYPE_BITS) - 1)  #define __SWP_OFFSET_SHIFT	(__SWP_TYPE_BITS + __SWP_TYPE_SHIFT)  |