x86: page.h: move and unify types for pagetable entry, #1
[safe/jmp/linux-2.6] / include / asm-x86 / page_32.h
1 #ifndef _I386_PAGE_H
2 #define _I386_PAGE_H
3
4 #ifdef __KERNEL__
5 #ifndef __ASSEMBLY__
6
7 /*
8  * These are used to make use of C type-checking..
9  */
10 extern int nx_enabled;
11
12 #ifdef CONFIG_X86_PAE
13 typedef struct { unsigned long pte_low, pte_high; } pte_t;
14 typedef struct { unsigned long long pmd; } pmd_t;
15 typedef struct { unsigned long long pgd; } pgd_t;
16 typedef struct { unsigned long long pgprot; } pgprot_t;
17
18 static inline unsigned long long native_pgd_val(pgd_t pgd)
19 {
20         return pgd.pgd;
21 }
22
23 static inline unsigned long long native_pmd_val(pmd_t pmd)
24 {
25         return pmd.pmd;
26 }
27
28 static inline unsigned long long native_pte_val(pte_t pte)
29 {
30         return pte.pte_low | ((unsigned long long)pte.pte_high << 32);
31 }
32
33 static inline pgd_t native_make_pgd(unsigned long long val)
34 {
35         return (pgd_t) { val };
36 }
37
38 static inline pmd_t native_make_pmd(unsigned long long val)
39 {
40         return (pmd_t) { val };
41 }
42
43 static inline pte_t native_make_pte(unsigned long long val)
44 {
45         return (pte_t) { .pte_low = val, .pte_high = (val >> 32) } ;
46 }
47
48 #ifndef CONFIG_PARAVIRT
49 #define pmd_val(x)      native_pmd_val(x)
50 #define __pmd(x)        native_make_pmd(x)
51 #endif
52
53 #include <asm-generic/pgtable-nopud.h>
54 #else  /* !CONFIG_X86_PAE */
55 typedef struct { unsigned long pte_low; } pte_t;
56 typedef struct { unsigned long pgd; } pgd_t;
57 typedef struct { unsigned long pgprot; } pgprot_t;
58 #define boot_pte_t pte_t /* or would you rather have a typedef */
59
60 static inline unsigned long native_pgd_val(pgd_t pgd)
61 {
62         return pgd.pgd;
63 }
64
65 static inline unsigned long native_pte_val(pte_t pte)
66 {
67         return pte.pte_low;
68 }
69
70 static inline pgd_t native_make_pgd(unsigned long val)
71 {
72         return (pgd_t) { val };
73 }
74
75 static inline pte_t native_make_pte(unsigned long val)
76 {
77         return (pte_t) { .pte_low = val };
78 }
79
80 #include <asm-generic/pgtable-nopmd.h>
81 #endif  /* CONFIG_X86_PAE */
82
83 #define PTE_MASK        PAGE_MASK
84
85 #define pgprot_val(x)   ((x).pgprot)
86 #define __pgprot(x)     ((pgprot_t) { (x) } )
87
88 #ifndef CONFIG_PARAVIRT
89 #define pgd_val(x)      native_pgd_val(x)
90 #define __pgd(x)        native_make_pgd(x)
91 #define pte_val(x)      native_pte_val(x)
92 #define __pte(x)        native_make_pte(x)
93 #endif
94
95 #endif /* !__ASSEMBLY__ */
96
97 #ifndef __ASSEMBLY__
98
99 struct vm_area_struct;
100
101 /*
102  * This much address space is reserved for vmalloc() and iomap()
103  * as well as fixmap mappings.
104  */
105 extern unsigned int __VMALLOC_RESERVE;
106
107 extern int sysctl_legacy_va_layout;
108
109 extern int page_is_ram(unsigned long pagenr);
110
111 #endif /* __ASSEMBLY__ */
112
113 #define VMALLOC_RESERVE         ((unsigned long)__VMALLOC_RESERVE)
114 #define MAXMEM                  (-__PAGE_OFFSET-__VMALLOC_RESERVE)
115 #define __pa(x)                 ((unsigned long)(x)-PAGE_OFFSET)
116 /* __pa_symbol should be used for C visible symbols.
117    This seems to be the official gcc blessed way to do such arithmetic. */
118 #define __pa_symbol(x)          __pa(RELOC_HIDE((unsigned long)(x),0))
119 #define __va(x)                 ((void *)((unsigned long)(x)+PAGE_OFFSET))
120 #define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
121 #ifdef CONFIG_FLATMEM
122 #define pfn_valid(pfn)          ((pfn) < max_mapnr)
123 #endif /* CONFIG_FLATMEM */
124 #define virt_to_page(kaddr)     pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
125
126 #define virt_addr_valid(kaddr)  pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
127
128 #include <asm-generic/memory_model.h>
129 #include <asm-generic/page.h>
130
131 #define __HAVE_ARCH_GATE_AREA 1
132 #endif /* __KERNEL__ */
133
134 #endif /* _I386_PAGE_H */