| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  *  linux/include/asm-arm/page.h | 
 | 3 |  * | 
 | 4 |  *  Copyright (C) 1995-2003 Russell King | 
 | 5 |  * | 
 | 6 |  * This program is free software; you can redistribute it and/or modify | 
 | 7 |  * it under the terms of the GNU General Public License version 2 as | 
 | 8 |  * published by the Free Software Foundation. | 
 | 9 |  */ | 
 | 10 | #ifndef _ASMARM_PAGE_H | 
 | 11 | #define _ASMARM_PAGE_H | 
 | 12 |  | 
 | 13 | #include <linux/config.h> | 
 | 14 |  | 
 | 15 | /* PAGE_SHIFT determines the page size */ | 
 | 16 | #define PAGE_SHIFT		12 | 
 | 17 | #define PAGE_SIZE		(1UL << PAGE_SHIFT) | 
 | 18 | #define PAGE_MASK		(~(PAGE_SIZE-1)) | 
 | 19 |  | 
 | 20 | #ifdef __KERNEL__ | 
 | 21 |  | 
 | 22 | /* to align the pointer to the (next) page boundary */ | 
 | 23 | #define PAGE_ALIGN(addr)	(((addr)+PAGE_SIZE-1)&PAGE_MASK) | 
 | 24 |  | 
 | 25 | #ifndef __ASSEMBLY__ | 
 | 26 |  | 
 | 27 | #include <asm/glue.h> | 
 | 28 |  | 
 | 29 | /* | 
 | 30 |  *	User Space Model | 
 | 31 |  *	================ | 
 | 32 |  * | 
 | 33 |  *	This section selects the correct set of functions for dealing with | 
 | 34 |  *	page-based copying and clearing for user space for the particular | 
 | 35 |  *	processor(s) we're building for. | 
 | 36 |  * | 
 | 37 |  *	We have the following to choose from: | 
 | 38 |  *	  v3		- ARMv3 | 
 | 39 |  *	  v4wt		- ARMv4 with writethrough cache, without minicache | 
 | 40 |  *	  v4wb		- ARMv4 with writeback cache, without minicache | 
 | 41 |  *	  v4_mc		- ARMv4 with minicache | 
 | 42 |  *	  xscale	- Xscale | 
 | 43 |  */ | 
 | 44 | #undef _USER | 
 | 45 | #undef MULTI_USER | 
 | 46 |  | 
 | 47 | #ifdef CONFIG_CPU_COPY_V3 | 
 | 48 | # ifdef _USER | 
 | 49 | #  define MULTI_USER 1 | 
 | 50 | # else | 
 | 51 | #  define _USER v3 | 
 | 52 | # endif | 
 | 53 | #endif | 
 | 54 |  | 
 | 55 | #ifdef CONFIG_CPU_COPY_V4WT | 
 | 56 | # ifdef _USER | 
 | 57 | #  define MULTI_USER 1 | 
 | 58 | # else | 
 | 59 | #  define _USER v4wt | 
 | 60 | # endif | 
 | 61 | #endif | 
 | 62 |  | 
 | 63 | #ifdef CONFIG_CPU_COPY_V4WB | 
 | 64 | # ifdef _USER | 
 | 65 | #  define MULTI_USER 1 | 
 | 66 | # else | 
 | 67 | #  define _USER v4wb | 
 | 68 | # endif | 
 | 69 | #endif | 
 | 70 |  | 
 | 71 | #ifdef CONFIG_CPU_SA1100 | 
 | 72 | # ifdef _USER | 
 | 73 | #  define MULTI_USER 1 | 
 | 74 | # else | 
 | 75 | #  define _USER v4_mc | 
 | 76 | # endif | 
 | 77 | #endif | 
 | 78 |  | 
 | 79 | #ifdef CONFIG_CPU_XSCALE | 
 | 80 | # ifdef _USER | 
 | 81 | #  define MULTI_USER 1 | 
 | 82 | # else | 
 | 83 | #  define _USER xscale_mc | 
 | 84 | # endif | 
 | 85 | #endif | 
 | 86 |  | 
 | 87 | #ifdef CONFIG_CPU_COPY_V6 | 
 | 88 | # define MULTI_USER 1 | 
 | 89 | #endif | 
 | 90 |  | 
 | 91 | #if !defined(_USER) && !defined(MULTI_USER) | 
 | 92 | #error Unknown user operations model | 
 | 93 | #endif | 
 | 94 |  | 
 | 95 | struct cpu_user_fns { | 
 | 96 | 	void (*cpu_clear_user_page)(void *p, unsigned long user); | 
 | 97 | 	void (*cpu_copy_user_page)(void *to, const void *from, | 
 | 98 | 				   unsigned long user); | 
 | 99 | }; | 
 | 100 |  | 
 | 101 | #ifdef MULTI_USER | 
 | 102 | extern struct cpu_user_fns cpu_user; | 
 | 103 |  | 
 | 104 | #define __cpu_clear_user_page	cpu_user.cpu_clear_user_page | 
 | 105 | #define __cpu_copy_user_page	cpu_user.cpu_copy_user_page | 
 | 106 |  | 
 | 107 | #else | 
 | 108 |  | 
 | 109 | #define __cpu_clear_user_page	__glue(_USER,_clear_user_page) | 
 | 110 | #define __cpu_copy_user_page	__glue(_USER,_copy_user_page) | 
 | 111 |  | 
 | 112 | extern void __cpu_clear_user_page(void *p, unsigned long user); | 
 | 113 | extern void __cpu_copy_user_page(void *to, const void *from, | 
 | 114 | 				 unsigned long user); | 
 | 115 | #endif | 
 | 116 |  | 
