diff options
Diffstat (limited to 'arch/arm/include/asm/pgtable.h')
| -rw-r--r-- | arch/arm/include/asm/pgtable.h | 88 | 
1 files changed, 54 insertions, 34 deletions
diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h index 8e21ef15bd7..110295c5461 100644 --- a/arch/arm/include/asm/pgtable.h +++ b/arch/arm/include/asm/pgtable.h @@ -164,14 +164,30 @@ extern void __pgd_error(const char *file, int line, unsigned long val);  #define L_PTE_PRESENT		(1 << 0)  #define L_PTE_FILE		(1 << 1)	/* only when !PRESENT */  #define L_PTE_YOUNG		(1 << 1) -#define L_PTE_BUFFERABLE	(1 << 2)	/* matches PTE */ -#define L_PTE_CACHEABLE		(1 << 3)	/* matches PTE */ -#define L_PTE_USER		(1 << 4) -#define L_PTE_WRITE		(1 << 5) -#define L_PTE_EXEC		(1 << 6) -#define L_PTE_DIRTY		(1 << 7) +#define L_PTE_BUFFERABLE	(1 << 2)	/* obsolete, matches PTE */ +#define L_PTE_CACHEABLE		(1 << 3)	/* obsolete, matches PTE */ +#define L_PTE_DIRTY		(1 << 6) +#define L_PTE_WRITE		(1 << 7) +#define L_PTE_USER		(1 << 8) +#define L_PTE_EXEC		(1 << 9)  #define L_PTE_SHARED		(1 << 10)	/* shared(v6), coherent(xsc3) */ +/* + * These are the memory types, defined to be compatible with + * pre-ARMv6 CPUs cacheable and bufferable bits:   XXCB + */ +#define L_PTE_MT_UNCACHED	(0x00 << 2)	/* 0000 */ +#define L_PTE_MT_BUFFERABLE	(0x01 << 2)	/* 0001 */ +#define L_PTE_MT_WRITETHROUGH	(0x02 << 2)	/* 0010 */ +#define L_PTE_MT_WRITEBACK	(0x03 << 2)	/* 0011 */ +#define L_PTE_MT_MINICACHE	(0x06 << 2)	/* 0110 (sa1100, xscale) */ +#define L_PTE_MT_WRITEALLOC	(0x07 << 2)	/* 0111 */ +#define L_PTE_MT_DEV_SHARED	(0x04 << 2)	/* 0100 */ +#define L_PTE_MT_DEV_NONSHARED	(0x0c << 2)	/* 1100 */ +#define L_PTE_MT_DEV_WC		(0x09 << 2)	/* 1001 */ +#define L_PTE_MT_DEV_CACHED	(0x0b << 2)	/* 1011 */ +#define L_PTE_MT_MASK		(0x0f << 2) +  #ifndef __ASSEMBLY__  /* @@ -180,23 +196,30 @@ extern void __pgd_error(const char *file, int line, unsigned long val);   * as well as any architecture dependent bits like global/ASID and SMP   * shared mapping bits.   */ -#define _L_PTE_DEFAULT	L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_CACHEABLE | L_PTE_BUFFERABLE -#define _L_PTE_READ	L_PTE_USER | L_PTE_EXEC +#define _L_PTE_DEFAULT	L_PTE_PRESENT | L_PTE_YOUNG  extern pgprot_t		pgprot_user;  extern pgprot_t		pgprot_kernel; -#define PAGE_NONE	pgprot_user -#define PAGE_COPY	__pgprot(pgprot_val(pgprot_user) | _L_PTE_READ) -#define PAGE_SHARED	__pgprot(pgprot_val(pgprot_user) | _L_PTE_READ | \ -				 L_PTE_WRITE) -#define PAGE_READONLY	__pgprot(pgprot_val(pgprot_user) | _L_PTE_READ) -#define PAGE_KERNEL	pgprot_kernel - -#define __PAGE_NONE	__pgprot(_L_PTE_DEFAULT) -#define __PAGE_COPY	__pgprot(_L_PTE_DEFAULT | _L_PTE_READ) -#define __PAGE_SHARED	__pgprot(_L_PTE_DEFAULT | _L_PTE_READ | L_PTE_WRITE) -#define __PAGE_READONLY	__pgprot(_L_PTE_DEFAULT | _L_PTE_READ) +#define _MOD_PROT(p, b)	__pgprot(pgprot_val(p) | (b)) + +#define PAGE_NONE		pgprot_user +#define PAGE_SHARED		_MOD_PROT(pgprot_user, L_PTE_USER | L_PTE_WRITE) +#define PAGE_SHARED_EXEC	_MOD_PROT(pgprot_user, L_PTE_USER | L_PTE_WRITE | L_PTE_EXEC) +#define PAGE_COPY		_MOD_PROT(pgprot_user, L_PTE_USER) +#define PAGE_COPY_EXEC		_MOD_PROT(pgprot_user, L_PTE_USER | L_PTE_EXEC) +#define PAGE_READONLY		_MOD_PROT(pgprot_user, L_PTE_USER) +#define PAGE_READONLY_EXEC	_MOD_PROT(pgprot_user, L_PTE_USER | L_PTE_EXEC) +#define PAGE_KERNEL		pgprot_kernel +#define PAGE_KERNEL_EXEC	_MOD_PROT(pgprot_kernel, L_PTE_EXEC) + +#define __PAGE_NONE		__pgprot(_L_PTE_DEFAULT) +#define __PAGE_SHARED		__pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_WRITE) +#define __PAGE_SHARED_EXEC	__pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_WRITE | L_PTE_EXEC) +#define __PAGE_COPY		__pgprot(_L_PTE_DEFAULT | L_PTE_USER) +#define __PAGE_COPY_EXEC	__pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_EXEC) +#define __PAGE_READONLY		__pgprot(_L_PTE_DEFAULT | L_PTE_USER) +#define __PAGE_READONLY_EXEC	__pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_EXEC)  #endif /* __ASSEMBLY__ */ @@ -212,19 +235,19 @@ extern pgprot_t		pgprot_kernel;  #define __P001  __PAGE_READONLY  #define __P010  __PAGE_COPY  #define __P011  __PAGE_COPY -#define __P100  __PAGE_READONLY -#define __P101  __PAGE_READONLY -#define __P110  __PAGE_COPY -#define __P111  __PAGE_COPY +#define __P100  __PAGE_READONLY_EXEC +#define __P101  __PAGE_READONLY_EXEC +#define __P110  __PAGE_COPY_EXEC +#define __P111  __PAGE_COPY_EXEC  #define __S000  __PAGE_NONE  #define __S001  __PAGE_READONLY  #define __S010  __PAGE_SHARED  #define __S011  __PAGE_SHARED -#define __S100  __PAGE_READONLY -#define __S101  __PAGE_READONLY -#define __S110  __PAGE_SHARED -#define __S111  __PAGE_SHARED +#define __S100  __PAGE_READONLY_EXEC +#define __S101  __PAGE_READONLY_EXEC +#define __S110  __PAGE_SHARED_EXEC +#define __S111  __PAGE_SHARED_EXEC  #ifndef __ASSEMBLY__  /* @@ -286,8 +309,10 @@ static inline pte_t pte_mkspecial(pte_t pte) { return pte; }  /*   * Mark the prot value as uncacheable and unbufferable.   */ -#define pgprot_noncached(prot)	__pgprot(pgprot_val(prot) & ~(L_PTE_CACHEABLE | L_PTE_BUFFERABLE)) -#define pgprot_writecombine(prot) __pgprot(pgprot_val(prot) & ~L_PTE_CACHEABLE) +#define pgprot_noncached(prot) \ +	__pgprot((pgprot_val(prot) & ~L_PTE_MT_MASK) | L_PTE_MT_UNCACHED) +#define pgprot_writecombine(prot) \ +	__pgprot((pgprot_val(prot) & ~L_PTE_MT_MASK) | L_PTE_MT_BUFFERABLE)  #define pmd_none(pmd)		(!pmd_val(pmd))  #define pmd_present(pmd)	(pmd_val(pmd)) @@ -320,11 +345,6 @@ static inline pte_t *pmd_page_vaddr(pmd_t pmd)  #define pmd_page(pmd) virt_to_page(__va(pmd_val(pmd)))  /* - * Permanent address of a page. We never have highmem, so this is trivial. - */ -#define pages_to_mb(x)		((x) >> (20 - PAGE_SHIFT)) - -/*   * Conversion functions: convert a page and protection to a page entry,   * and a page entry and page directory to the page they refer to.   */  | 
