Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 #ifndef _ASM_X86_PGTABLE_DEFS_H
  2 #define _ASM_X86_PGTABLE_DEFS_H
  3 
  4 #include <linux/const.h>
  5 #include <asm/page_types.h>
  6 
  7 #define FIRST_USER_ADDRESS      0
  8 
  9 #define _PAGE_BIT_PRESENT       0       /* is present */
 10 #define _PAGE_BIT_RW            1       /* writeable */
 11 #define _PAGE_BIT_USER          2       /* userspace addressable */
 12 #define _PAGE_BIT_PWT           3       /* page write through */
 13 #define _PAGE_BIT_PCD           4       /* page cache disabled */
 14 #define _PAGE_BIT_ACCESSED      5       /* was accessed (raised by CPU) */
 15 #define _PAGE_BIT_DIRTY         6       /* was written to (raised by CPU) */
 16 #define _PAGE_BIT_PSE           7       /* 4 MB (or 2MB) page */
 17 #define _PAGE_BIT_PAT           7       /* on 4KB pages */
 18 #define _PAGE_BIT_GLOBAL        8       /* Global TLB entry PPro+ */
 19 #define _PAGE_BIT_UNUSED1       9       /* available for programmer */
 20 #define _PAGE_BIT_IOMAP         10      /* flag used to indicate IO mapping */
 21 #define _PAGE_BIT_HIDDEN        11      /* hidden by kmemcheck */
 22 #define _PAGE_BIT_PAT_LARGE     12      /* On 2MB or 1GB pages */
 23 #define _PAGE_BIT_SPECIAL       _PAGE_BIT_UNUSED1
 24 #define _PAGE_BIT_CPA_TEST      _PAGE_BIT_UNUSED1
 25 #define _PAGE_BIT_NX           63       /* No execute: only valid after cpuid check */
 26 
 27 /* If _PAGE_BIT_PRESENT is clear, we use these: */
 28 /* - if the user mapped it with PROT_NONE; pte_present gives true */
 29 #define _PAGE_BIT_PROTNONE      _PAGE_BIT_GLOBAL
 30 /* - set: nonlinear file mapping, saved PTE; unset:swap */
 31 #define _PAGE_BIT_FILE          _PAGE_BIT_DIRTY
 32 
 33 #define _PAGE_PRESENT   (_AT(pteval_t, 1) << _PAGE_BIT_PRESENT)
 34 #define _PAGE_RW        (_AT(pteval_t, 1) << _PAGE_BIT_RW)
 35 #define _PAGE_USER      (_AT(pteval_t, 1) << _PAGE_BIT_USER)
 36 #define _PAGE_PWT       (_AT(pteval_t, 1) << _PAGE_BIT_PWT)
 37 #define _PAGE_PCD       (_AT(pteval_t, 1) << _PAGE_BIT_PCD)
 38 #define _PAGE_ACCESSED  (_AT(pteval_t, 1) << _PAGE_BIT_ACCESSED)
 39 #define _PAGE_DIRTY     (_AT(pteval_t, 1) << _PAGE_BIT_DIRTY)
 40 #define _PAGE_PSE       (_AT(pteval_t, 1) << _PAGE_BIT_PSE)
 41 #define _PAGE_GLOBAL    (_AT(pteval_t, 1) << _PAGE_BIT_GLOBAL)
 42 #define _PAGE_UNUSED1   (_AT(pteval_t, 1) << _PAGE_BIT_UNUSED1)
 43 #define _PAGE_IOMAP     (_AT(pteval_t, 1) << _PAGE_BIT_IOMAP)
 44 #define _PAGE_PAT       (_AT(pteval_t, 1) << _PAGE_BIT_PAT)
 45 #define _PAGE_PAT_LARGE (_AT(pteval_t, 1) << _PAGE_BIT_PAT_LARGE)
 46 #define _PAGE_SPECIAL   (_AT(pteval_t, 1) << _PAGE_BIT_SPECIAL)
 47 #define _PAGE_CPA_TEST  (_AT(pteval_t, 1) << _PAGE_BIT_CPA_TEST)
 48 #define __HAVE_ARCH_PTE_SPECIAL
 49 
 50 #ifdef CONFIG_KMEMCHECK
 51 #define _PAGE_HIDDEN    (_AT(pteval_t, 1) << _PAGE_BIT_HIDDEN)
 52 #else
 53 #define _PAGE_HIDDEN    (_AT(pteval_t, 0))
 54 #endif
 55 
 56 #if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
 57 #define _PAGE_NX        (_AT(pteval_t, 1) << _PAGE_BIT_NX)
 58 #else
 59 #define _PAGE_NX        (_AT(pteval_t, 0))
 60 #endif
 61 
 62 #define _PAGE_FILE      (_AT(pteval_t, 1) << _PAGE_BIT_FILE)
 63 #define _PAGE_PROTNONE  (_AT(pteval_t, 1) << _PAGE_BIT_PROTNONE)
 64 
 65 #define _PAGE_TABLE     (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER |        \
 66                          _PAGE_ACCESSED | _PAGE_DIRTY)
 67 #define _KERNPG_TABLE   (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED |    \
 68                          _PAGE_DIRTY)
 69 
 70 /* Set of bits not changed in pte_modify */
 71 #define _PAGE_CHG_MASK  (PTE_PFN_MASK | _PAGE_PCD | _PAGE_PWT |         \
 72                          _PAGE_SPECIAL | _PAGE_ACCESSED | _PAGE_DIRTY)
 73 
 74 #define _PAGE_CACHE_MASK        (_PAGE_PCD | _PAGE_PWT)
 75 #define _PAGE_CACHE_WB          (0)
 76 #define _PAGE_CACHE_WC          (_PAGE_PWT)
 77 #define _PAGE_CACHE_UC_MINUS    (_PAGE_PCD)
 78 #define _PAGE_CACHE_UC          (_PAGE_PCD | _PAGE_PWT)
 79 
 80 #define PAGE_NONE       __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED)
 81 #define PAGE_SHARED     __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | \
 82                                  _PAGE_ACCESSED | _PAGE_NX)
 83 
 84 #define PAGE_SHARED_EXEC        __pgprot(_PAGE_PRESENT | _PAGE_RW |     \
 85                                          _PAGE_USER | _PAGE_ACCESSED)
 86 #define PAGE_COPY_NOEXEC        __pgprot(_PAGE_PRESENT | _PAGE_USER |   \
 87                                          _PAGE_ACCESSED | _PAGE_NX)
 88 #define PAGE_COPY_EXEC          __pgprot(_PAGE_PRESENT | _PAGE_USER |   \
 89                                          _PAGE_ACCESSED)
 90 #define PAGE_COPY               PAGE_COPY_NOEXEC
 91 #define PAGE_READONLY           __pgprot(_PAGE_PRESENT | _PAGE_USER |   \
 92                                          _PAGE_ACCESSED | _PAGE_NX)
 93 #define PAGE_READONLY_EXEC      __pgprot(_PAGE_PRESENT | _PAGE_USER |   \
 94                                          _PAGE_ACCESSED)
 95 
 96 #define __PAGE_KERNEL_EXEC                                              \
 97         (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_GLOBAL)
 98 #define __PAGE_KERNEL           (__PAGE_KERNEL_EXEC | _PAGE_NX)
 99 
