1
2
3#include <linux/init.h>
4#include <linux/bootmem.h>
5#include <asm/tlb.h>
6
7DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
8
9unsigned long empty_zero_page;
10
11extern char _stext, _edata, _etext; /* From linkerscript */
12extern char __init_begin, __init_end;
13
14void
15show_mem(void)
16{
17	int i,free = 0,total = 0,cached = 0, reserved = 0, nonshared = 0;
18	int shared = 0;
19
20	printk("\nMem-info:\n");
21	show_free_areas();
22	printk("Free swap:       %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
23	i = max_mapnr;
24	while (i-- > 0) {
25		total++;
26		if (PageReserved(mem_map+i))
27			reserved++;
28		else if (PageSwapCache(mem_map+i))
29			cached++;
30		else if (!page_count(mem_map+i))
31			free++;
32		else if (page_count(mem_map+i) == 1)
33			nonshared++;
34		else
35			shared += page_count(mem_map+i) - 1;
36	}
37	printk("%d pages of RAM\n",total);
38	printk("%d free pages\n",free);
39	printk("%d reserved pages\n",reserved);
40	printk("%d pages nonshared\n",nonshared);
41	printk("%d pages shared\n",shared);
42	printk("%d pages swap cached\n",cached);
43}
44
45void __init
46mem_init(void)
47{
48	int codesize, reservedpages, datasize, initsize;
49	unsigned long tmp;
50
51	if(!mem_map)
52		BUG();
53
54	/* max/min_low_pfn was set by setup.c
55	 * now we just copy it to some other necessary places...
56	 *
57	 * high_memory was also set in setup.c
58	 */
59
60	max_mapnr = num_physpages = max_low_pfn - min_low_pfn;
61
62	/* this will put all memory onto the freelists */
63        totalram_pages = free_all_bootmem();
64
65	reservedpages = 0;
66	for (tmp = 0; tmp < max_mapnr; tmp++) {
67		/*
68                 * Only count reserved RAM pages
69                 */
70		if (PageReserved(mem_map + tmp))
71			reservedpages++;
72	}
73
74	codesize =  (unsigned long) &_etext - (unsigned long) &_stext;
75        datasize =  (unsigned long) &_edata - (unsigned long) &_etext;
76        initsize =  (unsigned long) &__init_end - (unsigned long) &__init_begin;
77
78        printk(KERN_INFO
79               "Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, "
80	       "%dk init)\n" ,
81	       (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
82	       max_mapnr << (PAGE_SHIFT-10),
83	       codesize >> 10,
84	       reservedpages << (PAGE_SHIFT-10),
85	       datasize >> 10,
86	       initsize >> 10
87               );
88}
89
90/* free the pages occupied by initialization code */
91
92void
93free_initmem(void)
94{
95        unsigned long addr;
96
97        addr = (unsigned long)(&__init_begin);
98        for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
99                ClearPageReserved(virt_to_page(addr));
100                init_page_count(virt_to_page(addr));
101                free_page(addr);
102                totalram_pages++;
103        }
104        printk (KERN_INFO "Freeing unused kernel memory: %luk freed\n",
105		(unsigned long)((&__init_end - &__init_begin) >> 10));
106}
107