1
2
3
4
5
6
7#include <linux/config.h>
8#include <linux/kernel.h>
9#include <linux/init.h>
10
11#include <linux/bootmem.h>
12#include <linux/efi.h>
13#include <linux/elf.h>
14#include <linux/mm.h>
15#include <linux/mmzone.h>
16#include <linux/module.h>
17#include <linux/personality.h>
18#include <linux/reboot.h>
19#include <linux/slab.h>
20#include <linux/swap.h>
21#include <linux/proc_fs.h>
22#include <linux/bitops.h>
23
24#include <asm/a.out.h>
25#include <asm/dma.h>
26#include <asm/ia32.h>
27#include <asm/io.h>
28#include <asm/machvec.h>
29#include <asm/numa.h>
30#include <asm/patch.h>
31#include <asm/pgalloc.h>
32#include <asm/sal.h>
33#include <asm/sections.h>
34#include <asm/system.h>
35#include <asm/tlb.h>
36#include <asm/uaccess.h>
37#include <asm/unistd.h>
38#include <asm/mca.h>
39
40DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
41
42extern void ia64_tlb_init (void);
43
44unsigned long MAX_DMA_ADDRESS = PAGE_OFFSET + 0x100000000UL;
45
46#ifdef CONFIG_VIRTUAL_MEM_MAP
47unsigned long vmalloc_end = VMALLOC_END_INIT;
48EXPORT_SYMBOL(vmalloc_end);
49struct page *vmem_map;
50EXPORT_SYMBOL(vmem_map);
51#endif
52
53static int pgt_cache_water[2] = { 25, 50 };
54
55struct page *zero_page_memmap_ptr;
56EXPORT_SYMBOL(zero_page_memmap_ptr);
57
58void
59check_pgt_cache (void)
60{
61 int low, high;
62
63 low = pgt_cache_water[0];
64 high = pgt_cache_water[1];
65
66 preempt_disable();
67 if (pgtable_cache_size > (u64) high) {
68 do {
69 if (pgd_quicklist)
70 free_page((unsigned long)pgd_alloc_one_fast(NULL));
71 if (pmd_quicklist)
72 free_page((unsigned long)pmd_alloc_one_fast(NULL, 0));
73 } while (pgtable_cache_size > (u64) low);
74 }
75 preempt_enable();
76}
77
78void
79update_mmu_cache (struct vm_area_struct *vma, unsigned long vaddr, pte_t pte)
80{
81 unsigned long addr;
82 struct page *page;
83
84 if (!pte_exec(pte))
85 return;
86
87 page = pte_page(pte);
88
89 addr = (unsigned long) page_address(page);
90
91 if (test_bit(PG_arch_1, &page->flags))
92 return;
93
94 flush_icache_range(addr, addr + PAGE_SIZE);
95 set_bit(PG_arch_1, &page->flags);
96}
97
98inline void
99ia64_set_rbs_bot (void)
100{
101 unsigned long stack_size = current->signal->rlim[RLIMIT_STACK].rlim_max & -16;
102
103 if (stack_size > MAX_USER_STACK_SIZE)
104 stack_size = MAX_USER_STACK_SIZE;
105 current->thread.rbs_bot = STACK_TOP - stack_size;
106}
107
108
109
110
111
112
113
114void
115ia64_init_addr_space (void)
116{
117 struct vm_area_struct *vma;
118
119 ia64_set_rbs_bot();
120
121
122
123
124
125
126 vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
127 if (vma) {
128 memset(vma, 0, sizeof(*vma));
129 vma->vm_mm = current->mm;
130 vma->vm_start = current->thread.rbs_bot & PAGE_MASK;
131 vma->vm_end = vma->vm_start + PAGE_SIZE;
132 vma->vm_page_prot = protection_map[VM_DATA_DEFAULT_FLAGS & 0x7];
133 vma->vm_flags = VM_DATA_DEFAULT_FLAGS | VM_GROWSUP;
134 down_write(¤t->mm->mmap_sem);
135 if (insert_vm_struct(current->mm, vma)) {
136 up_write(¤t->mm->mmap_sem);
137 kmem_cache_free(vm_area_cachep, vma);
138 return;
139 }
140 up_write(¤t->mm->mmap_sem);
141 }
142
143
144 if (!(current->personality & MMAP_PAGE_ZERO)) {
145 vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
146 if (vma) {
147 memset(vma, 0, sizeof(*vma));
148 vma->vm_mm = current->mm;
149 vma->vm_end = PAGE_SIZE;
150 vma->vm_page_prot = __pgprot(pgprot_val(PAGE_READONLY) | _PAGE_MA_NAT);
151 vma->vm_flags = VM_READ | VM_MAYREAD | VM_IO | VM_RESERVED;
152 down_write(¤t->mm->mmap_sem);
153 if (insert_vm_struct(current->mm, vma)) {
154 up_write(¤t->mm->mmap_sem);
155 kmem_cache_free(vm_area_cachep, vma);
156 return;
157 }
158 up_write(¤t->mm->mmap_sem);
159 }
160 }
161}
162
163void
164free_initmem (void)
165{
166 unsigned long addr, eaddr;
167
168 addr = (unsigned long) ia64_imva(__init_begin);
169 eaddr = (unsigned long) ia64_imva(__init_end);
170 while (addr < eaddr) {
171 ClearPageReserved(virt_to_page(addr));
172 set_page_count(virt_to_page(addr), 1);
173 free_page(addr);
174 ++totalram_pages;
175 addr += PAGE_SIZE;
176 }
177 printk(KERN_INFO "Freeing unused kernel memory: %ldkB freed\n",
178 (__init_end - __init_begin) >> 10);
179}
180
181void
182free_initrd_mem (unsigned long start, unsigned long end)
183{
184 struct page *page;
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216 start = PAGE_ALIGN(start);
217 end = end & PAGE_MASK;
218
219 if (start < end)
220 printk(KERN_INFO "Freeing initrd memory: %ldkB freed\n", (end - start) >> 10);
221
222 for (; start < end; start += PAGE_SIZE) {
223 if (!virt_addr_valid(start))
224 continue;
225 page = virt_to_page(start);
226 ClearPageReserved(page);
227 set_page_count(page, 1);
228 free_page(start);
229 ++totalram_pages;
230 }
231}
232
233
234
235
236struct page *
237put_kernel_page (struct page *page, unsigned long address, pgprot_t pgprot)
238{
239 pgd_t *pgd;
240 pud_t *pud;
241 pmd_t *pmd;
242 pte_t *pte;
243
244 if (!PageReserved(page))
245 printk(KERN_ERR "put_kernel_page: page at 0x%p not in reserved memory\n",
246 page_address(page));
247
248 pgd = pgd_offset_k(address);
249
250 spin_lock(&init_mm.page_table_lock);
251 {
252 pud = pud_alloc(&init_mm, pgd, address);
253 if (!pud)
254 goto out;
255
256 pmd = pmd_alloc(&init_mm, pud, address);
257 if (!pmd)
258 goto out;
259 pte = pte_alloc_map(&init_mm, pmd, address);
260 if (!pte)
261 goto out;
262 if (!pte_none(*pte)) {
263 pte_unmap(pte);
264 goto out;
265 }
266 set_pte(pte, mk_pte(page, pgprot));
267 pte_unmap(pte);
268 }
269 out: spin_unlock(&init_mm.page_table_lock);
270
271 return page;
272}
273
274static void
275setup_gate (void)
276{
277 struct page *page;
278
279
280
281
282
283 page = virt_to_page(ia64_imva(__start_gate_section));
284 put_kernel_page(page, GATE_ADDR, PAGE_READONLY);
285#ifdef HAVE_BUGGY_SEGREL
286 page = virt_to_page(ia64_imva(__start_gate_section + PAGE_SIZE));
287 put_kernel_page(page, GATE_ADDR + PAGE_SIZE, PAGE_GATE);
288#else
289 put_kernel_page(page, GATE_ADDR + PERCPU_PAGE_SIZE, PAGE_GATE);
290#endif
291 ia64_patch_gate();
292}
293
294void __devinit
295ia64_mmu_init (void *my_cpu_data)
296{
297 unsigned long psr, pta, impl_va_bits;
298 extern void __devinit tlb_init (void);
299
300#ifdef CONFIG_DISABLE_VHPT
301# define VHPT_ENABLE_BIT 0
302#else
303# define VHPT_ENABLE_BIT 1
304#endif
305
306
307 psr = ia64_clear_ic();
308 ia64_itr(0x2, IA64_TR_PERCPU_DATA, PERCPU_ADDR,
309 pte_val(pfn_pte(__pa(my_cpu_data) >> PAGE_SHIFT, PAGE_KERNEL)),
310 PERCPU_PAGE_SHIFT);
311
312 ia64_set_psr(psr);
313 ia64_srlz_i();
314
315
316
317
318
319
320
321
322
323
324
325
326# define pte_bits 3
327# define mapped_space_bits (3*(PAGE_SHIFT - pte_bits) + PAGE_SHIFT)
328
329
330
331
332
333
334
335# define vmlpt_bits (impl_va_bits - PAGE_SHIFT + pte_bits)
336# define POW2(n) (1ULL << (n))
337
338 impl_va_bits = ffz(~(local_cpu_data->unimpl_va_mask | (7UL << 61)));
339
340 if (impl_va_bits < 51 || impl_va_bits > 61)
341 panic("CPU has bogus IMPL_VA_MSB value of %lu!\n", impl_va_bits - 1);
342
343
344 pta = POW2(61) - POW2(vmlpt_bits);
345
346 if (POW2(mapped_space_bits) >= pta)
347 panic("mm/init: overlap between virtually mapped linear page table and "
348 "mapped kernel space!");
349
350
351
352
353
354
355 ia64_set_pta(pta | (0 << 8) | (vmlpt_bits << 2) | VHPT_ENABLE_BIT);
356
357 ia64_tlb_init();
358
359#ifdef CONFIG_HUGETLB_PAGE
360 ia64_set_rr(HPAGE_REGION_BASE, HPAGE_SHIFT << 2);
361 ia64_srlz_d();
362#endif
363}
364
365#ifdef CONFIG_VIRTUAL_MEM_MAP
366
367int
368create_mem_map_page_table (u64 start, u64 end, void *arg)
369{
370 unsigned long address, start_page, end_page;
371 struct page *map_start, *map_end;
372 int node;
373 pgd_t *pgd;
374 pud_t *pud;
375 pmd_t *pmd;
376 pte_t *pte;
377
378 map_start = vmem_map + (__pa(start) >> PAGE_SHIFT);
379 map_end = vmem_map + (__pa(end) >> PAGE_SHIFT);
380
381 start_page = (unsigned long) map_start & PAGE_MASK;
382 end_page = PAGE_ALIGN((unsigned long) map_end);
383 node = paddr_to_nid(__pa(start));
384
385 for (address = start_page; address < end_page; address += PAGE_SIZE) {
386 pgd = pgd_offset_k(address);
387 if (pgd_none(*pgd))
388 pgd_populate(&init_mm, pgd, alloc_bootmem_pages_node(NODE_DATA(node), PAGE_SIZE));
389 pud = pud_offset(pgd, address);
390
391 if (pud_none(*pud))
392 pud_populate(&init_mm, pud, alloc_bootmem_pages_node(NODE_DATA(node), PAGE_SIZE));
393 pmd = pmd_offset(pud, address);
394
395 if (pmd_none(*pmd))
396 pmd_populate_kernel(&init_mm, pmd, alloc_bootmem_pages_node(NODE_DATA(node), PAGE_SIZE));
397 pte = pte_offset_kernel(pmd, address);
398
399 if (pte_none(*pte))
400 set_pte(pte, pfn_pte(__pa(alloc_bootmem_pages_node(NODE_DATA(node), PAGE_SIZE)) >> PAGE_SHIFT,
401 PAGE_KERNEL));
402 }
403 return 0;
404}
405
406struct memmap_init_callback_data {
407 struct page *start;
408 struct page *end;
409 int nid;
410 unsigned long zone;
411};
412
413static int
414virtual_memmap_init (u64 start, u64 end, void *arg)
415{
416 struct memmap_init_callback_data *args;
417 struct page *map_start, *map_end;
418
419 args = (struct memmap_init_callback_data *) arg;
420 map_start = vmem_map + (__pa(start) >> PAGE_SHIFT);
421 map_end = vmem_map + (__pa(end) >> PAGE_SHIFT);
422
423 if (map_start < args->start)
424 map_start = args->start;
425 if (map_end > args->end)
426 map_end = args->end;
427
428
429
430
431
432
433 map_start -= ((unsigned long) map_start & (PAGE_SIZE - 1)) / sizeof(struct page);
434 map_end += ((PAGE_ALIGN((unsigned long) map_end) - (unsigned long) map_end)
435 / sizeof(struct page));
436
437 if (map_start < map_end)
438 memmap_init_zone((unsigned long)(map_end - map_start),
439 args->nid, args->zone, page_to_pfn(map_start));
440 return 0;
441}
442
443void
444memmap_init (unsigned long size, int nid, unsigned long zone,
445 unsigned long start_pfn)
446{
447 if (!vmem_map)
448 memmap_init_zone(size, nid, zone, start_pfn);
449 else {
450 struct page *start;
451 struct memmap_init_callback_data args;
452
453 start = pfn_to_page(start_pfn);
454 args.start = start;
455 args.end = start + size;
456 args.nid = nid;
457 args.zone = zone;
458
459 efi_memmap_walk(virtual_memmap_init, &args);
460 }
461}
462
463int
464ia64_pfn_valid (unsigned long pfn)
465{
466 char byte;
467 struct page *pg = pfn_to_page(pfn);
468
469 return (__get_user(byte, (char __user *) pg) == 0)
470 && ((((u64)pg & PAGE_MASK) == (((u64)(pg + 1) - 1) & PAGE_MASK))
471 || (__get_user(byte, (char __user *) (pg + 1) - 1) == 0));
472}
473EXPORT_SYMBOL(ia64_pfn_valid);
474
475int
476find_largest_hole (u64 start, u64 end, void *arg)
477{
478 u64 *max_gap = arg;
479
480 static u64 last_end = PAGE_OFFSET;
481
482
483
484 if (*max_gap < (start - last_end))
485 *max_gap = start - last_end;
486 last_end = end;
487 return 0;
488}
489#endif
490
491static int
492count_reserved_pages (u64 start, u64 end, void *arg)
493{
494 unsigned long num_reserved = 0;
495 unsigned long *count = arg;
496
497 for (; start < end; start += PAGE_SIZE)
498 if (PageReserved(virt_to_page(start)))
499 ++num_reserved;
500 *count += num_reserved;
501 return 0;
502}
503
504
505
506
507
508
509
510
511
512static int nolwsys;
513
514static int __init
515nolwsys_setup (char *s)
516{
517 nolwsys = 1;
518 return 1;
519}
520
521__setup("nolwsys", nolwsys_setup);
522
523void
524mem_init (void)
525{
526 long reserved_pages, codesize, datasize, initsize;
527 unsigned long num_pgt_pages;
528 pg_data_t *pgdat;
529 int i;
530 static struct kcore_list kcore_mem, kcore_vmem, kcore_kernel;
531
532#ifdef CONFIG_PCI
533
534
535
536
537
538 platform_dma_init();
539#endif
540
541#ifndef CONFIG_DISCONTIGMEM
542 if (!mem_map)
543 BUG();
544 max_mapnr = max_low_pfn;
545#endif
546
547 high_memory = __va(max_low_pfn * PAGE_SIZE);
548
549 kclist_add(&kcore_mem, __va(0), max_low_pfn * PAGE_SIZE);
550 kclist_add(&kcore_vmem, (void *)VMALLOC_START, VMALLOC_END-VMALLOC_START);
551 kclist_add(&kcore_kernel, _stext, _end - _stext);
552
553 for_each_pgdat(pgdat)
554 totalram_pages += free_all_bootmem_node(pgdat);
555
556 reserved_pages = 0;
557 efi_memmap_walk(count_reserved_pages, &reserved_pages);
558
559 codesize = (unsigned long) _etext - (unsigned long) _stext;
560 datasize = (unsigned long) _edata - (unsigned long) _etext;
561 initsize = (unsigned long) __init_end - (unsigned long) __init_begin;
562
563 printk(KERN_INFO "Memory: %luk/%luk available (%luk code, %luk reserved, "
564 "%luk data, %luk init)\n", (unsigned long) nr_free_pages() << (PAGE_SHIFT - 10),
565 num_physpages << (PAGE_SHIFT - 10), codesize >> 10,
566 reserved_pages << (PAGE_SHIFT - 10), datasize >> 10, initsize >> 10);
567
568
569
570
571
572
573
574# define NUM_TASKS 500
575 num_pgt_pages = nr_free_pages() / PTRS_PER_PGD + NUM_TASKS;
576 if (num_pgt_pages > nr_free_pages() / 10)
577 num_pgt_pages = nr_free_pages() / 10;
578 if (num_pgt_pages > (u64) pgt_cache_water[1])
579 pgt_cache_water[1] = num_pgt_pages;
580
581
582
583
584
585
586 for (i = 0; i < NR_syscalls; ++i) {
587 extern unsigned long fsyscall_table[NR_syscalls];
588 extern unsigned long sys_call_table[NR_syscalls];
589
590 if (!fsyscall_table[i] || nolwsys)
591 fsyscall_table[i] = sys_call_table[i] | 1;
592 }
593 setup_gate();
594
595#ifdef CONFIG_IA32_SUPPORT
596 ia32_mem_init();
597#endif
598}
599