x86/pgtable: unify pagetable accessors, #5
[safe/jmp/linux-2.6] / include / asm-x86 / page_32.h
1 #ifndef _ASM_X86_PAGE_32_H
2 #define _ASM_X86_PAGE_32_H
3
4 /*
5  * This handles the memory map.
6  *
7  * A __PAGE_OFFSET of 0xC0000000 means that the kernel has
8  * a virtual address space of one gigabyte, which limits the
9  * amount of physical memory you can use to about 950MB.
10  *
11  * If you want more physical memory than this then see the CONFIG_HIGHMEM4G
12  * and CONFIG_HIGHMEM64G options in the kernel configuration.
13  */
14 #define __PAGE_OFFSET           _AC(CONFIG_PAGE_OFFSET, UL)
15
16 #ifdef CONFIG_X86_PAE
17 #define __PHYSICAL_MASK_SHIFT   36
18 #define __VIRTUAL_MASK_SHIFT    32
19 #define PAGETABLE_LEVELS        3
20
21 #ifndef __ASSEMBLY__
22 typedef u64     pteval_t;
23 typedef u64     pmdval_t;
24 typedef u64     pudval_t;
25 typedef u64     pgdval_t;
26 typedef u64     pgprotval_t;
27 typedef u64     phys_addr_t;
28
29 typedef struct { unsigned long pte_low, pte_high; } pte_t;
30
31 static inline unsigned long long native_pte_val(pte_t pte)
32 {
33         return pte.pte_low | ((unsigned long long)pte.pte_high << 32);
34 }
35
36 static inline pte_t native_make_pte(unsigned long long val)
37 {
38         return (pte_t) { .pte_low = val, .pte_high = (val >> 32) } ;
39 }
40
41 #endif  /* __ASSEMBLY__
42  */
43 #else  /* !CONFIG_X86_PAE */
44 #define __PHYSICAL_MASK_SHIFT   32
45 #define __VIRTUAL_MASK_SHIFT    32
46 #define PAGETABLE_LEVELS        2
47
48 #ifndef __ASSEMBLY__
49 typedef unsigned long   pteval_t;
50 typedef unsigned long   pmdval_t;
51 typedef unsigned long   pudval_t;
52 typedef unsigned long   pgdval_t;
53 typedef unsigned long   pgprotval_t;
54 typedef unsigned long   phys_addr_t;
55
56 typedef struct { pteval_t pte_low; } pte_t;
57 typedef pte_t boot_pte_t;
58
59 static inline unsigned long native_pte_val(pte_t pte)
60 {
61         return pte.pte_low;
62 }
63
64 static inline pte_t native_make_pte(unsigned long val)
65 {
66         return (pte_t) { .pte_low = val };
67 }
68
69 #endif  /* __ASSEMBLY__ */
70 #endif  /* CONFIG_X86_PAE */
71
72 #ifdef CONFIG_HUGETLB_PAGE
73 #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
74 #endif
75
76 #ifndef __ASSEMBLY__
77 #define __phys_addr(x)          ((x)-PAGE_OFFSET)
78 #define __phys_reloc_hide(x)    RELOC_HIDE((x), 0)
79
80 #ifdef CONFIG_FLATMEM
81 #define pfn_valid(pfn)          ((pfn) < max_mapnr)
82 #endif /* CONFIG_FLATMEM */
83
84 extern int nx_enabled;
85
86 /*
87  * This much address space is reserved for vmalloc() and iomap()
88  * as well as fixmap mappings.
89  */
90 extern unsigned int __VMALLOC_RESERVE;
91 extern int sysctl_legacy_va_layout;
92 extern int page_is_ram(unsigned long pagenr);
93
94 #define VMALLOC_RESERVE         ((unsigned long)__VMALLOC_RESERVE)
95 #define MAXMEM                  (-__PAGE_OFFSET-__VMALLOC_RESERVE)
96
97 #ifdef CONFIG_X86_USE_3DNOW
98 #include <asm/mmx.h>
99
100 static inline void clear_page(void *page)
101 {
102         mmx_clear_page(page);
103 }
104
105 static inline void copy_page(void *to, void *from)
106 {
107         mmx_copy_page(to, from);
108 }
109 #else  /* !CONFIG_X86_USE_3DNOW */
110 #include <linux/string.h>
111
112 static inline void clear_page(void *page)
113 {
114         memset(page, 0, PAGE_SIZE);
115 }
116
117 static inline void copy_page(void *to, void *from)
118 {
119         memcpy(to, from, PAGE_SIZE);
120 }
121 #endif  /* CONFIG_X86_3DNOW */
122 #endif  /* !__ASSEMBLY__ */
123
124 #endif /* _ASM_X86_PAGE_32_H */