100 #define __PAGE_KERNEL_RO                (__PAGE_KERNEL & ~_PAGE_RW)
101 #define __PAGE_KERNEL_RX                (__PAGE_KERNEL_EXEC & ~_PAGE_RW)
102 #define __PAGE_KERNEL_EXEC_NOCACHE      (__PAGE_KERNEL_EXEC | _PAGE_PCD | _PAGE_PWT)
103 #define __PAGE_KERNEL_WC                (__PAGE_KERNEL | _PAGE_CACHE_WC)
104 #define __PAGE_KERNEL_NOCACHE           (__PAGE_KERNEL | _PAGE_PCD | _PAGE_PWT)
105 #define __PAGE_KERNEL_UC_MINUS          (__PAGE_KERNEL | _PAGE_PCD)
106 #define __PAGE_KERNEL_VSYSCALL          (__PAGE_KERNEL_RX | _PAGE_USER)
107 #define __PAGE_KERNEL_VSYSCALL_NOCACHE  (__PAGE_KERNEL_VSYSCALL | _PAGE_PCD | _PAGE_PWT)
108 #define __PAGE_KERNEL_LARGE             (__PAGE_KERNEL | _PAGE_PSE)
109 #define __PAGE_KERNEL_LARGE_NOCACHE     (__PAGE_KERNEL | _PAGE_CACHE_UC | _PAGE_PSE)
110 #define __PAGE_KERNEL_LARGE_EXEC        (__PAGE_KERNEL_EXEC | _PAGE_PSE)
111 
112 #define __PAGE_KERNEL_IO                (__PAGE_KERNEL | _PAGE_IOMAP)
113 #define __PAGE_KERNEL_IO_NOCACHE        (__PAGE_KERNEL_NOCACHE | _PAGE_IOMAP)
114 #define __PAGE_KERNEL_IO_UC_MINUS       (__PAGE_KERNEL_UC_MINUS | _PAGE_IOMAP)
115 #define __PAGE_KERNEL_IO_WC             (__PAGE_KERNEL_WC | _PAGE_IOMAP)
116 
117 #define PAGE_KERNEL                     __pgprot(__PAGE_KERNEL)
118 #define PAGE_KERNEL_RO                  __pgprot(__PAGE_KERNEL_RO)
119 #define PAGE_KERNEL_EXEC                __pgprot(__PAGE_KERNEL_EXEC)
120 #define PAGE_KERNEL_RX                  __pgprot(__PAGE_KERNEL_RX)
121 #define PAGE_KERNEL_WC                  __pgprot(__PAGE_KERNEL_WC)
122 #define PAGE_KERNEL_NOCACHE             __pgprot(__PAGE_KERNEL_NOCACHE)
123 #define PAGE_KERNEL_UC_MINUS            __pgprot(__PAGE_KERNEL_UC_MINUS)
124 #define PAGE_KERNEL_EXEC_NOCACHE        __pgprot(__PAGE_KERNEL_EXEC_NOCACHE)
125 #define PAGE_KERNEL_LARGE               __pgprot(__PAGE_KERNEL_LARGE)
126 #define PAGE_KERNEL_LARGE_NOCACHE       __pgprot(__PAGE_KERNEL_LARGE_NOCACHE)
127 #define PAGE_KERNEL_LARGE_EXEC          __pgprot(__PAGE_KERNEL_LARGE_EXEC)
128 #define PAGE_KERNEL_VSYSCALL            __pgprot(__PAGE_KERNEL_VSYSCALL)
129 #define PAGE_KERNEL_VSYSCALL_NOCACHE    __pgprot(__PAGE_KERNEL_VSYSCALL_NOCACHE)
130 
131 #define PAGE_KERNEL_IO                  __pgprot(__PAGE_KERNEL_IO)
132 #define PAGE_KERNEL_IO_NOCACHE          __pgprot(__PAGE_KERNEL_IO_NOCACHE)
133 #define PAGE_KERNEL_IO_UC_MINUS         __pgprot(__PAGE_KERNEL_IO_UC_MINUS)
134 #define PAGE_KERNEL_IO_WC               __pgprot(__PAGE_KERNEL_IO_WC)
135 
136 /*         xwr */
137 #define __P000  PAGE_NONE
138 #define __P001  PAGE_READONLY
139 #define __P010  PAGE_COPY
140 #define __P011  PAGE_COPY
141 #define __P100  PAGE_READONLY_EXEC
142 #define __P101  PAGE_READONLY_EXEC
143 #define __P110  PAGE_COPY_EXEC
144 #define __P111  PAGE_COPY_EXEC
145 
146 #define __S000  PAGE_NONE
147 #define __S001  PAGE_READONLY
148 #define __S010  PAGE_SHARED
149 #define __S011  PAGE_SHARED
150 #define __S100  PAGE_READONLY_EXEC
151 #define __S101  PAGE_READONLY_EXEC
152 #define __S110  PAGE_SHARED_EXEC
153 #define __S111  PAGE_SHARED_EXEC
154 
155 /*
156  * early identity mapping  pte attrib macros.
157  */
158 #ifdef CONFIG_X86_64
159 #define __PAGE_KERNEL_IDENT_LARGE_EXEC  __PAGE_KERNEL_LARGE_EXEC
160 #else
161 /*
162  * For PDE_IDENT_ATTR include USER bit. As the PDE and PTE protection
163  * bits are combined, this will alow user to access the high address mapped
164  * VDSO in the presence of CONFIG_COMPAT_VDSO
165  */
166 #define PTE_IDENT_ATTR   0x003          /* PRESENT+RW */
167 #define PDE_IDENT_ATTR   0x067          /* PRESENT+RW+USER+DIRTY+ACCESSED */
168 #define PGD_IDENT_ATTR   0x001          /* PRESENT (no other attributes) */
169 #endif
170 
171 #ifdef CONFIG_X86_32
172 # include "pgtable_32_types.h"
173 #else
174 # include "pgtable_64_types.h"
175 #endif
176 
177 #ifndef __ASSEMBLY__
178 
179 #include <linux/types.h>
180 
181 /* PTE_PFN_MASK extracts the PFN from a (pte|pmd|pud|pgd)val_t */
182 #define PTE_PFN_MASK            ((pteval_t)PHYSICAL_PAGE_MASK)
183 
184 /* PTE_FLAGS_MASK extracts the flags from a (pte|pmd|pud|pgd)val_t */
185 #define PTE_FLAGS_MASK          (~PTE_PFN_MASK)
186 
187 typedef struct pgprot { pgprotval_t pgprot; } pgprot_t;
188 
189 typedef struct { pgdval_t pgd; } pgd_t;
190 
191 static inline pgd_t native_make_pgd(pgdval_t val)
192 {
193         return (pgd_t) { val };
194 }
195 
196 static inline pgdval_t native_pgd_val(pgd_t pgd)
197 {
198         return pgd.pgd;
199 }
200 
201 static inline pgdval_t pgd_flags(pgd_t pgd)
202 {
203         return native_pgd_val(pgd) & PTE_FLAGS_MASK;
204 }
205 
206 #if PAGETABLE_LEVELS > 3
207 typedef struct { pudval_t pud; } pud_t;
208 
209 static inline pud_t native_make_pud(pmdval_t val)
210 {
211         return (pud_t) { val };
212 }
213 
214 static inline pudval_t native_pud_val(pud_t pud)
215 {
216         return pud.pud;
217 }
218 #else
219 #include <asm-generic/pgtable-nopud.h>
220 
221 static inline pudval_t native_pud_val(pud_t pud)
222 {
223         return native_pgd_val(pud.pgd);
224 }
225 #endif
226 
227 #if PAGETABLE_LEVELS > 2
228 typedef struct { pmdval_t pmd; } pmd_t;
229 
230 static inline pmd_t native_make_pmd(pmdval_t val)
231 {
232         return (pmd_t) { val };
233 }
234 
235 static inline pmdval_t native_pmd_val(pmd_t pmd)
236 {
237         return pmd.pmd;
238 }
239 #else
240 #include <asm-generic/pgtable-nopmd.h>
241 
242 static inline pmdval_t native_pmd_val(pmd_t pmd)
243 {
244         return native_pgd_val(pmd.pud.pgd);
245 }
246 #endif
247 
248 static inline pudval_t pud_flags(pud_t pud)
249 {
250         return native_pud_val(pud) & PTE_FLAGS_MASK;
251 }
252 
253 static inline pmdval_t pmd_flags(pmd_t pmd)
254 {
255         return native_pmd_val(pmd) & PTE_FLAGS_MASK;
256 }
257 
258 static inline pte_t native_make_pte(pteval_t val)
259 {
260         return (pte_t) { .pte = val };
261 }
262 
263 static inline pteval_t native_pte_val(pte_t pte)
264 {
265         return pte.pte;
266 }
267 
268 static inline pteval_t pte_flags(pte_t pte)
269 {
270         return native_pte_val(pte) & PTE_FLAGS_MASK;
271 }
272 
273 #define pgprot_val(x)   ((x).pgprot)
274 #define __pgprot(x)     ((pgprot_t) { (x) } )
275 
276 
277 typedef struct page *pgtable_t;
278 
279 extern pteval_t __supported_pte_mask;
280 extern int nx_enabled;
281 
282 #define pgprot_writecombine     pgprot_writecombine
283 extern pgprot_t pgprot_writecombine(pgprot_t prot);
284 
285 /* Indicate that x86 has its own track and untrack pfn vma functions */
286 #define __HAVE_PFNMAP_TRACKING
287 
288 #define __HAVE_PHYS_MEM_ACCESS_PROT
289 struct file;
290 pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
291                               unsigned long size, pgprot_t vma_prot);
292 int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
293                               unsigned long size, pgprot_t *vma_prot);
294 
295 /* Install a pte for a particular vaddr in kernel space. */
296 void set_pte_vaddr(unsigned long vaddr, pte_t pte);
297 
298 #ifdef CONFIG_X86_32
299 extern void native_pagetable_setup_start(pgd_t *base);
300 extern void native_pagetable_setup_done(pgd_t *base);
301 #else
302 static inline void native_pagetable_setup_start(pgd_t *base) {}
303 static inline void native_pagetable_setup_done(pgd_t *base) {}
304 #endif
305 
306 struct seq_file;
307 extern void arch_report_meminfo(struct seq_file *m);
308 
309 enum {
310         PG_LEVEL_NONE,
311         PG_LEVEL_4K,
312         PG_LEVEL_2M,
313         PG_LEVEL_1G,
314         PG_LEVEL_NUM
315 };
316 
317 #ifdef CONFIG_PROC_FS
318 extern void update_page_count(int level, unsigned long pages);
319 #else
320 static inline void update_page_count(int level, unsigned long pages) { }
321 #endif
322 
323 /*
324  * Helper function that returns the kernel pagetable entry controlling
325  * the virtual address 'address'. NULL means no pagetable entry present.
326  * NOTE: the return type is pte_t but if the pmd is PSE then we return it
327  * as a pte too.
328  */
329 extern pte_t *lookup_address(unsigned long address, unsigned int *level);
330 
331 #endif  /* !__ASSEMBLY__ */
332 
333 #endif /* _ASM_X86_PGTABLE_DEFS_H */
334 
  This page was automatically generated by the LXR engine.