2005-04-17 06:20:36 +08:00
|
|
|
/*
|
|
|
|
* linux/arch/cris/mm/init.c
|
|
|
|
*
|
|
|
|
* Copyright (C) 1995 Linus Torvalds
|
|
|
|
* Copyright (C) 2000,2001 Axis Communications AB
|
|
|
|
*
|
|
|
|
* Authors: Bjorn Wesen (bjornw@axis.com)
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <linux/init.h>
|
|
|
|
#include <linux/bootmem.h>
|
|
|
|
#include <asm/tlb.h>
|
|
|
|
|
|
|
|
DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
|
|
|
|
|
|
|
|
unsigned long empty_zero_page;
|
|
|
|
|
|
|
|
extern char _stext, _edata, _etext; /* From linkerscript */
|
|
|
|
extern char __init_begin, __init_end;
|
|
|
|
|
|
|
|
void
|
|
|
|
show_mem(void)
|
|
|
|
{
|
|
|
|
int i,free = 0,total = 0,cached = 0, reserved = 0, nonshared = 0;
|
|
|
|
int shared = 0;
|
|
|
|
|
|
|
|
printk("\nMem-info:\n");
|
|
|
|
show_free_areas();
|
|
|
|
i = max_mapnr;
|
|
|
|
while (i-- > 0) {
|
|
|
|
total++;
|
|
|
|
if (PageReserved(mem_map+i))
|
|
|
|
reserved++;
|
|
|
|
else if (PageSwapCache(mem_map+i))
|
|
|
|
cached++;
|
|
|
|
else if (!page_count(mem_map+i))
|
|
|
|
free++;
|
|
|
|
else if (page_count(mem_map+i) == 1)
|
|
|
|
nonshared++;
|
|
|
|
else
|
|
|
|
shared += page_count(mem_map+i) - 1;
|
|
|
|
}
|
|
|
|
printk("%d pages of RAM\n",total);
|
|
|
|
printk("%d free pages\n",free);
|
|
|
|
printk("%d reserved pages\n",reserved);
|
|
|
|
printk("%d pages nonshared\n",nonshared);
|
|
|
|
printk("%d pages shared\n",shared);
|
|
|
|
printk("%d pages swap cached\n",cached);
|
|
|
|
}
|
|
|
|
|
|
|
|
void __init
|
|
|
|
mem_init(void)
|
|
|
|
{
|
|
|
|
int codesize, reservedpages, datasize, initsize;
|
|
|
|
unsigned long tmp;
|
|
|
|
|
|
|
|
if(!mem_map)
|
|
|
|
BUG();
|
|
|
|
|
|
|
|
/* max/min_low_pfn was set by setup.c
|
|
|
|
* now we just copy it to some other necessary places...
|
|
|
|
*
|
|
|
|
* high_memory was also set in setup.c
|
|
|
|
*/
|
|
|
|
|
|
|
|
max_mapnr = num_physpages = max_low_pfn - min_low_pfn;
|
|
|
|
|
|
|
|
/* this will put all memory onto the freelists */
|
|
|
|
totalram_pages = free_all_bootmem();
|
|
|
|
|
|
|
|
reservedpages = 0;
|
|
|
|
for (tmp = 0; tmp < max_mapnr; tmp++) {
|
|
|
|
/*
|
|
|
|
* Only count reserved RAM pages
|
|
|
|
*/
|
|
|
|
if (PageReserved(mem_map + tmp))
|
|
|
|
reservedpages++;
|
|
|
|
}
|
|
|
|
|
|
|
|
codesize = (unsigned long) &_etext - (unsigned long) &_stext;
|
|
|
|
datasize = (unsigned long) &_edata - (unsigned long) &_etext;
|
|
|
|
initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin;
|
|
|
|
|
|
|
|
printk(KERN_INFO
|
|
|
|
"Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, "
|
|
|
|
"%dk init)\n" ,
|
|
|
|
(unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
|
|
|
|
max_mapnr << (PAGE_SHIFT-10),
|
|
|
|
codesize >> 10,
|
|
|
|
reservedpages << (PAGE_SHIFT-10),
|
|
|
|
datasize >> 10,
|
|
|
|
initsize >> 10
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* free the pages occupied by initialization code */
|
|
|
|
|
|
|
|
void
|
|
|
|
free_initmem(void)
|
|
|
|
{
|
|
|
|
unsigned long addr;
|
|
|
|
|
|
|
|
addr = (unsigned long)(&__init_begin);
|
|
|
|
for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
|
|
|
|
ClearPageReserved(virt_to_page(addr));
|
2006-03-22 16:08:40 +08:00
|
|
|
init_page_count(virt_to_page(addr));
|
2005-04-17 06:20:36 +08:00
|
|
|
free_page(addr);
|
|
|
|
totalram_pages++;
|
|
|
|
}
|
|
|
|
printk (KERN_INFO "Freeing unused kernel memory: %luk freed\n",
|
|
|
|
(unsigned long)((&__init_end - &__init_begin) >> 10));
|
|
|
|
}
|