]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - arch/x86/mm/init_64.c
x86: unify printk strings in fault_32|64.c
[mirror_ubuntu-zesty-kernel.git] / arch / x86 / mm / init_64.c
CommitLineData
1da177e4
LT
1/*
2 * linux/arch/x86_64/mm/init.c
3 *
4 * Copyright (C) 1995 Linus Torvalds
5 * Copyright (C) 2000 Pavel Machek <pavel@suse.cz>
6 * Copyright (C) 2002,2003 Andi Kleen <ak@suse.de>
7 */
8
1da177e4
LT
9#include <linux/signal.h>
10#include <linux/sched.h>
11#include <linux/kernel.h>
12#include <linux/errno.h>
13#include <linux/string.h>
14#include <linux/types.h>
15#include <linux/ptrace.h>
16#include <linux/mman.h>
17#include <linux/mm.h>
18#include <linux/swap.h>
19#include <linux/smp.h>
20#include <linux/init.h>
21#include <linux/pagemap.h>
22#include <linux/bootmem.h>
23#include <linux/proc_fs.h>
59170891 24#include <linux/pci.h>
6fb14755 25#include <linux/pfn.h>
c9cf5528 26#include <linux/poison.h>
17a941d8 27#include <linux/dma-mapping.h>
44df75e6
MT
28#include <linux/module.h>
29#include <linux/memory_hotplug.h>
ae32b129 30#include <linux/nmi.h>
1da177e4
LT
31
32#include <asm/processor.h>
33#include <asm/system.h>
34#include <asm/uaccess.h>
35#include <asm/pgtable.h>
36#include <asm/pgalloc.h>
37#include <asm/dma.h>
38#include <asm/fixmap.h>
39#include <asm/e820.h>
40#include <asm/apic.h>
41#include <asm/tlb.h>
42#include <asm/mmu_context.h>
43#include <asm/proto.h>
44#include <asm/smp.h>
2bc0414e 45#include <asm/sections.h>
718fc13b 46#include <asm/kdebug.h>
aaa64e04 47#include <asm/numa.h>
1da177e4
LT
48
49#ifndef Dprintk
50#define Dprintk(x...)
51#endif
52
e6584504 53const struct dma_mapping_ops* dma_ops;
17a941d8
MBY
54EXPORT_SYMBOL(dma_ops);
55
e18c6874
AK
56static unsigned long dma_reserve __initdata;
57
1da177e4
LT
58DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
59
60/*
61 * NOTE: pagetable_init alloc all the fixmap pagetables contiguous on the
62 * physical space so we can cache the place of the first one and move
63 * around without checking the pgd every time.
64 */
65
66void show_mem(void)
67{
e92343cc
AK
68 long i, total = 0, reserved = 0;
69 long shared = 0, cached = 0;
1da177e4
LT
70 pg_data_t *pgdat;
71 struct page *page;
72
e92343cc 73 printk(KERN_INFO "Mem-info:\n");
1da177e4 74 show_free_areas();
e92343cc 75 printk(KERN_INFO "Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
1da177e4 76
ec936fc5 77 for_each_online_pgdat(pgdat) {
1da177e4 78 for (i = 0; i < pgdat->node_spanned_pages; ++i) {
ae32b129
KR
79 /* this loop can take a while with 256 GB and 4k pages
80 so update the NMI watchdog */
81 if (unlikely(i % MAX_ORDER_NR_PAGES == 0)) {
82 touch_nmi_watchdog();
83 }
12710a56
BP
84 if (!pfn_valid(pgdat->node_start_pfn + i))
85 continue;
1da177e4
LT
86 page = pfn_to_page(pgdat->node_start_pfn + i);
87 total++;
e92343cc
AK
88 if (PageReserved(page))
89 reserved++;
90 else if (PageSwapCache(page))
91 cached++;
92 else if (page_count(page))
93 shared += page_count(page) - 1;
1da177e4
LT
94 }
95 }
e92343cc
AK
96 printk(KERN_INFO "%lu pages of RAM\n", total);
97 printk(KERN_INFO "%lu reserved pages\n",reserved);
98 printk(KERN_INFO "%lu pages shared\n",shared);
99 printk(KERN_INFO "%lu pages swap cached\n",cached);
1da177e4
LT
100}
101
1da177e4
LT
102int after_bootmem;
103
5f44a669 104static __init void *spp_getpage(void)
1da177e4
LT
105{
106 void *ptr;
107 if (after_bootmem)
108 ptr = (void *) get_zeroed_page(GFP_ATOMIC);
109 else
110 ptr = alloc_bootmem_pages(PAGE_SIZE);
111 if (!ptr || ((unsigned long)ptr & ~PAGE_MASK))
112 panic("set_pte_phys: cannot allocate page data %s\n", after_bootmem?"after bootmem":"");
113
114 Dprintk("spp_getpage %p\n", ptr);
115 return ptr;
116}
117
5f44a669 118static __init void set_pte_phys(unsigned long vaddr,
1da177e4
LT
119 unsigned long phys, pgprot_t prot)
120{
121 pgd_t *pgd;
122 pud_t *pud;
123 pmd_t *pmd;
124 pte_t *pte, new_pte;
125
126 Dprintk("set_pte_phys %lx to %lx\n", vaddr, phys);
127
128 pgd = pgd_offset_k(vaddr);
129 if (pgd_none(*pgd)) {
130 printk("PGD FIXMAP MISSING, it should be setup in head.S!\n");
131 return;
132 }
133 pud = pud_offset(pgd, vaddr);
134 if (pud_none(*pud)) {
135 pmd = (pmd_t *) spp_getpage();
136 set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE | _PAGE_USER));
137 if (pmd != pmd_offset(pud, 0)) {
138 printk("PAGETABLE BUG #01! %p <-> %p\n", pmd, pmd_offset(pud,0));
139 return;
140 }
141 }
142 pmd = pmd_offset(pud, vaddr);
143 if (pmd_none(*pmd)) {
144 pte = (pte_t *) spp_getpage();
145 set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE | _PAGE_USER));
146 if (pte != pte_offset_kernel(pmd, 0)) {
147 printk("PAGETABLE BUG #02!\n");
148 return;
149 }
150 }
151 new_pte = pfn_pte(phys >> PAGE_SHIFT, prot);
152
153 pte = pte_offset_kernel(pmd, vaddr);
154 if (!pte_none(*pte) &&
155 pte_val(*pte) != (pte_val(new_pte) & __supported_pte_mask))
156 pte_ERROR(*pte);
157 set_pte(pte, new_pte);
158
159 /*
160 * It's enough to flush this one mapping.
161 * (PGE mappings get flushed as well)
162 */
163 __flush_tlb_one(vaddr);
164}
165
166/* NOTE: this is meant to be run only at boot */
5f44a669
AK
167void __init
168__set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t prot)
1da177e4
LT
169{
170 unsigned long address = __fix_to_virt(idx);
171
172 if (idx >= __end_of_fixed_addresses) {
173 printk("Invalid __set_fixmap\n");
174 return;
175 }
176 set_pte_phys(address, phys, prot);
177}
178
a3142c8e 179unsigned long __meminitdata table_start, table_end;
1da177e4 180
dafe41ee 181static __meminit void *alloc_low_page(unsigned long *phys)
1da177e4 182{
dafe41ee 183 unsigned long pfn = table_end++;
1da177e4
LT
184 void *adr;
185
44df75e6
MT
186 if (after_bootmem) {
187 adr = (void *)get_zeroed_page(GFP_ATOMIC);
188 *phys = __pa(adr);
189 return adr;
190 }
191
1da177e4
LT
192 if (pfn >= end_pfn)
193 panic("alloc_low_page: ran out of memory");
dafe41ee
VG
194
195 adr = early_ioremap(pfn * PAGE_SIZE, PAGE_SIZE);
44df75e6 196 memset(adr, 0, PAGE_SIZE);
dafe41ee
VG
197 *phys = pfn * PAGE_SIZE;
198 return adr;
199}
1da177e4 200
dafe41ee 201static __meminit void unmap_low_page(void *adr)
1da177e4 202{
44df75e6
MT
203
204 if (after_bootmem)
205 return;
206
dafe41ee 207 early_iounmap(adr, PAGE_SIZE);
1da177e4
LT
208}
209
f2d3efed 210/* Must run before zap_low_mappings */
a3142c8e 211__meminit void *early_ioremap(unsigned long addr, unsigned long size)
f2d3efed 212{
dafe41ee
VG
213 unsigned long vaddr;
214 pmd_t *pmd, *last_pmd;
215 int i, pmds;
216
217 pmds = ((addr & ~PMD_MASK) + size + ~PMD_MASK) / PMD_SIZE;
218 vaddr = __START_KERNEL_map;
219 pmd = level2_kernel_pgt;
220 last_pmd = level2_kernel_pgt + PTRS_PER_PMD - 1;
221 for (; pmd <= last_pmd; pmd++, vaddr += PMD_SIZE) {
222 for (i = 0; i < pmds; i++) {
223 if (pmd_present(pmd[i]))
224 goto next;
225 }
226 vaddr += addr & ~PMD_MASK;
227 addr &= PMD_MASK;
228 for (i = 0; i < pmds; i++, addr += PMD_SIZE)
929fd589 229 set_pmd(pmd+i, __pmd(addr | __PAGE_KERNEL_LARGE_EXEC));
dafe41ee
VG
230 __flush_tlb();
231 return (void *)vaddr;
232 next:
233 ;
f2d3efed 234 }
dafe41ee
VG
235 printk("early_ioremap(0x%lx, %lu) failed\n", addr, size);
236 return NULL;
f2d3efed
AK
237}
238
239/* To avoid virtual aliases later */
a3142c8e 240__meminit void early_iounmap(void *addr, unsigned long size)
f2d3efed 241{
dafe41ee
VG
242 unsigned long vaddr;
243 pmd_t *pmd;
244 int i, pmds;
245
246 vaddr = (unsigned long)addr;
247 pmds = ((vaddr & ~PMD_MASK) + size + ~PMD_MASK) / PMD_SIZE;
248 pmd = level2_kernel_pgt + pmd_index(vaddr);
249 for (i = 0; i < pmds; i++)
250 pmd_clear(pmd + i);
f2d3efed
AK
251 __flush_tlb();
252}
253
44df75e6 254static void __meminit
6ad91658 255phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end)
44df75e6 256{
6ad91658 257 int i = pmd_index(address);
44df75e6 258
6ad91658 259 for (; i < PTRS_PER_PMD; i++, address += PMD_SIZE) {
44df75e6 260 unsigned long entry;
6ad91658 261 pmd_t *pmd = pmd_page + pmd_index(address);
44df75e6 262
5f51e139
JB
263 if (address >= end) {
264 if (!after_bootmem)
265 for (; i < PTRS_PER_PMD; i++, pmd++)
266 set_pmd(pmd, __pmd(0));
44df75e6
MT
267 break;
268 }
6ad91658
KM
269
270 if (pmd_val(*pmd))
271 continue;
272
40842bf5 273 entry = __PAGE_KERNEL_LARGE|_PAGE_GLOBAL|address;
44df75e6
MT
274 entry &= __supported_pte_mask;
275 set_pmd(pmd, __pmd(entry));
276 }
277}
278
279static void __meminit
280phys_pmd_update(pud_t *pud, unsigned long address, unsigned long end)
281{
6ad91658
KM
282 pmd_t *pmd = pmd_offset(pud,0);
283 spin_lock(&init_mm.page_table_lock);
284 phys_pmd_init(pmd, address, end);
285 spin_unlock(&init_mm.page_table_lock);
286 __flush_tlb_all();
44df75e6
MT
287}
288
6ad91658 289static void __meminit phys_pud_init(pud_t *pud_page, unsigned long addr, unsigned long end)
1da177e4 290{
6ad91658 291 int i = pud_index(addr);
44df75e6 292
44df75e6 293
6ad91658 294 for (; i < PTRS_PER_PUD; i++, addr = (addr & PUD_MASK) + PUD_SIZE ) {
6ad91658
KM
295 unsigned long pmd_phys;
296 pud_t *pud = pud_page + pud_index(addr);
1da177e4
LT
297 pmd_t *pmd;
298
6ad91658 299 if (addr >= end)
1da177e4 300 break;
1da177e4 301
6ad91658 302 if (!after_bootmem && !e820_any_mapped(addr,addr+PUD_SIZE,0)) {
1da177e4
LT
303 set_pud(pud, __pud(0));
304 continue;
305 }
306
6ad91658
KM
307 if (pud_val(*pud)) {
308 phys_pmd_update(pud, addr, end);
309 continue;
310 }
311
dafe41ee 312 pmd = alloc_low_page(&pmd_phys);
44df75e6 313 spin_lock(&init_mm.page_table_lock);
1da177e4 314 set_pud(pud, __pud(pmd_phys | _KERNPG_TABLE));
6ad91658 315 phys_pmd_init(pmd, addr, end);
44df75e6 316 spin_unlock(&init_mm.page_table_lock);
dafe41ee 317 unmap_low_page(pmd);
1da177e4
LT
318 }
319 __flush_tlb();
320}
321
322static void __init find_early_table_space(unsigned long end)
323{
6c5acd16 324 unsigned long puds, pmds, tables, start;
1da177e4
LT
325
326 puds = (end + PUD_SIZE - 1) >> PUD_SHIFT;
327 pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT;
328 tables = round_up(puds * sizeof(pud_t), PAGE_SIZE) +
329 round_up(pmds * sizeof(pmd_t), PAGE_SIZE);
330
ee408c79
AK
331 /* RED-PEN putting page tables only on node 0 could
332 cause a hotspot and fill up ZONE_DMA. The page tables
333 need roughly 0.5KB per GB. */
334 start = 0x8000;
335 table_start = find_e820_area(start, end, tables);
1da177e4
LT
336 if (table_start == -1UL)
337 panic("Cannot find space for the kernel page tables");
338
339 table_start >>= PAGE_SHIFT;
340 table_end = table_start;
44df75e6
MT
341
342 early_printk("kernel direct mapping tables up to %lx @ %lx-%lx\n",
5f51e139
JB
343 end, table_start << PAGE_SHIFT,
344 (table_start << PAGE_SHIFT) + tables);
1da177e4
LT
345}
346
347/* Setup the direct mapping of the physical memory at PAGE_OFFSET.
348 This runs before bootmem is initialized and gets pages directly from the
349 physical memory. To access them they are temporarily mapped. */
b6fd6ecb 350void __init_refok init_memory_mapping(unsigned long start, unsigned long end)
1da177e4
LT
351{
352 unsigned long next;
353
354 Dprintk("init_memory_mapping\n");
355
356 /*
357 * Find space for the kernel direct mapping tables.
358 * Later we should allocate these tables in the local node of the memory
359 * mapped. Unfortunately this is done currently before the nodes are
360 * discovered.
361 */
44df75e6
MT
362 if (!after_bootmem)
363 find_early_table_space(end);
1da177e4
LT
364
365 start = (unsigned long)__va(start);
366 end = (unsigned long)__va(end);
367
368 for (; start < end; start = next) {
1da177e4 369 unsigned long pud_phys;
44df75e6
MT
370 pgd_t *pgd = pgd_offset_k(start);
371 pud_t *pud;
372
373 if (after_bootmem)
d2ae5b5f 374 pud = pud_offset(pgd, start & PGDIR_MASK);
44df75e6 375 else
dafe41ee 376 pud = alloc_low_page(&pud_phys);
44df75e6 377
1da177e4
LT
378 next = start + PGDIR_SIZE;
379 if (next > end)
380 next = end;
381 phys_pud_init(pud, __pa(start), __pa(next));
44df75e6
MT
382 if (!after_bootmem)
383 set_pgd(pgd_offset_k(start), mk_kernel_pgd(pud_phys));
dafe41ee 384 unmap_low_page(pud);
1da177e4
LT
385 }
386
44df75e6 387 if (!after_bootmem)
f51c9452 388 mmu_cr4_features = read_cr4();
1da177e4 389 __flush_tlb_all();
1da177e4
LT
390}
391
2b97690f 392#ifndef CONFIG_NUMA
1da177e4
LT
393void __init paging_init(void)
394{
6391af17
MG
395 unsigned long max_zone_pfns[MAX_NR_ZONES];
396 memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
397 max_zone_pfns[ZONE_DMA] = MAX_DMA_PFN;
398 max_zone_pfns[ZONE_DMA32] = MAX_DMA32_PFN;
399 max_zone_pfns[ZONE_NORMAL] = end_pfn;
400
44df75e6
MT
401 memory_present(0, 0, end_pfn);
402 sparse_init();
5cb248ab 403 free_area_init_nodes(max_zone_pfns);
1da177e4
LT
404}
405#endif
406
407/* Unmap a kernel mapping if it exists. This is useful to avoid prefetches
408 from the CPU leading to inconsistent cache lines. address and size
409 must be aligned to 2MB boundaries.
410 Does nothing when the mapping doesn't exist. */
411void __init clear_kernel_mapping(unsigned long address, unsigned long size)
412{
413 unsigned long end = address + size;
414
415 BUG_ON(address & ~LARGE_PAGE_MASK);
416 BUG_ON(size & ~LARGE_PAGE_MASK);
417
418 for (; address < end; address += LARGE_PAGE_SIZE) {
419 pgd_t *pgd = pgd_offset_k(address);
420 pud_t *pud;
421 pmd_t *pmd;
422 if (pgd_none(*pgd))
423 continue;
424 pud = pud_offset(pgd, address);
425 if (pud_none(*pud))
426 continue;
427 pmd = pmd_offset(pud, address);
428 if (!pmd || pmd_none(*pmd))
429 continue;
430 if (0 == (pmd_val(*pmd) & _PAGE_PSE)) {
431 /* Could handle this, but it should not happen currently. */
432 printk(KERN_ERR
433 "clear_kernel_mapping: mapping has been split. will leak memory\n");
434 pmd_ERROR(*pmd);
435 }
436 set_pmd(pmd, __pmd(0));
437 }
438 __flush_tlb_all();
439}
440
44df75e6
MT
441/*
442 * Memory hotplug specific functions
44df75e6 443 */
44df75e6
MT
444void online_page(struct page *page)
445{
446 ClearPageReserved(page);
7835e98b 447 init_page_count(page);
44df75e6
MT
448 __free_page(page);
449 totalram_pages++;
450 num_physpages++;
451}
452
bc02af93 453#ifdef CONFIG_MEMORY_HOTPLUG
9d99aaa3
AK
454/*
455 * Memory is added always to NORMAL zone. This means you will never get
456 * additional DMA/DMA32 memory.
457 */
bc02af93 458int arch_add_memory(int nid, u64 start, u64 size)
44df75e6 459{
bc02af93 460 struct pglist_data *pgdat = NODE_DATA(nid);
776ed98b 461 struct zone *zone = pgdat->node_zones + ZONE_NORMAL;
44df75e6
MT
462 unsigned long start_pfn = start >> PAGE_SHIFT;
463 unsigned long nr_pages = size >> PAGE_SHIFT;
464 int ret;
465
45e0b78b
KM
466 init_memory_mapping(start, (start + size -1));
467
44df75e6
MT
468 ret = __add_pages(zone, start_pfn, nr_pages);
469 if (ret)
470 goto error;
471
44df75e6
MT
472 return ret;
473error:
474 printk("%s: Problem encountered in __add_pages!\n", __func__);
475 return ret;
476}
bc02af93 477EXPORT_SYMBOL_GPL(arch_add_memory);
44df75e6 478
8243229f 479#if !defined(CONFIG_ACPI_NUMA) && defined(CONFIG_NUMA)
4942e998
KM
480int memory_add_physaddr_to_nid(u64 start)
481{
482 return 0;
483}
8c2676a5 484EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid);
4942e998
KM
485#endif
486
45e0b78b
KM
487#endif /* CONFIG_MEMORY_HOTPLUG */
488
1da177e4
LT
489static struct kcore_list kcore_mem, kcore_vmalloc, kcore_kernel, kcore_modules,
490 kcore_vsyscall;
491
492void __init mem_init(void)
493{
0a43e4bf 494 long codesize, reservedpages, datasize, initsize;
1da177e4 495
0dc243ae 496 pci_iommu_alloc();
1da177e4 497
48ddb154 498 /* clear_bss() already clear the empty_zero_page */
1da177e4 499
f2633105
IM
500 /* temporary debugging - double check it's true: */
501 {
502 int i;
503
504 for (i = 0; i < 1024; i++)
505 WARN_ON_ONCE(empty_zero_page[i]);
506 }
507
1da177e4
LT
508 reservedpages = 0;
509
510 /* this will put all low memory onto the freelists */
2b97690f 511#ifdef CONFIG_NUMA
0a43e4bf 512 totalram_pages = numa_free_all_bootmem();
1da177e4 513#else
0a43e4bf 514 totalram_pages = free_all_bootmem();
1da177e4 515#endif
5cb248ab
MG
516 reservedpages = end_pfn - totalram_pages -
517 absent_pages_in_range(0, end_pfn);
1da177e4
LT
518
519 after_bootmem = 1;
520
521 codesize = (unsigned long) &_etext - (unsigned long) &_text;
522 datasize = (unsigned long) &_edata - (unsigned long) &_etext;
523 initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin;
524
525 /* Register memory areas for /proc/kcore */
526 kclist_add(&kcore_mem, __va(0), max_low_pfn << PAGE_SHIFT);
527 kclist_add(&kcore_vmalloc, (void *)VMALLOC_START,
528 VMALLOC_END-VMALLOC_START);
529 kclist_add(&kcore_kernel, &_stext, _end - _stext);
530 kclist_add(&kcore_modules, (void *)MODULES_VADDR, MODULES_LEN);
531 kclist_add(&kcore_vsyscall, (void *)VSYSCALL_START,
532 VSYSCALL_END - VSYSCALL_START);
533
0a43e4bf 534 printk("Memory: %luk/%luk available (%ldk kernel code, %ldk reserved, %ldk data, %ldk init)\n",
1da177e4
LT
535 (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
536 end_pfn << (PAGE_SHIFT-10),
537 codesize >> 10,
538 reservedpages << (PAGE_SHIFT-10),
539 datasize >> 10,
540 initsize >> 10);
1da177e4
LT
541}
542
d167a518 543void free_init_pages(char *what, unsigned long begin, unsigned long end)
1da177e4
LT
544{
545 unsigned long addr;
546
d167a518
GH
547 if (begin >= end)
548 return;
549
6fb14755 550 printk(KERN_INFO "Freeing %s: %luk freed\n", what, (end - begin) >> 10);
d167a518 551 for (addr = begin; addr < end; addr += PAGE_SIZE) {
e3ebadd9
LT
552 ClearPageReserved(virt_to_page(addr));
553 init_page_count(virt_to_page(addr));
554 memset((void *)(addr & ~(PAGE_SIZE-1)),
555 POISON_FREE_INITMEM, PAGE_SIZE);
6fb14755
JB
556 if (addr >= __START_KERNEL_map)
557 change_page_attr_addr(addr, 1, __pgprot(0));
e3ebadd9 558 free_page(addr);
1da177e4
LT
559 totalram_pages++;
560 }
6fb14755
JB
561 if (addr > __START_KERNEL_map)
562 global_flush_tlb();
d167a518
GH
563}
564
565void free_initmem(void)
566{
d167a518 567 free_init_pages("unused kernel memory",
e3ebadd9
LT
568 (unsigned long)(&__init_begin),
569 (unsigned long)(&__init_end));
1da177e4
LT
570}
571
67df197b
AV
572#ifdef CONFIG_DEBUG_RODATA
573
67df197b
AV
574void mark_rodata_ro(void)
575{
e3ebadd9 576 unsigned long start = (unsigned long)_stext, end;
67df197b 577
602033ed
LT
578#ifdef CONFIG_HOTPLUG_CPU
579 /* It must still be possible to apply SMP alternatives. */
580 if (num_possible_cpus() > 1)
581 start = (unsigned long)_etext;
582#endif
583
584#ifdef CONFIG_KPROBES
585 start = (unsigned long)__start_rodata;
586#endif
587
e3ebadd9
LT
588 end = (unsigned long)__end_rodata;
589 start = (start + PAGE_SIZE - 1) & PAGE_MASK;
590 end &= PAGE_MASK;
591 if (end <= start)
592 return;
593
594 change_page_attr_addr(start, (end - start) >> PAGE_SHIFT, PAGE_KERNEL_RO);
67df197b 595
6fb14755 596 printk(KERN_INFO "Write protecting the kernel read-only data: %luk\n",
e3ebadd9 597 (end - start) >> 10);
67df197b
AV
598
599 /*
600 * change_page_attr_addr() requires a global_flush_tlb() call after it.
601 * We do this after the printk so that if something went wrong in the
602 * change, the printk gets out at least to give a better debug hint
603 * of who is the culprit.
604 */
605 global_flush_tlb();
606}
607#endif
608
1da177e4
LT
609#ifdef CONFIG_BLK_DEV_INITRD
610void free_initrd_mem(unsigned long start, unsigned long end)
611{
e3ebadd9 612 free_init_pages("initrd memory", start, end);
1da177e4
LT
613}
614#endif
615
616void __init reserve_bootmem_generic(unsigned long phys, unsigned len)
617{
2b97690f 618#ifdef CONFIG_NUMA
1da177e4 619 int nid = phys_to_nid(phys);
5e58a02a
AK
620#endif
621 unsigned long pfn = phys >> PAGE_SHIFT;
622 if (pfn >= end_pfn) {
623 /* This can happen with kdump kernels when accessing firmware
624 tables. */
625 if (pfn < end_pfn_map)
626 return;
627 printk(KERN_ERR "reserve_bootmem: illegal reserve %lx %u\n",
628 phys, len);
629 return;
630 }
631
632 /* Should check here against the e820 map to avoid double free */
633#ifdef CONFIG_NUMA
1da177e4
LT
634 reserve_bootmem_node(NODE_DATA(nid), phys, len);
635#else
636 reserve_bootmem(phys, len);
637#endif
0e0b864e 638 if (phys+len <= MAX_DMA_PFN*PAGE_SIZE) {
e18c6874 639 dma_reserve += len / PAGE_SIZE;
0e0b864e
MG
640 set_dma_reserve(dma_reserve);
641 }
1da177e4
LT
642}
643
644int kern_addr_valid(unsigned long addr)
645{
646 unsigned long above = ((long)addr) >> __VIRTUAL_MASK_SHIFT;
647 pgd_t *pgd;
648 pud_t *pud;
649 pmd_t *pmd;
650 pte_t *pte;
651
652 if (above != 0 && above != -1UL)
653 return 0;
654
655 pgd = pgd_offset_k(addr);
656 if (pgd_none(*pgd))
657 return 0;
658
659 pud = pud_offset(pgd, addr);
660 if (pud_none(*pud))
661 return 0;
662
663 pmd = pmd_offset(pud, addr);
664 if (pmd_none(*pmd))
665 return 0;
666 if (pmd_large(*pmd))
667 return pfn_valid(pmd_pfn(*pmd));
668
669 pte = pte_offset_kernel(pmd, addr);
670 if (pte_none(*pte))
671 return 0;
672 return pfn_valid(pte_pfn(*pte));
673}
674
103efcd9 675/* A pseudo VMA to allow ptrace access for the vsyscall page. This only
1e014410
AK
676 covers the 64bit vsyscall page now. 32bit has a real VMA now and does
677 not need special handling anymore. */
1da177e4
LT
678
679static struct vm_area_struct gate_vma = {
680 .vm_start = VSYSCALL_START,
103efcd9
EP
681 .vm_end = VSYSCALL_START + (VSYSCALL_MAPPED_PAGES << PAGE_SHIFT),
682 .vm_page_prot = PAGE_READONLY_EXEC,
683 .vm_flags = VM_READ | VM_EXEC
1da177e4
LT
684};
685
1da177e4
LT
686struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
687{
688#ifdef CONFIG_IA32_EMULATION
1e014410
AK
689 if (test_tsk_thread_flag(tsk, TIF_IA32))
690 return NULL;
1da177e4
LT
691#endif
692 return &gate_vma;
693}
694
695int in_gate_area(struct task_struct *task, unsigned long addr)
696{
697 struct vm_area_struct *vma = get_gate_vma(task);
1e014410
AK
698 if (!vma)
699 return 0;
1da177e4
LT
700 return (addr >= vma->vm_start) && (addr < vma->vm_end);
701}
702
703/* Use this when you have no reliable task/vma, typically from interrupt
704 * context. It is less reliable than using the task's vma and may give
705 * false positives.
706 */
707int in_gate_area_no_task(unsigned long addr)
708{
1e014410 709 return (addr >= VSYSCALL_START) && (addr < VSYSCALL_END);
1da177e4 710}
2e1c49db 711
2aae950b
AK
712const char *arch_vma_name(struct vm_area_struct *vma)
713{
714 if (vma->vm_mm && vma->vm_start == (long)vma->vm_mm->context.vdso)
715 return "[vdso]";
716 if (vma == &gate_vma)
717 return "[vsyscall]";
718 return NULL;
719}
0889eba5
CL
720
721#ifdef CONFIG_SPARSEMEM_VMEMMAP
722/*
723 * Initialise the sparsemem vmemmap using huge-pages at the PMD level.
724 */
725int __meminit vmemmap_populate(struct page *start_page,
726 unsigned long size, int node)
727{
728 unsigned long addr = (unsigned long)start_page;
729 unsigned long end = (unsigned long)(start_page + size);
730 unsigned long next;
731 pgd_t *pgd;
732 pud_t *pud;
733 pmd_t *pmd;
734
735 for (; addr < end; addr = next) {
736 next = pmd_addr_end(addr, end);
737
738 pgd = vmemmap_pgd_populate(addr, node);
739 if (!pgd)
740 return -ENOMEM;
741 pud = vmemmap_pud_populate(pgd, addr, node);
742 if (!pud)
743 return -ENOMEM;
744
745 pmd = pmd_offset(pud, addr);
746 if (pmd_none(*pmd)) {
747 pte_t entry;
748 void *p = vmemmap_alloc_block(PMD_SIZE, node);
749 if (!p)
750 return -ENOMEM;
751
27ec161f 752 entry = pfn_pte(__pa(p) >> PAGE_SHIFT, PAGE_KERNEL_LARGE);
0889eba5
CL
753 set_pmd(pmd, __pmd(pte_val(entry)));
754
755 printk(KERN_DEBUG " [%lx-%lx] PMD ->%p on node %d\n",
756 addr, addr + PMD_SIZE - 1, p, node);
757 } else
758 vmemmap_verify((pte_t *)pmd, node, addr, next);
759 }
760
761 return 0;
762}
763#endif