| Russell King | d2bab05 | 2005-05-10 14:23:01 +0100 | [diff] [blame] | 117 | #define clear_user_page(addr,vaddr,pg)	 __cpu_clear_user_page(addr, vaddr) | 
 | 118 | #define copy_user_page(to,from,vaddr,pg) __cpu_copy_user_page(to, from, vaddr) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 119 |  | 
 | 120 | #define clear_page(page)	memzero((void *)(page), PAGE_SIZE) | 
 | 121 | extern void copy_page(void *to, const void *from); | 
 | 122 |  | 
 | 123 | #undef STRICT_MM_TYPECHECKS | 
 | 124 |  | 
 | 125 | #ifdef STRICT_MM_TYPECHECKS | 
 | 126 | /* | 
 | 127 |  * These are used to make use of C type-checking.. | 
 | 128 |  */ | 
 | 129 | typedef struct { unsigned long pte; } pte_t; | 
 | 130 | typedef struct { unsigned long pmd; } pmd_t; | 
 | 131 | typedef struct { unsigned long pgd[2]; } pgd_t; | 
 | 132 | typedef struct { unsigned long pgprot; } pgprot_t; | 
 | 133 |  | 
 | 134 | #define pte_val(x)      ((x).pte) | 
 | 135 | #define pmd_val(x)      ((x).pmd) | 
 | 136 | #define pgd_val(x)	((x).pgd[0]) | 
 | 137 | #define pgprot_val(x)   ((x).pgprot) | 
 | 138 |  | 
 | 139 | #define __pte(x)        ((pte_t) { (x) } ) | 
 | 140 | #define __pmd(x)        ((pmd_t) { (x) } ) | 
 | 141 | #define __pgprot(x)     ((pgprot_t) { (x) } ) | 
 | 142 |  | 
 | 143 | #else | 
 | 144 | /* | 
 | 145 |  * .. while these make it easier on the compiler | 
 | 146 |  */ | 
 | 147 | typedef unsigned long pte_t; | 
 | 148 | typedef unsigned long pmd_t; | 
 | 149 | typedef unsigned long pgd_t[2]; | 
 | 150 | typedef unsigned long pgprot_t; | 
 | 151 |  | 
 | 152 | #define pte_val(x)      (x) | 
 | 153 | #define pmd_val(x)      (x) | 
 | 154 | #define pgd_val(x)	((x)[0]) | 
 | 155 | #define pgprot_val(x)   (x) | 
 | 156 |  | 
 | 157 | #define __pte(x)        (x) | 
 | 158 | #define __pmd(x)        (x) | 
 | 159 | #define __pgprot(x)     (x) | 
 | 160 |  | 
 | 161 | #endif /* STRICT_MM_TYPECHECKS */ | 
 | 162 |  | 
| Russell King | c4e1f6f | 2005-05-10 10:40:19 +0100 | [diff] [blame] | 163 | /* the upper-most page table pointer */ | 
 | 164 | extern pmd_t *top_pmd; | 
 | 165 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 166 | #include <asm/memory.h> | 
 | 167 |  | 
 | 168 | #endif /* !__ASSEMBLY__ */ | 
 | 169 |  | 
 | 170 | #define VM_DATA_DEFAULT_FLAGS	(VM_READ | VM_WRITE | VM_EXEC | \ | 
 | 171 | 				 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) | 
 | 172 |  | 
 | 173 | #endif /* __KERNEL__ */ | 
 | 174 |  | 
| Stephen Rothwell | fd4fd5a | 2005-09-03 15:54:30 -0700 | [diff] [blame] | 175 | #include <asm-generic/page.h> | 
 | 176 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 177 | #endif |