Commit e8e32326279cba3d049b4325111f76618953195c

Authored by Ingo Brueckl
Committed by Linus Torvalds
1 parent d2fde28ce7

Fix compiler warning in arch/x86/mm/init_32.c

Signed-off-by: Ingo Brueckl <ib@wupperonline.de>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 1 changed file with 6 additions and 2 deletions Inline Diff

arch/x86/mm/init_32.c
1 /* 1 /*
2 * 2 *
3 * Copyright (C) 1995 Linus Torvalds 3 * Copyright (C) 1995 Linus Torvalds
4 * 4 *
5 * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999 5 * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
6 */ 6 */
7 7
8 #include <linux/module.h> 8 #include <linux/module.h>
9 #include <linux/signal.h> 9 #include <linux/signal.h>
10 #include <linux/sched.h> 10 #include <linux/sched.h>
11 #include <linux/kernel.h> 11 #include <linux/kernel.h>
12 #include <linux/errno.h> 12 #include <linux/errno.h>
13 #include <linux/string.h> 13 #include <linux/string.h>
14 #include <linux/types.h> 14 #include <linux/types.h>
15 #include <linux/ptrace.h> 15 #include <linux/ptrace.h>
16 #include <linux/mman.h> 16 #include <linux/mman.h>
17 #include <linux/mm.h> 17 #include <linux/mm.h>
18 #include <linux/hugetlb.h> 18 #include <linux/hugetlb.h>
19 #include <linux/swap.h> 19 #include <linux/swap.h>
20 #include <linux/smp.h> 20 #include <linux/smp.h>
21 #include <linux/init.h> 21 #include <linux/init.h>
22 #include <linux/highmem.h> 22 #include <linux/highmem.h>
23 #include <linux/pagemap.h> 23 #include <linux/pagemap.h>
24 #include <linux/pci.h> 24 #include <linux/pci.h>
25 #include <linux/pfn.h> 25 #include <linux/pfn.h>
26 #include <linux/poison.h> 26 #include <linux/poison.h>
27 #include <linux/bootmem.h> 27 #include <linux/bootmem.h>
28 #include <linux/slab.h> 28 #include <linux/slab.h>
29 #include <linux/proc_fs.h> 29 #include <linux/proc_fs.h>
30 #include <linux/memory_hotplug.h> 30 #include <linux/memory_hotplug.h>
31 #include <linux/initrd.h> 31 #include <linux/initrd.h>
32 #include <linux/cpumask.h> 32 #include <linux/cpumask.h>
33 33
34 #include <asm/asm.h> 34 #include <asm/asm.h>
35 #include <asm/bios_ebda.h> 35 #include <asm/bios_ebda.h>
36 #include <asm/processor.h> 36 #include <asm/processor.h>
37 #include <asm/system.h> 37 #include <asm/system.h>
38 #include <asm/uaccess.h> 38 #include <asm/uaccess.h>
39 #include <asm/pgtable.h> 39 #include <asm/pgtable.h>
40 #include <asm/dma.h> 40 #include <asm/dma.h>
41 #include <asm/fixmap.h> 41 #include <asm/fixmap.h>
42 #include <asm/e820.h> 42 #include <asm/e820.h>
43 #include <asm/apic.h> 43 #include <asm/apic.h>
44 #include <asm/bugs.h> 44 #include <asm/bugs.h>
45 #include <asm/tlb.h> 45 #include <asm/tlb.h>
46 #include <asm/tlbflush.h> 46 #include <asm/tlbflush.h>
47 #include <asm/pgalloc.h> 47 #include <asm/pgalloc.h>
48 #include <asm/sections.h> 48 #include <asm/sections.h>
49 #include <asm/paravirt.h> 49 #include <asm/paravirt.h>
50 #include <asm/setup.h> 50 #include <asm/setup.h>
51 #include <asm/cacheflush.h> 51 #include <asm/cacheflush.h>
52 #include <asm/smp.h> 52 #include <asm/smp.h>
53 53
54 unsigned int __VMALLOC_RESERVE = 128 << 20; 54 unsigned int __VMALLOC_RESERVE = 128 << 20;
55 55
56 unsigned long max_low_pfn_mapped; 56 unsigned long max_low_pfn_mapped;
57 unsigned long max_pfn_mapped; 57 unsigned long max_pfn_mapped;
58 58
59 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); 59 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
60 unsigned long highstart_pfn, highend_pfn; 60 unsigned long highstart_pfn, highend_pfn;
61 61
62 static noinline int do_test_wp_bit(void); 62 static noinline int do_test_wp_bit(void);
63 63
64 64
65 static unsigned long __initdata table_start; 65 static unsigned long __initdata table_start;
66 static unsigned long __meminitdata table_end; 66 static unsigned long __meminitdata table_end;
67 static unsigned long __meminitdata table_top; 67 static unsigned long __meminitdata table_top;
68 68
69 static int __initdata after_init_bootmem; 69 static int __initdata after_init_bootmem;
70 70
71 static __init void *alloc_low_page(void) 71 static __init void *alloc_low_page(void)
72 { 72 {
73 unsigned long pfn = table_end++; 73 unsigned long pfn = table_end++;
74 void *adr; 74 void *adr;
75 75
76 if (pfn >= table_top) 76 if (pfn >= table_top)
77 panic("alloc_low_page: ran out of memory"); 77 panic("alloc_low_page: ran out of memory");
78 78
79 adr = __va(pfn * PAGE_SIZE); 79 adr = __va(pfn * PAGE_SIZE);
80 memset(adr, 0, PAGE_SIZE); 80 memset(adr, 0, PAGE_SIZE);
81 return adr; 81 return adr;
82 } 82 }
83 83
84 /* 84 /*
85 * Creates a middle page table and puts a pointer to it in the 85 * Creates a middle page table and puts a pointer to it in the
86 * given global directory entry. This only returns the gd entry 86 * given global directory entry. This only returns the gd entry
87 * in non-PAE compilation mode, since the middle layer is folded. 87 * in non-PAE compilation mode, since the middle layer is folded.
88 */ 88 */
89 static pmd_t * __init one_md_table_init(pgd_t *pgd) 89 static pmd_t * __init one_md_table_init(pgd_t *pgd)
90 { 90 {
91 pud_t *pud; 91 pud_t *pud;
92 pmd_t *pmd_table; 92 pmd_t *pmd_table;
93 93
94 #ifdef CONFIG_X86_PAE 94 #ifdef CONFIG_X86_PAE
95 if (!(pgd_val(*pgd) & _PAGE_PRESENT)) { 95 if (!(pgd_val(*pgd) & _PAGE_PRESENT)) {
96 if (after_init_bootmem) 96 if (after_init_bootmem)
97 pmd_table = (pmd_t *)alloc_bootmem_low_pages(PAGE_SIZE); 97 pmd_table = (pmd_t *)alloc_bootmem_low_pages(PAGE_SIZE);
98 else 98 else
99 pmd_table = (pmd_t *)alloc_low_page(); 99 pmd_table = (pmd_t *)alloc_low_page();
100 paravirt_alloc_pmd(&init_mm, __pa(pmd_table) >> PAGE_SHIFT); 100 paravirt_alloc_pmd(&init_mm, __pa(pmd_table) >> PAGE_SHIFT);
101 set_pgd(pgd, __pgd(__pa(pmd_table) | _PAGE_PRESENT)); 101 set_pgd(pgd, __pgd(__pa(pmd_table) | _PAGE_PRESENT));
102 pud = pud_offset(pgd, 0); 102 pud = pud_offset(pgd, 0);
103 BUG_ON(pmd_table != pmd_offset(pud, 0)); 103 BUG_ON(pmd_table != pmd_offset(pud, 0));
104 104
105 return pmd_table; 105 return pmd_table;
106 } 106 }
107 #endif 107 #endif
108 pud = pud_offset(pgd, 0); 108 pud = pud_offset(pgd, 0);
109 pmd_table = pmd_offset(pud, 0); 109 pmd_table = pmd_offset(pud, 0);
110 110
111 return pmd_table; 111 return pmd_table;
112 } 112 }
113 113
114 /* 114 /*
115 * Create a page table and place a pointer to it in a middle page 115 * Create a page table and place a pointer to it in a middle page
116 * directory entry: 116 * directory entry:
117 */ 117 */
118 static pte_t * __init one_page_table_init(pmd_t *pmd) 118 static pte_t * __init one_page_table_init(pmd_t *pmd)
119 { 119 {
120 if (!(pmd_val(*pmd) & _PAGE_PRESENT)) { 120 if (!(pmd_val(*pmd) & _PAGE_PRESENT)) {
121 pte_t *page_table = NULL; 121 pte_t *page_table = NULL;
122 122
123 if (after_init_bootmem) { 123 if (after_init_bootmem) {
124 #ifdef CONFIG_DEBUG_PAGEALLOC 124 #ifdef CONFIG_DEBUG_PAGEALLOC
125 page_table = (pte_t *) alloc_bootmem_pages(PAGE_SIZE); 125 page_table = (pte_t *) alloc_bootmem_pages(PAGE_SIZE);
126 #endif 126 #endif
127 if (!page_table) 127 if (!page_table)
128 page_table = 128 page_table =
129 (pte_t *)alloc_bootmem_low_pages(PAGE_SIZE); 129 (pte_t *)alloc_bootmem_low_pages(PAGE_SIZE);
130 } else 130 } else
131 page_table = (pte_t *)alloc_low_page(); 131 page_table = (pte_t *)alloc_low_page();
132 132
133 paravirt_alloc_pte(&init_mm, __pa(page_table) >> PAGE_SHIFT); 133 paravirt_alloc_pte(&init_mm, __pa(page_table) >> PAGE_SHIFT);
134 set_pmd(pmd, __pmd(__pa(page_table) | _PAGE_TABLE)); 134 set_pmd(pmd, __pmd(__pa(page_table) | _PAGE_TABLE));
135 BUG_ON(page_table != pte_offset_kernel(pmd, 0)); 135 BUG_ON(page_table != pte_offset_kernel(pmd, 0));
136 } 136 }
137 137
138 return pte_offset_kernel(pmd, 0); 138 return pte_offset_kernel(pmd, 0);
139 } 139 }
140 140
141 /* 141 /*
142 * This function initializes a certain range of kernel virtual memory 142 * This function initializes a certain range of kernel virtual memory
143 * with new bootmem page tables, everywhere page tables are missing in 143 * with new bootmem page tables, everywhere page tables are missing in
144 * the given range. 144 * the given range.
145 * 145 *
146 * NOTE: The pagetables are allocated contiguous on the physical space 146 * NOTE: The pagetables are allocated contiguous on the physical space
147 * so we can cache the place of the first one and move around without 147 * so we can cache the place of the first one and move around without
148 * checking the pgd every time. 148 * checking the pgd every time.
149 */ 149 */
150 static void __init 150 static void __init
151 page_table_range_init(unsigned long start, unsigned long end, pgd_t *pgd_base) 151 page_table_range_init(unsigned long start, unsigned long end, pgd_t *pgd_base)
152 { 152 {
153 int pgd_idx, pmd_idx; 153 int pgd_idx, pmd_idx;
154 unsigned long vaddr; 154 unsigned long vaddr;
155 pgd_t *pgd; 155 pgd_t *pgd;
156 pmd_t *pmd; 156 pmd_t *pmd;
157 157
158 vaddr = start; 158 vaddr = start;
159 pgd_idx = pgd_index(vaddr); 159 pgd_idx = pgd_index(vaddr);
160 pmd_idx = pmd_index(vaddr); 160 pmd_idx = pmd_index(vaddr);
161 pgd = pgd_base + pgd_idx; 161 pgd = pgd_base + pgd_idx;
162 162
163 for ( ; (pgd_idx < PTRS_PER_PGD) && (vaddr != end); pgd++, pgd_idx++) { 163 for ( ; (pgd_idx < PTRS_PER_PGD) && (vaddr != end); pgd++, pgd_idx++) {
164 pmd = one_md_table_init(pgd); 164 pmd = one_md_table_init(pgd);
165 pmd = pmd + pmd_index(vaddr); 165 pmd = pmd + pmd_index(vaddr);
166 for (; (pmd_idx < PTRS_PER_PMD) && (vaddr != end); 166 for (; (pmd_idx < PTRS_PER_PMD) && (vaddr != end);
167 pmd++, pmd_idx++) { 167 pmd++, pmd_idx++) {
168 one_page_table_init(pmd); 168 one_page_table_init(pmd);
169 169
170 vaddr += PMD_SIZE; 170 vaddr += PMD_SIZE;
171 } 171 }
172 pmd_idx = 0; 172 pmd_idx = 0;
173 } 173 }
174 } 174 }
175 175
176 static inline int is_kernel_text(unsigned long addr) 176 static inline int is_kernel_text(unsigned long addr)
177 { 177 {
178 if (addr >= PAGE_OFFSET && addr <= (unsigned long)__init_end) 178 if (addr >= PAGE_OFFSET && addr <= (unsigned long)__init_end)
179 return 1; 179 return 1;
180 return 0; 180 return 0;
181 } 181 }
182 182
183 /* 183 /*
184 * This maps the physical memory to kernel virtual address space, a total 184 * This maps the physical memory to kernel virtual address space, a total
185 * of max_low_pfn pages, by creating page tables starting from address 185 * of max_low_pfn pages, by creating page tables starting from address
186 * PAGE_OFFSET: 186 * PAGE_OFFSET:
187 */ 187 */
188 static void __init kernel_physical_mapping_init(pgd_t *pgd_base, 188 static void __init kernel_physical_mapping_init(pgd_t *pgd_base,
189 unsigned long start_pfn, 189 unsigned long start_pfn,
190 unsigned long end_pfn, 190 unsigned long end_pfn,
191 int use_pse) 191 int use_pse)
192 { 192 {
193 int pgd_idx, pmd_idx, pte_ofs; 193 int pgd_idx, pmd_idx, pte_ofs;
194 unsigned long pfn; 194 unsigned long pfn;
195 pgd_t *pgd; 195 pgd_t *pgd;
196 pmd_t *pmd; 196 pmd_t *pmd;
197 pte_t *pte; 197 pte_t *pte;
198 unsigned pages_2m, pages_4k; 198 unsigned pages_2m, pages_4k;
199 int mapping_iter; 199 int mapping_iter;
200 200
201 /* 201 /*
202 * First iteration will setup identity mapping using large/small pages 202 * First iteration will setup identity mapping using large/small pages
203 * based on use_pse, with other attributes same as set by 203 * based on use_pse, with other attributes same as set by
204 * the early code in head_32.S 204 * the early code in head_32.S
205 * 205 *
206 * Second iteration will setup the appropriate attributes (NX, GLOBAL..) 206 * Second iteration will setup the appropriate attributes (NX, GLOBAL..)
207 * as desired for the kernel identity mapping. 207 * as desired for the kernel identity mapping.
208 * 208 *
209 * This two pass mechanism conforms to the TLB app note which says: 209 * This two pass mechanism conforms to the TLB app note which says:
210 * 210 *
211 * "Software should not write to a paging-structure entry in a way 211 * "Software should not write to a paging-structure entry in a way
212 * that would change, for any linear address, both the page size 212 * that would change, for any linear address, both the page size
213 * and either the page frame or attributes." 213 * and either the page frame or attributes."
214 */ 214 */
215 mapping_iter = 1; 215 mapping_iter = 1;
216 216
217 if (!cpu_has_pse) 217 if (!cpu_has_pse)
218 use_pse = 0; 218 use_pse = 0;
219 219
220 repeat: 220 repeat:
221 pages_2m = pages_4k = 0; 221 pages_2m = pages_4k = 0;
222 pfn = start_pfn; 222 pfn = start_pfn;
223 pgd_idx = pgd_index((pfn<<PAGE_SHIFT) + PAGE_OFFSET); 223 pgd_idx = pgd_index((pfn<<PAGE_SHIFT) + PAGE_OFFSET);
224 pgd = pgd_base + pgd_idx; 224 pgd = pgd_base + pgd_idx;
225 for (; pgd_idx < PTRS_PER_PGD; pgd++, pgd_idx++) { 225 for (; pgd_idx < PTRS_PER_PGD; pgd++, pgd_idx++) {
226 pmd = one_md_table_init(pgd); 226 pmd = one_md_table_init(pgd);
227 227
228 if (pfn >= end_pfn) 228 if (pfn >= end_pfn)
229 continue; 229 continue;
230 #ifdef CONFIG_X86_PAE 230 #ifdef CONFIG_X86_PAE
231 pmd_idx = pmd_index((pfn<<PAGE_SHIFT) + PAGE_OFFSET); 231 pmd_idx = pmd_index((pfn<<PAGE_SHIFT) + PAGE_OFFSET);
232 pmd += pmd_idx; 232 pmd += pmd_idx;
233 #else 233 #else
234 pmd_idx = 0; 234 pmd_idx = 0;
235 #endif 235 #endif
236 for (; pmd_idx < PTRS_PER_PMD && pfn < end_pfn; 236 for (; pmd_idx < PTRS_PER_PMD && pfn < end_pfn;
237 pmd++, pmd_idx++) { 237 pmd++, pmd_idx++) {
238 unsigned int addr = pfn * PAGE_SIZE + PAGE_OFFSET; 238 unsigned int addr = pfn * PAGE_SIZE + PAGE_OFFSET;
239 239
240 /* 240 /*
241 * Map with big pages if possible, otherwise 241 * Map with big pages if possible, otherwise
242 * create normal page tables: 242 * create normal page tables:
243 */ 243 */
244 if (use_pse) { 244 if (use_pse) {
245 unsigned int addr2; 245 unsigned int addr2;
246 pgprot_t prot = PAGE_KERNEL_LARGE; 246 pgprot_t prot = PAGE_KERNEL_LARGE;
247 /* 247 /*
248 * first pass will use the same initial 248 * first pass will use the same initial
249 * identity mapping attribute + _PAGE_PSE. 249 * identity mapping attribute + _PAGE_PSE.
250 */ 250 */
251 pgprot_t init_prot = 251 pgprot_t init_prot =
252 __pgprot(PTE_IDENT_ATTR | 252 __pgprot(PTE_IDENT_ATTR |
253 _PAGE_PSE); 253 _PAGE_PSE);
254 254
255 addr2 = (pfn + PTRS_PER_PTE-1) * PAGE_SIZE + 255 addr2 = (pfn + PTRS_PER_PTE-1) * PAGE_SIZE +
256 PAGE_OFFSET + PAGE_SIZE-1; 256 PAGE_OFFSET + PAGE_SIZE-1;
257 257
258 if (is_kernel_text(addr) || 258 if (is_kernel_text(addr) ||
259 is_kernel_text(addr2)) 259 is_kernel_text(addr2))
260 prot = PAGE_KERNEL_LARGE_EXEC; 260 prot = PAGE_KERNEL_LARGE_EXEC;
261 261
262 pages_2m++; 262 pages_2m++;
263 if (mapping_iter == 1) 263 if (mapping_iter == 1)
264 set_pmd(pmd, pfn_pmd(pfn, init_prot)); 264 set_pmd(pmd, pfn_pmd(pfn, init_prot));
265 else 265 else
266 set_pmd(pmd, pfn_pmd(pfn, prot)); 266 set_pmd(pmd, pfn_pmd(pfn, prot));
267 267
268 pfn += PTRS_PER_PTE; 268 pfn += PTRS_PER_PTE;
269 continue; 269 continue;
270 } 270 }
271 pte = one_page_table_init(pmd); 271 pte = one_page_table_init(pmd);
272 272
273 pte_ofs = pte_index((pfn<<PAGE_SHIFT) + PAGE_OFFSET); 273 pte_ofs = pte_index((pfn<<PAGE_SHIFT) + PAGE_OFFSET);
274 pte += pte_ofs; 274 pte += pte_ofs;
275 for (; pte_ofs < PTRS_PER_PTE && pfn < end_pfn; 275 for (; pte_ofs < PTRS_PER_PTE && pfn < end_pfn;
276 pte++, pfn++, pte_ofs++, addr += PAGE_SIZE) { 276 pte++, pfn++, pte_ofs++, addr += PAGE_SIZE) {
277 pgprot_t prot = PAGE_KERNEL; 277 pgprot_t prot = PAGE_KERNEL;
278 /* 278 /*
279 * first pass will use the same initial 279 * first pass will use the same initial
280 * identity mapping attribute. 280 * identity mapping attribute.
281 */ 281 */
282 pgprot_t init_prot = __pgprot(PTE_IDENT_ATTR); 282 pgprot_t init_prot = __pgprot(PTE_IDENT_ATTR);
283 283
284 if (is_kernel_text(addr)) 284 if (is_kernel_text(addr))
285 prot = PAGE_KERNEL_EXEC; 285 prot = PAGE_KERNEL_EXEC;
286 286
287 pages_4k++; 287 pages_4k++;
288 if (mapping_iter == 1) 288 if (mapping_iter == 1)
289 set_pte(pte, pfn_pte(pfn, init_prot)); 289 set_pte(pte, pfn_pte(pfn, init_prot));
290 else 290 else
291 set_pte(pte, pfn_pte(pfn, prot)); 291 set_pte(pte, pfn_pte(pfn, prot));
292 } 292 }
293 } 293 }
294 } 294 }
295 if (mapping_iter == 1) { 295 if (mapping_iter == 1) {
296 /* 296 /*
297 * update direct mapping page count only in the first 297 * update direct mapping page count only in the first
298 * iteration. 298 * iteration.
299 */ 299 */
300 update_page_count(PG_LEVEL_2M, pages_2m); 300 update_page_count(PG_LEVEL_2M, pages_2m);
301 update_page_count(PG_LEVEL_4K, pages_4k); 301 update_page_count(PG_LEVEL_4K, pages_4k);
302 302
303 /* 303 /*
304 * local global flush tlb, which will flush the previous 304 * local global flush tlb, which will flush the previous
305 * mappings present in both small and large page TLB's. 305 * mappings present in both small and large page TLB's.
306 */ 306 */
307 __flush_tlb_all(); 307 __flush_tlb_all();
308 308
309 /* 309 /*
310 * Second iteration will set the actual desired PTE attributes. 310 * Second iteration will set the actual desired PTE attributes.
311 */ 311 */
312 mapping_iter = 2; 312 mapping_iter = 2;
313 goto repeat; 313 goto repeat;
314 } 314 }
315 } 315 }
316 316
317 /* 317 /*
318 * devmem_is_allowed() checks to see if /dev/mem access to a certain address 318 * devmem_is_allowed() checks to see if /dev/mem access to a certain address
319 * is valid. The argument is a physical page number. 319 * is valid. The argument is a physical page number.
320 * 320 *
321 * 321 *
322 * On x86, access has to be given to the first megabyte of ram because that area 322 * On x86, access has to be given to the first megabyte of ram because that area
323 * contains bios code and data regions used by X and dosemu and similar apps. 323 * contains bios code and data regions used by X and dosemu and similar apps.
324 * Access has to be given to non-kernel-ram areas as well, these contain the PCI 324 * Access has to be given to non-kernel-ram areas as well, these contain the PCI
325 * mmio resources as well as potential bios/acpi data regions. 325 * mmio resources as well as potential bios/acpi data regions.
326 */ 326 */
327 int devmem_is_allowed(unsigned long pagenr) 327 int devmem_is_allowed(unsigned long pagenr)
328 { 328 {
329 if (pagenr <= 256) 329 if (pagenr <= 256)
330 return 1; 330 return 1;
331 if (!page_is_ram(pagenr)) 331 if (!page_is_ram(pagenr))
332 return 1; 332 return 1;
333 return 0; 333 return 0;
334 } 334 }
335 335
336 pte_t *kmap_pte; 336 pte_t *kmap_pte;
337 pgprot_t kmap_prot; 337 pgprot_t kmap_prot;
338 338
339 static inline pte_t *kmap_get_fixmap_pte(unsigned long vaddr) 339 static inline pte_t *kmap_get_fixmap_pte(unsigned long vaddr)
340 { 340 {
341 return pte_offset_kernel(pmd_offset(pud_offset(pgd_offset_k(vaddr), 341 return pte_offset_kernel(pmd_offset(pud_offset(pgd_offset_k(vaddr),
342 vaddr), vaddr), vaddr); 342 vaddr), vaddr), vaddr);
343 } 343 }
344 344
345 static void __init kmap_init(void) 345 static void __init kmap_init(void)
346 { 346 {
347 unsigned long kmap_vstart; 347 unsigned long kmap_vstart;
348 348
349 /* 349 /*
350 * Cache the first kmap pte: 350 * Cache the first kmap pte:
351 */ 351 */
352 kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN); 352 kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN);
353 kmap_pte = kmap_get_fixmap_pte(kmap_vstart); 353 kmap_pte = kmap_get_fixmap_pte(kmap_vstart);
354 354
355 kmap_prot = PAGE_KERNEL; 355 kmap_prot = PAGE_KERNEL;
356 } 356 }
357 357
358 #ifdef CONFIG_HIGHMEM 358 #ifdef CONFIG_HIGHMEM
359 static void __init permanent_kmaps_init(pgd_t *pgd_base) 359 static void __init permanent_kmaps_init(pgd_t *pgd_base)
360 { 360 {
361 unsigned long vaddr; 361 unsigned long vaddr;
362 pgd_t *pgd; 362 pgd_t *pgd;
363 pud_t *pud; 363 pud_t *pud;
364 pmd_t *pmd; 364 pmd_t *pmd;
365 pte_t *pte; 365 pte_t *pte;
366 366
367 vaddr = PKMAP_BASE; 367 vaddr = PKMAP_BASE;
368 page_table_range_init(vaddr, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base); 368 page_table_range_init(vaddr, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base);
369 369
370 pgd = swapper_pg_dir + pgd_index(vaddr); 370 pgd = swapper_pg_dir + pgd_index(vaddr);
371 pud = pud_offset(pgd, vaddr); 371 pud = pud_offset(pgd, vaddr);
372 pmd = pmd_offset(pud, vaddr); 372 pmd = pmd_offset(pud, vaddr);
373 pte = pte_offset_kernel(pmd, vaddr); 373 pte = pte_offset_kernel(pmd, vaddr);
374 pkmap_page_table = pte; 374 pkmap_page_table = pte;
375 } 375 }
376 376
377 static void __init add_one_highpage_init(struct page *page, int pfn) 377 static void __init add_one_highpage_init(struct page *page, int pfn)
378 { 378 {
379 ClearPageReserved(page); 379 ClearPageReserved(page);
380 init_page_count(page); 380 init_page_count(page);
381 __free_page(page); 381 __free_page(page);
382 totalhigh_pages++; 382 totalhigh_pages++;
383 } 383 }
384 384
385 struct add_highpages_data { 385 struct add_highpages_data {
386 unsigned long start_pfn; 386 unsigned long start_pfn;
387 unsigned long end_pfn; 387 unsigned long end_pfn;
388 }; 388 };
389 389
390 static int __init add_highpages_work_fn(unsigned long start_pfn, 390 static int __init add_highpages_work_fn(unsigned long start_pfn,
391 unsigned long end_pfn, void *datax) 391 unsigned long end_pfn, void *datax)
392 { 392 {
393 int node_pfn; 393 int node_pfn;
394 struct page *page; 394 struct page *page;
395 unsigned long final_start_pfn, final_end_pfn; 395 unsigned long final_start_pfn, final_end_pfn;
396 struct add_highpages_data *data; 396 struct add_highpages_data *data;
397 397
398 data = (struct add_highpages_data *)datax; 398 data = (struct add_highpages_data *)datax;
399 399
400 final_start_pfn = max(start_pfn, data->start_pfn); 400 final_start_pfn = max(start_pfn, data->start_pfn);
401 final_end_pfn = min(end_pfn, data->end_pfn); 401 final_end_pfn = min(end_pfn, data->end_pfn);
402 if (final_start_pfn >= final_end_pfn) 402 if (final_start_pfn >= final_end_pfn)
403 return 0; 403 return 0;
404 404
405 for (node_pfn = final_start_pfn; node_pfn < final_end_pfn; 405 for (node_pfn = final_start_pfn; node_pfn < final_end_pfn;
406 node_pfn++) { 406 node_pfn++) {
407 if (!pfn_valid(node_pfn)) 407 if (!pfn_valid(node_pfn))
408 continue; 408 continue;
409 page = pfn_to_page(node_pfn); 409 page = pfn_to_page(node_pfn);
410 add_one_highpage_init(page, node_pfn); 410 add_one_highpage_init(page, node_pfn);
411 } 411 }
412 412
413 return 0; 413 return 0;
414 414
415 } 415 }
416 416
417 void __init add_highpages_with_active_regions(int nid, unsigned long start_pfn, 417 void __init add_highpages_with_active_regions(int nid, unsigned long start_pfn,
418 unsigned long end_pfn) 418 unsigned long end_pfn)
419 { 419 {
420 struct add_highpages_data data; 420 struct add_highpages_data data;
421 421
422 data.start_pfn = start_pfn; 422 data.start_pfn = start_pfn;
423 data.end_pfn = end_pfn; 423 data.end_pfn = end_pfn;
424 424
425 work_with_active_regions(nid, add_highpages_work_fn, &data); 425 work_with_active_regions(nid, add_highpages_work_fn, &data);
426 } 426 }
427 427
428 #ifndef CONFIG_NUMA 428 #ifndef CONFIG_NUMA
429 static void __init set_highmem_pages_init(void) 429 static void __init set_highmem_pages_init(void)
430 { 430 {
431 add_highpages_with_active_regions(0, highstart_pfn, highend_pfn); 431 add_highpages_with_active_regions(0, highstart_pfn, highend_pfn);
432 432
433 totalram_pages += totalhigh_pages; 433 totalram_pages += totalhigh_pages;
434 } 434 }
435 #endif /* !CONFIG_NUMA */ 435 #endif /* !CONFIG_NUMA */
436 436
437 #else 437 #else
438 # define permanent_kmaps_init(pgd_base) do { } while (0) 438 static inline void permanent_kmaps_init(pgd_t *pgd_base)
439 # define set_highmem_pages_init() do { } while (0) 439 {
440 }
441 static inline void set_highmem_pages_init(void)
442 {
443 }
440 #endif /* CONFIG_HIGHMEM */ 444 #endif /* CONFIG_HIGHMEM */
441 445
442 void __init native_pagetable_setup_start(pgd_t *base) 446 void __init native_pagetable_setup_start(pgd_t *base)
443 { 447 {
444 unsigned long pfn, va; 448 unsigned long pfn, va;
445 pgd_t *pgd; 449 pgd_t *pgd;
446 pud_t *pud; 450 pud_t *pud;
447 pmd_t *pmd; 451 pmd_t *pmd;
448 pte_t *pte; 452 pte_t *pte;
449 453
450 /* 454 /*
451 * Remove any mappings which extend past the end of physical 455 * Remove any mappings which extend past the end of physical
452 * memory from the boot time page table: 456 * memory from the boot time page table:
453 */ 457 */
454 for (pfn = max_low_pfn + 1; pfn < 1<<(32-PAGE_SHIFT); pfn++) { 458 for (pfn = max_low_pfn + 1; pfn < 1<<(32-PAGE_SHIFT); pfn++) {
455 va = PAGE_OFFSET + (pfn<<PAGE_SHIFT); 459 va = PAGE_OFFSET + (pfn<<PAGE_SHIFT);
456 pgd = base + pgd_index(va); 460 pgd = base + pgd_index(va);
457 if (!pgd_present(*pgd)) 461 if (!pgd_present(*pgd))
458 break; 462 break;
459 463
460 pud = pud_offset(pgd, va); 464 pud = pud_offset(pgd, va);
461 pmd = pmd_offset(pud, va); 465 pmd = pmd_offset(pud, va);
462 if (!pmd_present(*pmd)) 466 if (!pmd_present(*pmd))
463 break; 467 break;
464 468
465 pte = pte_offset_kernel(pmd, va); 469 pte = pte_offset_kernel(pmd, va);
466 if (!pte_present(*pte)) 470 if (!pte_present(*pte))
467 break; 471 break;
468 472
469 pte_clear(NULL, va, pte); 473 pte_clear(NULL, va, pte);
470 } 474 }
471 paravirt_alloc_pmd(&init_mm, __pa(base) >> PAGE_SHIFT); 475 paravirt_alloc_pmd(&init_mm, __pa(base) >> PAGE_SHIFT);
472 } 476 }
473 477
474 void __init native_pagetable_setup_done(pgd_t *base) 478 void __init native_pagetable_setup_done(pgd_t *base)
475 { 479 {
476 } 480 }
477 481
478 /* 482 /*
479 * Build a proper pagetable for the kernel mappings. Up until this 483 * Build a proper pagetable for the kernel mappings. Up until this
480 * point, we've been running on some set of pagetables constructed by 484 * point, we've been running on some set of pagetables constructed by
481 * the boot process. 485 * the boot process.
482 * 486 *
483 * If we're booting on native hardware, this will be a pagetable 487 * If we're booting on native hardware, this will be a pagetable
484 * constructed in arch/x86/kernel/head_32.S. The root of the 488 * constructed in arch/x86/kernel/head_32.S. The root of the
485 * pagetable will be swapper_pg_dir. 489 * pagetable will be swapper_pg_dir.
486 * 490 *
487 * If we're booting paravirtualized under a hypervisor, then there are 491 * If we're booting paravirtualized under a hypervisor, then there are
488 * more options: we may already be running PAE, and the pagetable may 492 * more options: we may already be running PAE, and the pagetable may
489 * or may not be based in swapper_pg_dir. In any case, 493 * or may not be based in swapper_pg_dir. In any case,
490 * paravirt_pagetable_setup_start() will set up swapper_pg_dir 494 * paravirt_pagetable_setup_start() will set up swapper_pg_dir
491 * appropriately for the rest of the initialization to work. 495 * appropriately for the rest of the initialization to work.
492 * 496 *
493 * In general, pagetable_init() assumes that the pagetable may already 497 * In general, pagetable_init() assumes that the pagetable may already
494 * be partially populated, and so it avoids stomping on any existing 498 * be partially populated, and so it avoids stomping on any existing
495 * mappings. 499 * mappings.
496 */ 500 */
497 static void __init early_ioremap_page_table_range_init(pgd_t *pgd_base) 501 static void __init early_ioremap_page_table_range_init(pgd_t *pgd_base)
498 { 502 {
499 unsigned long vaddr, end; 503 unsigned long vaddr, end;
500 504
501 /* 505 /*
502 * Fixed mappings, only the page table structure has to be 506 * Fixed mappings, only the page table structure has to be
503 * created - mappings will be set by set_fixmap(): 507 * created - mappings will be set by set_fixmap():
504 */ 508 */
505 early_ioremap_clear(); 509 early_ioremap_clear();
506 vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK; 510 vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
507 end = (FIXADDR_TOP + PMD_SIZE - 1) & PMD_MASK; 511 end = (FIXADDR_TOP + PMD_SIZE - 1) & PMD_MASK;
508 page_table_range_init(vaddr, end, pgd_base); 512 page_table_range_init(vaddr, end, pgd_base);
509 early_ioremap_reset(); 513 early_ioremap_reset();
510 } 514 }
511 515
512 static void __init pagetable_init(void) 516 static void __init pagetable_init(void)
513 { 517 {
514 pgd_t *pgd_base = swapper_pg_dir; 518 pgd_t *pgd_base = swapper_pg_dir;
515 519
516 permanent_kmaps_init(pgd_base); 520 permanent_kmaps_init(pgd_base);
517 } 521 }
518 522
519 #ifdef CONFIG_ACPI_SLEEP 523 #ifdef CONFIG_ACPI_SLEEP
520 /* 524 /*
521 * ACPI suspend needs this for resume, because things like the intel-agp 525 * ACPI suspend needs this for resume, because things like the intel-agp
522 * driver might have split up a kernel 4MB mapping. 526 * driver might have split up a kernel 4MB mapping.
523 */ 527 */
524 char swsusp_pg_dir[PAGE_SIZE] 528 char swsusp_pg_dir[PAGE_SIZE]
525 __attribute__ ((aligned(PAGE_SIZE))); 529 __attribute__ ((aligned(PAGE_SIZE)));
526 530
527 static inline void save_pg_dir(void) 531 static inline void save_pg_dir(void)
528 { 532 {
529 memcpy(swsusp_pg_dir, swapper_pg_dir, PAGE_SIZE); 533 memcpy(swsusp_pg_dir, swapper_pg_dir, PAGE_SIZE);
530 } 534 }
531 #else /* !CONFIG_ACPI_SLEEP */ 535 #else /* !CONFIG_ACPI_SLEEP */
532 static inline void save_pg_dir(void) 536 static inline void save_pg_dir(void)
533 { 537 {
534 } 538 }
535 #endif /* !CONFIG_ACPI_SLEEP */ 539 #endif /* !CONFIG_ACPI_SLEEP */
536 540
537 void zap_low_mappings(void) 541 void zap_low_mappings(void)
538 { 542 {
539 int i; 543 int i;
540 544
541 /* 545 /*
542 * Zap initial low-memory mappings. 546 * Zap initial low-memory mappings.
543 * 547 *
544 * Note that "pgd_clear()" doesn't do it for 548 * Note that "pgd_clear()" doesn't do it for
545 * us, because pgd_clear() is a no-op on i386. 549 * us, because pgd_clear() is a no-op on i386.
546 */ 550 */
547 for (i = 0; i < KERNEL_PGD_BOUNDARY; i++) { 551 for (i = 0; i < KERNEL_PGD_BOUNDARY; i++) {
548 #ifdef CONFIG_X86_PAE 552 #ifdef CONFIG_X86_PAE
549 set_pgd(swapper_pg_dir+i, __pgd(1 + __pa(empty_zero_page))); 553 set_pgd(swapper_pg_dir+i, __pgd(1 + __pa(empty_zero_page)));
550 #else 554 #else
551 set_pgd(swapper_pg_dir+i, __pgd(0)); 555 set_pgd(swapper_pg_dir+i, __pgd(0));
552 #endif 556 #endif
553 } 557 }
554 flush_tlb_all(); 558 flush_tlb_all();
555 } 559 }
556 560
557 int nx_enabled; 561 int nx_enabled;
558 562
559 pteval_t __supported_pte_mask __read_mostly = ~(_PAGE_NX | _PAGE_GLOBAL | _PAGE_IOMAP); 563 pteval_t __supported_pte_mask __read_mostly = ~(_PAGE_NX | _PAGE_GLOBAL | _PAGE_IOMAP);
560 EXPORT_SYMBOL_GPL(__supported_pte_mask); 564 EXPORT_SYMBOL_GPL(__supported_pte_mask);
561 565
562 #ifdef CONFIG_X86_PAE 566 #ifdef CONFIG_X86_PAE
563 567
564 static int disable_nx __initdata; 568 static int disable_nx __initdata;
565 569
566 /* 570 /*
567 * noexec = on|off 571 * noexec = on|off
568 * 572 *
569 * Control non executable mappings. 573 * Control non executable mappings.
570 * 574 *
571 * on Enable 575 * on Enable
572 * off Disable 576 * off Disable
573 */ 577 */
574 static int __init noexec_setup(char *str) 578 static int __init noexec_setup(char *str)
575 { 579 {
576 if (!str || !strcmp(str, "on")) { 580 if (!str || !strcmp(str, "on")) {
577 if (cpu_has_nx) { 581 if (cpu_has_nx) {
578 __supported_pte_mask |= _PAGE_NX; 582 __supported_pte_mask |= _PAGE_NX;
579 disable_nx = 0; 583 disable_nx = 0;
580 } 584 }
581 } else { 585 } else {
582 if (!strcmp(str, "off")) { 586 if (!strcmp(str, "off")) {
583 disable_nx = 1; 587 disable_nx = 1;
584 __supported_pte_mask &= ~_PAGE_NX; 588 __supported_pte_mask &= ~_PAGE_NX;
585 } else { 589 } else {
586 return -EINVAL; 590 return -EINVAL;
587 } 591 }
588 } 592 }
589 593
590 return 0; 594 return 0;
591 } 595 }
592 early_param("noexec", noexec_setup); 596 early_param("noexec", noexec_setup);
593 597
594 static void __init set_nx(void) 598 static void __init set_nx(void)
595 { 599 {
596 unsigned int v[4], l, h; 600 unsigned int v[4], l, h;
597 601
598 if (cpu_has_pae && (cpuid_eax(0x80000000) > 0x80000001)) { 602 if (cpu_has_pae && (cpuid_eax(0x80000000) > 0x80000001)) {
599 cpuid(0x80000001, &v[0], &v[1], &v[2], &v[3]); 603 cpuid(0x80000001, &v[0], &v[1], &v[2], &v[3]);
600 604
601 if ((v[3] & (1 << 20)) && !disable_nx) { 605 if ((v[3] & (1 << 20)) && !disable_nx) {
602 rdmsr(MSR_EFER, l, h); 606 rdmsr(MSR_EFER, l, h);
603 l |= EFER_NX; 607 l |= EFER_NX;
604 wrmsr(MSR_EFER, l, h); 608 wrmsr(MSR_EFER, l, h);
605 nx_enabled = 1; 609 nx_enabled = 1;
606 __supported_pte_mask |= _PAGE_NX; 610 __supported_pte_mask |= _PAGE_NX;
607 } 611 }
608 } 612 }
609 } 613 }
610 #endif 614 #endif
611 615
612 /* user-defined highmem size */ 616 /* user-defined highmem size */
613 static unsigned int highmem_pages = -1; 617 static unsigned int highmem_pages = -1;
614 618
615 /* 619 /*
616 * highmem=size forces highmem to be exactly 'size' bytes. 620 * highmem=size forces highmem to be exactly 'size' bytes.
617 * This works even on boxes that have no highmem otherwise. 621 * This works even on boxes that have no highmem otherwise.
618 * This also works to reduce highmem size on bigger boxes. 622 * This also works to reduce highmem size on bigger boxes.
619 */ 623 */
620 static int __init parse_highmem(char *arg) 624 static int __init parse_highmem(char *arg)
621 { 625 {
622 if (!arg) 626 if (!arg)
623 return -EINVAL; 627 return -EINVAL;
624 628
625 highmem_pages = memparse(arg, &arg) >> PAGE_SHIFT; 629 highmem_pages = memparse(arg, &arg) >> PAGE_SHIFT;
626 return 0; 630 return 0;
627 } 631 }
628 early_param("highmem", parse_highmem); 632 early_param("highmem", parse_highmem);
629 633
630 /* 634 /*
631 * Determine low and high memory ranges: 635 * Determine low and high memory ranges:
632 */ 636 */
633 void __init find_low_pfn_range(void) 637 void __init find_low_pfn_range(void)
634 { 638 {
635 /* it could update max_pfn */ 639 /* it could update max_pfn */
636 640
637 /* max_low_pfn is 0, we already have early_res support */ 641 /* max_low_pfn is 0, we already have early_res support */
638 642
639 max_low_pfn = max_pfn; 643 max_low_pfn = max_pfn;
640 if (max_low_pfn > MAXMEM_PFN) { 644 if (max_low_pfn > MAXMEM_PFN) {
641 if (highmem_pages == -1) 645 if (highmem_pages == -1)
642 highmem_pages = max_pfn - MAXMEM_PFN; 646 highmem_pages = max_pfn - MAXMEM_PFN;
643 if (highmem_pages + MAXMEM_PFN < max_pfn) 647 if (highmem_pages + MAXMEM_PFN < max_pfn)
644 max_pfn = MAXMEM_PFN + highmem_pages; 648 max_pfn = MAXMEM_PFN + highmem_pages;
645 if (highmem_pages + MAXMEM_PFN > max_pfn) { 649 if (highmem_pages + MAXMEM_PFN > max_pfn) {
646 printk(KERN_WARNING "only %luMB highmem pages " 650 printk(KERN_WARNING "only %luMB highmem pages "
647 "available, ignoring highmem size of %uMB.\n", 651 "available, ignoring highmem size of %uMB.\n",
648 pages_to_mb(max_pfn - MAXMEM_PFN), 652 pages_to_mb(max_pfn - MAXMEM_PFN),
649 pages_to_mb(highmem_pages)); 653 pages_to_mb(highmem_pages));
650 highmem_pages = 0; 654 highmem_pages = 0;
651 } 655 }
652 max_low_pfn = MAXMEM_PFN; 656 max_low_pfn = MAXMEM_PFN;
653 #ifndef CONFIG_HIGHMEM 657 #ifndef CONFIG_HIGHMEM
654 /* Maximum memory usable is what is directly addressable */ 658 /* Maximum memory usable is what is directly addressable */
655 printk(KERN_WARNING "Warning only %ldMB will be used.\n", 659 printk(KERN_WARNING "Warning only %ldMB will be used.\n",
656 MAXMEM>>20); 660 MAXMEM>>20);
657 if (max_pfn > MAX_NONPAE_PFN) 661 if (max_pfn > MAX_NONPAE_PFN)
658 printk(KERN_WARNING 662 printk(KERN_WARNING
659 "Use a HIGHMEM64G enabled kernel.\n"); 663 "Use a HIGHMEM64G enabled kernel.\n");
660 else 664 else
661 printk(KERN_WARNING "Use a HIGHMEM enabled kernel.\n"); 665 printk(KERN_WARNING "Use a HIGHMEM enabled kernel.\n");
662 max_pfn = MAXMEM_PFN; 666 max_pfn = MAXMEM_PFN;
663 #else /* !CONFIG_HIGHMEM */ 667 #else /* !CONFIG_HIGHMEM */
664 #ifndef CONFIG_HIGHMEM64G 668 #ifndef CONFIG_HIGHMEM64G
665 if (max_pfn > MAX_NONPAE_PFN) { 669 if (max_pfn > MAX_NONPAE_PFN) {
666 max_pfn = MAX_NONPAE_PFN; 670 max_pfn = MAX_NONPAE_PFN;
667 printk(KERN_WARNING "Warning only 4GB will be used." 671 printk(KERN_WARNING "Warning only 4GB will be used."
668 "Use a HIGHMEM64G enabled kernel.\n"); 672 "Use a HIGHMEM64G enabled kernel.\n");
669 } 673 }
670 #endif /* !CONFIG_HIGHMEM64G */ 674 #endif /* !CONFIG_HIGHMEM64G */
671 #endif /* !CONFIG_HIGHMEM */ 675 #endif /* !CONFIG_HIGHMEM */
672 } else { 676 } else {
673 if (highmem_pages == -1) 677 if (highmem_pages == -1)
674 highmem_pages = 0; 678 highmem_pages = 0;
675 #ifdef CONFIG_HIGHMEM 679 #ifdef CONFIG_HIGHMEM
676 if (highmem_pages >= max_pfn) { 680 if (highmem_pages >= max_pfn) {
677 printk(KERN_ERR "highmem size specified (%uMB) is " 681 printk(KERN_ERR "highmem size specified (%uMB) is "
678 "bigger than pages available (%luMB)!.\n", 682 "bigger than pages available (%luMB)!.\n",
679 pages_to_mb(highmem_pages), 683 pages_to_mb(highmem_pages),
680 pages_to_mb(max_pfn)); 684 pages_to_mb(max_pfn));
681 highmem_pages = 0; 685 highmem_pages = 0;
682 } 686 }
683 if (highmem_pages) { 687 if (highmem_pages) {
684 if (max_low_pfn - highmem_pages < 688 if (max_low_pfn - highmem_pages <
685 64*1024*1024/PAGE_SIZE){ 689 64*1024*1024/PAGE_SIZE){
686 printk(KERN_ERR "highmem size %uMB results in " 690 printk(KERN_ERR "highmem size %uMB results in "
687 "smaller than 64MB lowmem, ignoring it.\n" 691 "smaller than 64MB lowmem, ignoring it.\n"
688 , pages_to_mb(highmem_pages)); 692 , pages_to_mb(highmem_pages));
689 highmem_pages = 0; 693 highmem_pages = 0;
690 } 694 }
691 max_low_pfn -= highmem_pages; 695 max_low_pfn -= highmem_pages;
692 } 696 }
693 #else 697 #else
694 if (highmem_pages) 698 if (highmem_pages)
695 printk(KERN_ERR "ignoring highmem size on non-highmem" 699 printk(KERN_ERR "ignoring highmem size on non-highmem"
696 " kernel!\n"); 700 " kernel!\n");
697 #endif 701 #endif
698 } 702 }
699 } 703 }
700 704
701 #ifndef CONFIG_NEED_MULTIPLE_NODES 705 #ifndef CONFIG_NEED_MULTIPLE_NODES
702 void __init initmem_init(unsigned long start_pfn, 706 void __init initmem_init(unsigned long start_pfn,
703 unsigned long end_pfn) 707 unsigned long end_pfn)
704 { 708 {
705 #ifdef CONFIG_HIGHMEM 709 #ifdef CONFIG_HIGHMEM
706 highstart_pfn = highend_pfn = max_pfn; 710 highstart_pfn = highend_pfn = max_pfn;
707 if (max_pfn > max_low_pfn) 711 if (max_pfn > max_low_pfn)
708 highstart_pfn = max_low_pfn; 712 highstart_pfn = max_low_pfn;
709 memory_present(0, 0, highend_pfn); 713 memory_present(0, 0, highend_pfn);
710 e820_register_active_regions(0, 0, highend_pfn); 714 e820_register_active_regions(0, 0, highend_pfn);
711 printk(KERN_NOTICE "%ldMB HIGHMEM available.\n", 715 printk(KERN_NOTICE "%ldMB HIGHMEM available.\n",
712 pages_to_mb(highend_pfn - highstart_pfn)); 716 pages_to_mb(highend_pfn - highstart_pfn));
713 num_physpages = highend_pfn; 717 num_physpages = highend_pfn;
714 high_memory = (void *) __va(highstart_pfn * PAGE_SIZE - 1) + 1; 718 high_memory = (void *) __va(highstart_pfn * PAGE_SIZE - 1) + 1;
715 #else 719 #else
716 memory_present(0, 0, max_low_pfn); 720 memory_present(0, 0, max_low_pfn);
717 e820_register_active_regions(0, 0, max_low_pfn); 721 e820_register_active_regions(0, 0, max_low_pfn);
718 num_physpages = max_low_pfn; 722 num_physpages = max_low_pfn;
719 high_memory = (void *) __va(max_low_pfn * PAGE_SIZE - 1) + 1; 723 high_memory = (void *) __va(max_low_pfn * PAGE_SIZE - 1) + 1;
720 #endif 724 #endif
721 #ifdef CONFIG_FLATMEM 725 #ifdef CONFIG_FLATMEM
722 max_mapnr = num_physpages; 726 max_mapnr = num_physpages;
723 #endif 727 #endif
724 printk(KERN_NOTICE "%ldMB LOWMEM available.\n", 728 printk(KERN_NOTICE "%ldMB LOWMEM available.\n",
725 pages_to_mb(max_low_pfn)); 729 pages_to_mb(max_low_pfn));
726 730
727 setup_bootmem_allocator(); 731 setup_bootmem_allocator();
728 } 732 }
729 #endif /* !CONFIG_NEED_MULTIPLE_NODES */ 733 #endif /* !CONFIG_NEED_MULTIPLE_NODES */
730 734
731 static void __init zone_sizes_init(void) 735 static void __init zone_sizes_init(void)
732 { 736 {
733 unsigned long max_zone_pfns[MAX_NR_ZONES]; 737 unsigned long max_zone_pfns[MAX_NR_ZONES];
734 memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); 738 memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
735 max_zone_pfns[ZONE_DMA] = 739 max_zone_pfns[ZONE_DMA] =
736 virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT; 740 virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT;
737 max_zone_pfns[ZONE_NORMAL] = max_low_pfn; 741 max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
738 #ifdef CONFIG_HIGHMEM 742 #ifdef CONFIG_HIGHMEM
739 max_zone_pfns[ZONE_HIGHMEM] = highend_pfn; 743 max_zone_pfns[ZONE_HIGHMEM] = highend_pfn;
740 #endif 744 #endif
741 745
742 free_area_init_nodes(max_zone_pfns); 746 free_area_init_nodes(max_zone_pfns);
743 } 747 }
744 748
745 void __init setup_bootmem_allocator(void) 749 void __init setup_bootmem_allocator(void)
746 { 750 {
747 int i; 751 int i;
748 unsigned long bootmap_size, bootmap; 752 unsigned long bootmap_size, bootmap;
749 /* 753 /*
750 * Initialize the boot-time allocator (with low memory only): 754 * Initialize the boot-time allocator (with low memory only):
751 */ 755 */
752 bootmap_size = bootmem_bootmap_pages(max_low_pfn)<<PAGE_SHIFT; 756 bootmap_size = bootmem_bootmap_pages(max_low_pfn)<<PAGE_SHIFT;
753 bootmap = find_e820_area(min_low_pfn<<PAGE_SHIFT, 757 bootmap = find_e820_area(min_low_pfn<<PAGE_SHIFT,
754 max_pfn_mapped<<PAGE_SHIFT, bootmap_size, 758 max_pfn_mapped<<PAGE_SHIFT, bootmap_size,
755 PAGE_SIZE); 759 PAGE_SIZE);
756 if (bootmap == -1L) 760 if (bootmap == -1L)
757 panic("Cannot find bootmem map of size %ld\n", bootmap_size); 761 panic("Cannot find bootmem map of size %ld\n", bootmap_size);
758 reserve_early(bootmap, bootmap + bootmap_size, "BOOTMAP"); 762 reserve_early(bootmap, bootmap + bootmap_size, "BOOTMAP");
759 763
760 /* don't touch min_low_pfn */ 764 /* don't touch min_low_pfn */
761 bootmap_size = init_bootmem_node(NODE_DATA(0), bootmap >> PAGE_SHIFT, 765 bootmap_size = init_bootmem_node(NODE_DATA(0), bootmap >> PAGE_SHIFT,
762 min_low_pfn, max_low_pfn); 766 min_low_pfn, max_low_pfn);
763 printk(KERN_INFO " mapped low ram: 0 - %08lx\n", 767 printk(KERN_INFO " mapped low ram: 0 - %08lx\n",
764 max_pfn_mapped<<PAGE_SHIFT); 768 max_pfn_mapped<<PAGE_SHIFT);
765 printk(KERN_INFO " low ram: %08lx - %08lx\n", 769 printk(KERN_INFO " low ram: %08lx - %08lx\n",
766 min_low_pfn<<PAGE_SHIFT, max_low_pfn<<PAGE_SHIFT); 770 min_low_pfn<<PAGE_SHIFT, max_low_pfn<<PAGE_SHIFT);
767 printk(KERN_INFO " bootmap %08lx - %08lx\n", 771 printk(KERN_INFO " bootmap %08lx - %08lx\n",
768 bootmap, bootmap + bootmap_size); 772 bootmap, bootmap + bootmap_size);
769 for_each_online_node(i) 773 for_each_online_node(i)
770 free_bootmem_with_active_regions(i, max_low_pfn); 774 free_bootmem_with_active_regions(i, max_low_pfn);
771 early_res_to_bootmem(0, max_low_pfn<<PAGE_SHIFT); 775 early_res_to_bootmem(0, max_low_pfn<<PAGE_SHIFT);
772 776
773 after_init_bootmem = 1; 777 after_init_bootmem = 1;
774 } 778 }
775 779
776 static void __init find_early_table_space(unsigned long end, int use_pse) 780 static void __init find_early_table_space(unsigned long end, int use_pse)
777 { 781 {
778 unsigned long puds, pmds, ptes, tables, start; 782 unsigned long puds, pmds, ptes, tables, start;
779 783
780 puds = (end + PUD_SIZE - 1) >> PUD_SHIFT; 784 puds = (end + PUD_SIZE - 1) >> PUD_SHIFT;
781 tables = PAGE_ALIGN(puds * sizeof(pud_t)); 785 tables = PAGE_ALIGN(puds * sizeof(pud_t));
782 786
783 pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT; 787 pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT;
784 tables += PAGE_ALIGN(pmds * sizeof(pmd_t)); 788 tables += PAGE_ALIGN(pmds * sizeof(pmd_t));
785 789
786 if (use_pse) { 790 if (use_pse) {
787 unsigned long extra; 791 unsigned long extra;
788 792
789 extra = end - ((end>>PMD_SHIFT) << PMD_SHIFT); 793 extra = end - ((end>>PMD_SHIFT) << PMD_SHIFT);
790 extra += PMD_SIZE; 794 extra += PMD_SIZE;
791 ptes = (extra + PAGE_SIZE - 1) >> PAGE_SHIFT; 795 ptes = (extra + PAGE_SIZE - 1) >> PAGE_SHIFT;
792 } else 796 } else
793 ptes = (end + PAGE_SIZE - 1) >> PAGE_SHIFT; 797 ptes = (end + PAGE_SIZE - 1) >> PAGE_SHIFT;
794 798
795 tables += PAGE_ALIGN(ptes * sizeof(pte_t)); 799 tables += PAGE_ALIGN(ptes * sizeof(pte_t));
796 800
797 /* for fixmap */ 801 /* for fixmap */
798 tables += PAGE_SIZE * 2; 802 tables += PAGE_SIZE * 2;
799 803
800 /* 804 /*
801 * RED-PEN putting page tables only on node 0 could 805 * RED-PEN putting page tables only on node 0 could
802 * cause a hotspot and fill up ZONE_DMA. The page tables 806 * cause a hotspot and fill up ZONE_DMA. The page tables
803 * need roughly 0.5KB per GB. 807 * need roughly 0.5KB per GB.
804 */ 808 */
805 start = 0x7000; 809 start = 0x7000;
806 table_start = find_e820_area(start, max_pfn_mapped<<PAGE_SHIFT, 810 table_start = find_e820_area(start, max_pfn_mapped<<PAGE_SHIFT,
807 tables, PAGE_SIZE); 811 tables, PAGE_SIZE);
808 if (table_start == -1UL) 812 if (table_start == -1UL)
809 panic("Cannot find space for the kernel page tables"); 813 panic("Cannot find space for the kernel page tables");
810 814
811 table_start >>= PAGE_SHIFT; 815 table_start >>= PAGE_SHIFT;
812 table_end = table_start; 816 table_end = table_start;
813 table_top = table_start + (tables>>PAGE_SHIFT); 817 table_top = table_start + (tables>>PAGE_SHIFT);
814 818
815 printk(KERN_DEBUG "kernel direct mapping tables up to %lx @ %lx-%lx\n", 819 printk(KERN_DEBUG "kernel direct mapping tables up to %lx @ %lx-%lx\n",
816 end, table_start << PAGE_SHIFT, 820 end, table_start << PAGE_SHIFT,
817 (table_start << PAGE_SHIFT) + tables); 821 (table_start << PAGE_SHIFT) + tables);
818 } 822 }
819 823
820 unsigned long __init_refok init_memory_mapping(unsigned long start, 824 unsigned long __init_refok init_memory_mapping(unsigned long start,
821 unsigned long end) 825 unsigned long end)
822 { 826 {
823 pgd_t *pgd_base = swapper_pg_dir; 827 pgd_t *pgd_base = swapper_pg_dir;
824 unsigned long start_pfn, end_pfn; 828 unsigned long start_pfn, end_pfn;
825 unsigned long big_page_start; 829 unsigned long big_page_start;
826 #ifdef CONFIG_DEBUG_PAGEALLOC 830 #ifdef CONFIG_DEBUG_PAGEALLOC
827 /* 831 /*
828 * For CONFIG_DEBUG_PAGEALLOC, identity mapping will use small pages. 832 * For CONFIG_DEBUG_PAGEALLOC, identity mapping will use small pages.
829 * This will simplify cpa(), which otherwise needs to support splitting 833 * This will simplify cpa(), which otherwise needs to support splitting
830 * large pages into small in interrupt context, etc. 834 * large pages into small in interrupt context, etc.
831 */ 835 */
832 int use_pse = 0; 836 int use_pse = 0;
833 #else 837 #else
834 int use_pse = cpu_has_pse; 838 int use_pse = cpu_has_pse;
835 #endif 839 #endif
836 840
837 /* 841 /*
838 * Find space for the kernel direct mapping tables. 842 * Find space for the kernel direct mapping tables.
839 */ 843 */
840 if (!after_init_bootmem) 844 if (!after_init_bootmem)
841 find_early_table_space(end, use_pse); 845 find_early_table_space(end, use_pse);
842 846
843 #ifdef CONFIG_X86_PAE 847 #ifdef CONFIG_X86_PAE
844 set_nx(); 848 set_nx();
845 if (nx_enabled) 849 if (nx_enabled)
846 printk(KERN_INFO "NX (Execute Disable) protection: active\n"); 850 printk(KERN_INFO "NX (Execute Disable) protection: active\n");
847 #endif 851 #endif
848 852
849 /* Enable PSE if available */ 853 /* Enable PSE if available */
850 if (cpu_has_pse) 854 if (cpu_has_pse)
851 set_in_cr4(X86_CR4_PSE); 855 set_in_cr4(X86_CR4_PSE);
852 856
853 /* Enable PGE if available */ 857 /* Enable PGE if available */
854 if (cpu_has_pge) { 858 if (cpu_has_pge) {
855 set_in_cr4(X86_CR4_PGE); 859 set_in_cr4(X86_CR4_PGE);
856 __supported_pte_mask |= _PAGE_GLOBAL; 860 __supported_pte_mask |= _PAGE_GLOBAL;
857 } 861 }
858 862
859 /* 863 /*
860 * Don't use a large page for the first 2/4MB of memory 864 * Don't use a large page for the first 2/4MB of memory
861 * because there are often fixed size MTRRs in there 865 * because there are often fixed size MTRRs in there
862 * and overlapping MTRRs into large pages can cause 866 * and overlapping MTRRs into large pages can cause
863 * slowdowns. 867 * slowdowns.
864 */ 868 */
865 big_page_start = PMD_SIZE; 869 big_page_start = PMD_SIZE;
866 870
867 if (start < big_page_start) { 871 if (start < big_page_start) {
868 start_pfn = start >> PAGE_SHIFT; 872 start_pfn = start >> PAGE_SHIFT;
869 end_pfn = min(big_page_start>>PAGE_SHIFT, end>>PAGE_SHIFT); 873 end_pfn = min(big_page_start>>PAGE_SHIFT, end>>PAGE_SHIFT);
870 } else { 874 } else {
871 /* head is not big page alignment ? */ 875 /* head is not big page alignment ? */
872 start_pfn = start >> PAGE_SHIFT; 876 start_pfn = start >> PAGE_SHIFT;
873 end_pfn = ((start + (PMD_SIZE - 1))>>PMD_SHIFT) 877 end_pfn = ((start + (PMD_SIZE - 1))>>PMD_SHIFT)
874 << (PMD_SHIFT - PAGE_SHIFT); 878 << (PMD_SHIFT - PAGE_SHIFT);
875 } 879 }
876 if (start_pfn < end_pfn) 880 if (start_pfn < end_pfn)
877 kernel_physical_mapping_init(pgd_base, start_pfn, end_pfn, 0); 881 kernel_physical_mapping_init(pgd_base, start_pfn, end_pfn, 0);
878 882
879 /* big page range */ 883 /* big page range */
880 start_pfn = ((start + (PMD_SIZE - 1))>>PMD_SHIFT) 884 start_pfn = ((start + (PMD_SIZE - 1))>>PMD_SHIFT)
881 << (PMD_SHIFT - PAGE_SHIFT); 885 << (PMD_SHIFT - PAGE_SHIFT);
882 if (start_pfn < (big_page_start >> PAGE_SHIFT)) 886 if (start_pfn < (big_page_start >> PAGE_SHIFT))
883 start_pfn = big_page_start >> PAGE_SHIFT; 887 start_pfn = big_page_start >> PAGE_SHIFT;
884 end_pfn = (end>>PMD_SHIFT) << (PMD_SHIFT - PAGE_SHIFT); 888 end_pfn = (end>>PMD_SHIFT) << (PMD_SHIFT - PAGE_SHIFT);
885 if (start_pfn < end_pfn) 889 if (start_pfn < end_pfn)
886 kernel_physical_mapping_init(pgd_base, start_pfn, end_pfn, 890 kernel_physical_mapping_init(pgd_base, start_pfn, end_pfn,
887 use_pse); 891 use_pse);
888 892
889 /* tail is not big page alignment ? */ 893 /* tail is not big page alignment ? */
890 start_pfn = end_pfn; 894 start_pfn = end_pfn;
891 if (start_pfn > (big_page_start>>PAGE_SHIFT)) { 895 if (start_pfn > (big_page_start>>PAGE_SHIFT)) {
892 end_pfn = end >> PAGE_SHIFT; 896 end_pfn = end >> PAGE_SHIFT;
893 if (start_pfn < end_pfn) 897 if (start_pfn < end_pfn)
894 kernel_physical_mapping_init(pgd_base, start_pfn, 898 kernel_physical_mapping_init(pgd_base, start_pfn,
895 end_pfn, 0); 899 end_pfn, 0);
896 } 900 }
897 901
898 early_ioremap_page_table_range_init(pgd_base); 902 early_ioremap_page_table_range_init(pgd_base);
899 903
900 load_cr3(swapper_pg_dir); 904 load_cr3(swapper_pg_dir);
901 905
902 __flush_tlb_all(); 906 __flush_tlb_all();
903 907
904 if (!after_init_bootmem) 908 if (!after_init_bootmem)
905 reserve_early(table_start << PAGE_SHIFT, 909 reserve_early(table_start << PAGE_SHIFT,
906 table_end << PAGE_SHIFT, "PGTABLE"); 910 table_end << PAGE_SHIFT, "PGTABLE");
907 911
908 if (!after_init_bootmem) 912 if (!after_init_bootmem)
909 early_memtest(start, end); 913 early_memtest(start, end);
910 914
911 return end >> PAGE_SHIFT; 915 return end >> PAGE_SHIFT;
912 } 916 }
913 917
914 918
915 /* 919 /*
916 * paging_init() sets up the page tables - note that the first 8MB are 920 * paging_init() sets up the page tables - note that the first 8MB are
917 * already mapped by head.S. 921 * already mapped by head.S.
918 * 922 *
919 * This routines also unmaps the page at virtual kernel address 0, so 923 * This routines also unmaps the page at virtual kernel address 0, so
920 * that we can trap those pesky NULL-reference errors in the kernel. 924 * that we can trap those pesky NULL-reference errors in the kernel.
921 */ 925 */
922 void __init paging_init(void) 926 void __init paging_init(void)
923 { 927 {
924 pagetable_init(); 928 pagetable_init();
925 929
926 __flush_tlb_all(); 930 __flush_tlb_all();
927 931
928 kmap_init(); 932 kmap_init();
929 933
930 /* 934 /*
931 * NOTE: at this point the bootmem allocator is fully available. 935 * NOTE: at this point the bootmem allocator is fully available.
932 */ 936 */
933 sparse_init(); 937 sparse_init();
934 zone_sizes_init(); 938 zone_sizes_init();
935 } 939 }
936 940
937 /* 941 /*
938 * Test if the WP bit works in supervisor mode. It isn't supported on 386's 942 * Test if the WP bit works in supervisor mode. It isn't supported on 386's
939 * and also on some strange 486's. All 586+'s are OK. This used to involve 943 * and also on some strange 486's. All 586+'s are OK. This used to involve
940 * black magic jumps to work around some nasty CPU bugs, but fortunately the 944 * black magic jumps to work around some nasty CPU bugs, but fortunately the
941 * switch to using exceptions got rid of all that. 945 * switch to using exceptions got rid of all that.
942 */ 946 */
943 static void __init test_wp_bit(void) 947 static void __init test_wp_bit(void)
944 { 948 {
945 printk(KERN_INFO 949 printk(KERN_INFO
946 "Checking if this processor honours the WP bit even in supervisor mode..."); 950 "Checking if this processor honours the WP bit even in supervisor mode...");
947 951
948 /* Any page-aligned address will do, the test is non-destructive */ 952 /* Any page-aligned address will do, the test is non-destructive */
949 __set_fixmap(FIX_WP_TEST, __pa(&swapper_pg_dir), PAGE_READONLY); 953 __set_fixmap(FIX_WP_TEST, __pa(&swapper_pg_dir), PAGE_READONLY);
950 boot_cpu_data.wp_works_ok = do_test_wp_bit(); 954 boot_cpu_data.wp_works_ok = do_test_wp_bit();
951 clear_fixmap(FIX_WP_TEST); 955 clear_fixmap(FIX_WP_TEST);
952 956
953 if (!boot_cpu_data.wp_works_ok) { 957 if (!boot_cpu_data.wp_works_ok) {
954 printk(KERN_CONT "No.\n"); 958 printk(KERN_CONT "No.\n");
955 #ifdef CONFIG_X86_WP_WORKS_OK 959 #ifdef CONFIG_X86_WP_WORKS_OK
956 panic( 960 panic(
957 "This kernel doesn't support CPU's with broken WP. Recompile it for a 386!"); 961 "This kernel doesn't support CPU's with broken WP. Recompile it for a 386!");
958 #endif 962 #endif
959 } else { 963 } else {
960 printk(KERN_CONT "Ok.\n"); 964 printk(KERN_CONT "Ok.\n");
961 } 965 }
962 } 966 }
963 967
964 static struct kcore_list kcore_mem, kcore_vmalloc; 968 static struct kcore_list kcore_mem, kcore_vmalloc;
965 969
966 void __init mem_init(void) 970 void __init mem_init(void)
967 { 971 {
968 int codesize, reservedpages, datasize, initsize; 972 int codesize, reservedpages, datasize, initsize;
969 int tmp; 973 int tmp;
970 974
971 pci_iommu_alloc(); 975 pci_iommu_alloc();
972 976
973 #ifdef CONFIG_FLATMEM 977 #ifdef CONFIG_FLATMEM
974 BUG_ON(!mem_map); 978 BUG_ON(!mem_map);
975 #endif 979 #endif
976 /* this will put all low memory onto the freelists */ 980 /* this will put all low memory onto the freelists */
977 totalram_pages += free_all_bootmem(); 981 totalram_pages += free_all_bootmem();
978 982
979 reservedpages = 0; 983 reservedpages = 0;
980 for (tmp = 0; tmp < max_low_pfn; tmp++) 984 for (tmp = 0; tmp < max_low_pfn; tmp++)
981 /* 985 /*
982 * Only count reserved RAM pages: 986 * Only count reserved RAM pages:
983 */ 987 */
984 if (page_is_ram(tmp) && PageReserved(pfn_to_page(tmp))) 988 if (page_is_ram(tmp) && PageReserved(pfn_to_page(tmp)))
985 reservedpages++; 989 reservedpages++;
986 990
987 set_highmem_pages_init(); 991 set_highmem_pages_init();
988 992
989 codesize = (unsigned long) &_etext - (unsigned long) &_text; 993 codesize = (unsigned long) &_etext - (unsigned long) &_text;
990 datasize = (unsigned long) &_edata - (unsigned long) &_etext; 994 datasize = (unsigned long) &_edata - (unsigned long) &_etext;
991 initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin; 995 initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin;
992 996
993 kclist_add(&kcore_mem, __va(0), max_low_pfn << PAGE_SHIFT); 997 kclist_add(&kcore_mem, __va(0), max_low_pfn << PAGE_SHIFT);
994 kclist_add(&kcore_vmalloc, (void *)VMALLOC_START, 998 kclist_add(&kcore_vmalloc, (void *)VMALLOC_START,
995 VMALLOC_END-VMALLOC_START); 999 VMALLOC_END-VMALLOC_START);
996 1000
997 printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, " 1001 printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, "
998 "%dk reserved, %dk data, %dk init, %ldk highmem)\n", 1002 "%dk reserved, %dk data, %dk init, %ldk highmem)\n",
999 (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), 1003 (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
1000 num_physpages << (PAGE_SHIFT-10), 1004 num_physpages << (PAGE_SHIFT-10),
1001 codesize >> 10, 1005 codesize >> 10,
1002 reservedpages << (PAGE_SHIFT-10), 1006 reservedpages << (PAGE_SHIFT-10),
1003 datasize >> 10, 1007 datasize >> 10,
1004 initsize >> 10, 1008 initsize >> 10,
1005 (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10)) 1009 (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10))
1006 ); 1010 );
1007 1011
1008 printk(KERN_INFO "virtual kernel memory layout:\n" 1012 printk(KERN_INFO "virtual kernel memory layout:\n"
1009 " fixmap : 0x%08lx - 0x%08lx (%4ld kB)\n" 1013 " fixmap : 0x%08lx - 0x%08lx (%4ld kB)\n"
1010 #ifdef CONFIG_HIGHMEM 1014 #ifdef CONFIG_HIGHMEM
1011 " pkmap : 0x%08lx - 0x%08lx (%4ld kB)\n" 1015 " pkmap : 0x%08lx - 0x%08lx (%4ld kB)\n"
1012 #endif 1016 #endif
1013 " vmalloc : 0x%08lx - 0x%08lx (%4ld MB)\n" 1017 " vmalloc : 0x%08lx - 0x%08lx (%4ld MB)\n"
1014 " lowmem : 0x%08lx - 0x%08lx (%4ld MB)\n" 1018 " lowmem : 0x%08lx - 0x%08lx (%4ld MB)\n"
1015 " .init : 0x%08lx - 0x%08lx (%4ld kB)\n" 1019 " .init : 0x%08lx - 0x%08lx (%4ld kB)\n"
1016 " .data : 0x%08lx - 0x%08lx (%4ld kB)\n" 1020 " .data : 0x%08lx - 0x%08lx (%4ld kB)\n"
1017 " .text : 0x%08lx - 0x%08lx (%4ld kB)\n", 1021 " .text : 0x%08lx - 0x%08lx (%4ld kB)\n",
1018 FIXADDR_START, FIXADDR_TOP, 1022 FIXADDR_START, FIXADDR_TOP,
1019 (FIXADDR_TOP - FIXADDR_START) >> 10, 1023 (FIXADDR_TOP - FIXADDR_START) >> 10,
1020 1024
1021 #ifdef CONFIG_HIGHMEM 1025 #ifdef CONFIG_HIGHMEM
1022 PKMAP_BASE, PKMAP_BASE+LAST_PKMAP*PAGE_SIZE, 1026 PKMAP_BASE, PKMAP_BASE+LAST_PKMAP*PAGE_SIZE,
1023 (LAST_PKMAP*PAGE_SIZE) >> 10, 1027 (LAST_PKMAP*PAGE_SIZE) >> 10,
1024 #endif 1028 #endif
1025 1029
1026 VMALLOC_START, VMALLOC_END, 1030 VMALLOC_START, VMALLOC_END,
1027 (VMALLOC_END - VMALLOC_START) >> 20, 1031 (VMALLOC_END - VMALLOC_START) >> 20,
1028 1032
1029 (unsigned long)__va(0), (unsigned long)high_memory, 1033 (unsigned long)__va(0), (unsigned long)high_memory,
1030 ((unsigned long)high_memory - (unsigned long)__va(0)) >> 20, 1034 ((unsigned long)high_memory - (unsigned long)__va(0)) >> 20,
1031 1035
1032 (unsigned long)&__init_begin, (unsigned long)&__init_end, 1036 (unsigned long)&__init_begin, (unsigned long)&__init_end,
1033 ((unsigned long)&__init_end - 1037 ((unsigned long)&__init_end -
1034 (unsigned long)&__init_begin) >> 10, 1038 (unsigned long)&__init_begin) >> 10,
1035 1039
1036 (unsigned long)&_etext, (unsigned long)&_edata, 1040 (unsigned long)&_etext, (unsigned long)&_edata,
1037 ((unsigned long)&_edata - (unsigned long)&_etext) >> 10, 1041 ((unsigned long)&_edata - (unsigned long)&_etext) >> 10,
1038 1042
1039 (unsigned long)&_text, (unsigned long)&_etext, 1043 (unsigned long)&_text, (unsigned long)&_etext,
1040 ((unsigned long)&_etext - (unsigned long)&_text) >> 10); 1044 ((unsigned long)&_etext - (unsigned long)&_text) >> 10);
1041 1045
1042 /* 1046 /*
1043 * Check boundaries twice: Some fundamental inconsistencies can 1047 * Check boundaries twice: Some fundamental inconsistencies can
1044 * be detected at build time already. 1048 * be detected at build time already.
1045 */ 1049 */
1046 #define __FIXADDR_TOP (-PAGE_SIZE) 1050 #define __FIXADDR_TOP (-PAGE_SIZE)
1047 #ifdef CONFIG_HIGHMEM 1051 #ifdef CONFIG_HIGHMEM
1048 BUILD_BUG_ON(PKMAP_BASE + LAST_PKMAP*PAGE_SIZE > FIXADDR_START); 1052 BUILD_BUG_ON(PKMAP_BASE + LAST_PKMAP*PAGE_SIZE > FIXADDR_START);
1049 BUILD_BUG_ON(VMALLOC_END > PKMAP_BASE); 1053 BUILD_BUG_ON(VMALLOC_END > PKMAP_BASE);
1050 #endif 1054 #endif
1051 #define high_memory (-128UL << 20) 1055 #define high_memory (-128UL << 20)
1052 BUILD_BUG_ON(VMALLOC_START >= VMALLOC_END); 1056 BUILD_BUG_ON(VMALLOC_START >= VMALLOC_END);
1053 #undef high_memory 1057 #undef high_memory
1054 #undef __FIXADDR_TOP 1058 #undef __FIXADDR_TOP
1055 1059
1056 #ifdef CONFIG_HIGHMEM 1060 #ifdef CONFIG_HIGHMEM
1057 BUG_ON(PKMAP_BASE + LAST_PKMAP*PAGE_SIZE > FIXADDR_START); 1061 BUG_ON(PKMAP_BASE + LAST_PKMAP*PAGE_SIZE > FIXADDR_START);
1058 BUG_ON(VMALLOC_END > PKMAP_BASE); 1062 BUG_ON(VMALLOC_END > PKMAP_BASE);
1059 #endif 1063 #endif
1060 BUG_ON(VMALLOC_START >= VMALLOC_END); 1064 BUG_ON(VMALLOC_START >= VMALLOC_END);
1061 BUG_ON((unsigned long)high_memory > VMALLOC_START); 1065 BUG_ON((unsigned long)high_memory > VMALLOC_START);
1062 1066
1063 if (boot_cpu_data.wp_works_ok < 0) 1067 if (boot_cpu_data.wp_works_ok < 0)
1064 test_wp_bit(); 1068 test_wp_bit();
1065 1069
1066 save_pg_dir(); 1070 save_pg_dir();
1067 zap_low_mappings(); 1071 zap_low_mappings();
1068 } 1072 }
1069 1073
1070 #ifdef CONFIG_MEMORY_HOTPLUG 1074 #ifdef CONFIG_MEMORY_HOTPLUG
1071 int arch_add_memory(int nid, u64 start, u64 size) 1075 int arch_add_memory(int nid, u64 start, u64 size)
1072 { 1076 {
1073 struct pglist_data *pgdata = NODE_DATA(nid); 1077 struct pglist_data *pgdata = NODE_DATA(nid);
1074 struct zone *zone = pgdata->node_zones + ZONE_HIGHMEM; 1078 struct zone *zone = pgdata->node_zones + ZONE_HIGHMEM;
1075 unsigned long start_pfn = start >> PAGE_SHIFT; 1079 unsigned long start_pfn = start >> PAGE_SHIFT;
1076 unsigned long nr_pages = size >> PAGE_SHIFT; 1080 unsigned long nr_pages = size >> PAGE_SHIFT;
1077 1081
1078 return __add_pages(zone, start_pfn, nr_pages); 1082 return __add_pages(zone, start_pfn, nr_pages);
1079 } 1083 }
1080 #endif 1084 #endif
1081 1085
1082 /* 1086 /*
1083 * This function cannot be __init, since exceptions don't work in that 1087 * This function cannot be __init, since exceptions don't work in that
1084 * section. Put this after the callers, so that it cannot be inlined. 1088 * section. Put this after the callers, so that it cannot be inlined.
1085 */ 1089 */
1086 static noinline int do_test_wp_bit(void) 1090 static noinline int do_test_wp_bit(void)
1087 { 1091 {
1088 char tmp_reg; 1092 char tmp_reg;
1089 int flag; 1093 int flag;
1090 1094
1091 __asm__ __volatile__( 1095 __asm__ __volatile__(
1092 " movb %0, %1 \n" 1096 " movb %0, %1 \n"
1093 "1: movb %1, %0 \n" 1097 "1: movb %1, %0 \n"
1094 " xorl %2, %2 \n" 1098 " xorl %2, %2 \n"
1095 "2: \n" 1099 "2: \n"
1096 _ASM_EXTABLE(1b,2b) 1100 _ASM_EXTABLE(1b,2b)
1097 :"=m" (*(char *)fix_to_virt(FIX_WP_TEST)), 1101 :"=m" (*(char *)fix_to_virt(FIX_WP_TEST)),
1098 "=q" (tmp_reg), 1102 "=q" (tmp_reg),
1099 "=r" (flag) 1103 "=r" (flag)
1100 :"2" (1) 1104 :"2" (1)
1101 :"memory"); 1105 :"memory");
1102 1106
1103 return flag; 1107 return flag;
1104 } 1108 }
1105 1109
1106 #ifdef CONFIG_DEBUG_RODATA 1110 #ifdef CONFIG_DEBUG_RODATA
1107 const int rodata_test_data = 0xC3; 1111 const int rodata_test_data = 0xC3;
1108 EXPORT_SYMBOL_GPL(rodata_test_data); 1112 EXPORT_SYMBOL_GPL(rodata_test_data);
1109 1113
1110 void mark_rodata_ro(void) 1114 void mark_rodata_ro(void)
1111 { 1115 {
1112 unsigned long start = PFN_ALIGN(_text); 1116 unsigned long start = PFN_ALIGN(_text);
1113 unsigned long size = PFN_ALIGN(_etext) - start; 1117 unsigned long size = PFN_ALIGN(_etext) - start;
1114 1118
1115 #ifndef CONFIG_DYNAMIC_FTRACE 1119 #ifndef CONFIG_DYNAMIC_FTRACE
1116 /* Dynamic tracing modifies the kernel text section */ 1120 /* Dynamic tracing modifies the kernel text section */
1117 set_pages_ro(virt_to_page(start), size >> PAGE_SHIFT); 1121 set_pages_ro(virt_to_page(start), size >> PAGE_SHIFT);
1118 printk(KERN_INFO "Write protecting the kernel text: %luk\n", 1122 printk(KERN_INFO "Write protecting the kernel text: %luk\n",
1119 size >> 10); 1123 size >> 10);
1120 1124
1121 #ifdef CONFIG_CPA_DEBUG 1125 #ifdef CONFIG_CPA_DEBUG
1122 printk(KERN_INFO "Testing CPA: Reverting %lx-%lx\n", 1126 printk(KERN_INFO "Testing CPA: Reverting %lx-%lx\n",
1123 start, start+size); 1127 start, start+size);
1124 set_pages_rw(virt_to_page(start), size>>PAGE_SHIFT); 1128 set_pages_rw(virt_to_page(start), size>>PAGE_SHIFT);
1125 1129
1126 printk(KERN_INFO "Testing CPA: write protecting again\n"); 1130 printk(KERN_INFO "Testing CPA: write protecting again\n");
1127 set_pages_ro(virt_to_page(start), size>>PAGE_SHIFT); 1131 set_pages_ro(virt_to_page(start), size>>PAGE_SHIFT);
1128 #endif 1132 #endif
1129 #endif /* CONFIG_DYNAMIC_FTRACE */ 1133 #endif /* CONFIG_DYNAMIC_FTRACE */
1130 1134
1131 start += size; 1135 start += size;
1132 size = (unsigned long)__end_rodata - start; 1136 size = (unsigned long)__end_rodata - start;
1133 set_pages_ro(virt_to_page(start), size >> PAGE_SHIFT); 1137 set_pages_ro(virt_to_page(start), size >> PAGE_SHIFT);
1134 printk(KERN_INFO "Write protecting the kernel read-only data: %luk\n", 1138 printk(KERN_INFO "Write protecting the kernel read-only data: %luk\n",
1135 size >> 10); 1139 size >> 10);
1136 rodata_test(); 1140 rodata_test();
1137 1141
1138 #ifdef CONFIG_CPA_DEBUG 1142 #ifdef CONFIG_CPA_DEBUG
1139 printk(KERN_INFO "Testing CPA: undo %lx-%lx\n", start, start + size); 1143 printk(KERN_INFO "Testing CPA: undo %lx-%lx\n", start, start + size);
1140 set_pages_rw(virt_to_page(start), size >> PAGE_SHIFT); 1144 set_pages_rw(virt_to_page(start), size >> PAGE_SHIFT);
1141 1145
1142 printk(KERN_INFO "Testing CPA: write protecting again\n"); 1146 printk(KERN_INFO "Testing CPA: write protecting again\n");
1143 set_pages_ro(virt_to_page(start), size >> PAGE_SHIFT); 1147 set_pages_ro(virt_to_page(start), size >> PAGE_SHIFT);
1144 #endif 1148 #endif
1145 } 1149 }
1146 #endif 1150 #endif
1147 1151
1148 void free_init_pages(char *what, unsigned long begin, unsigned long end) 1152 void free_init_pages(char *what, unsigned long begin, unsigned long end)
1149 { 1153 {
1150 #ifdef CONFIG_DEBUG_PAGEALLOC 1154 #ifdef CONFIG_DEBUG_PAGEALLOC
1151 /* 1155 /*
1152 * If debugging page accesses then do not free this memory but 1156 * If debugging page accesses then do not free this memory but
1153 * mark them not present - any buggy init-section access will 1157 * mark them not present - any buggy init-section access will
1154 * create a kernel page fault: 1158 * create a kernel page fault:
1155 */ 1159 */
1156 printk(KERN_INFO "debug: unmapping init memory %08lx..%08lx\n", 1160 printk(KERN_INFO "debug: unmapping init memory %08lx..%08lx\n",
1157 begin, PAGE_ALIGN(end)); 1161 begin, PAGE_ALIGN(end));
1158 set_memory_np(begin, (end - begin) >> PAGE_SHIFT); 1162 set_memory_np(begin, (end - begin) >> PAGE_SHIFT);
1159 #else 1163 #else
1160 unsigned long addr; 1164 unsigned long addr;
1161 1165
1162 /* 1166 /*
1163 * We just marked the kernel text read only above, now that 1167 * We just marked the kernel text read only above, now that
1164 * we are going to free part of that, we need to make that 1168 * we are going to free part of that, we need to make that
1165 * writeable first. 1169 * writeable first.
1166 */ 1170 */
1167 set_memory_rw(begin, (end - begin) >> PAGE_SHIFT); 1171 set_memory_rw(begin, (end - begin) >> PAGE_SHIFT);
1168 1172
1169 for (addr = begin; addr < end; addr += PAGE_SIZE) { 1173 for (addr = begin; addr < end; addr += PAGE_SIZE) {
1170 ClearPageReserved(virt_to_page(addr)); 1174 ClearPageReserved(virt_to_page(addr));
1171 init_page_count(virt_to_page(addr)); 1175 init_page_count(virt_to_page(addr));
1172 memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE); 1176 memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE);
1173 free_page(addr); 1177 free_page(addr);
1174 totalram_pages++; 1178 totalram_pages++;
1175 } 1179 }
1176 printk(KERN_INFO "Freeing %s: %luk freed\n", what, (end - begin) >> 10); 1180 printk(KERN_INFO "Freeing %s: %luk freed\n", what, (end - begin) >> 10);
1177 #endif 1181 #endif
1178 } 1182 }
1179 1183
1180 void free_initmem(void) 1184 void free_initmem(void)
1181 { 1185 {
1182 free_init_pages("unused kernel memory", 1186 free_init_pages("unused kernel memory",
1183 (unsigned long)(&__init_begin), 1187 (unsigned long)(&__init_begin),
1184 (unsigned long)(&__init_end)); 1188 (unsigned long)(&__init_end));
1185 } 1189 }
1186 1190
1187 #ifdef CONFIG_BLK_DEV_INITRD 1191 #ifdef CONFIG_BLK_DEV_INITRD
1188 void free_initrd_mem(unsigned long start, unsigned long end) 1192 void free_initrd_mem(unsigned long start, unsigned long end)
1189 { 1193 {
1190 free_init_pages("initrd memory", start, end); 1194 free_init_pages("initrd memory", start, end);
1191 } 1195 }
1192 #endif 1196 #endif
1193 1197
1194 int __init reserve_bootmem_generic(unsigned long phys, unsigned long len, 1198 int __init reserve_bootmem_generic(unsigned long phys, unsigned long len,
1195 int flags) 1199 int flags)
1196 { 1200 {
1197 return reserve_bootmem(phys, len, flags); 1201 return reserve_bootmem(phys, len, flags);
1198 } 1202 }
1199 1203