2005-04-16 15:20:36 -07: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 __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 00:08:40 -08:00
init_page_count ( virt_to_page ( addr ) ) ;
2005-04-16 15:20:36 -07:00
free_page ( addr ) ;
totalram_pages + + ;
}
printk ( KERN_INFO " Freeing unused kernel memory: %luk freed \n " ,
( unsigned long ) ( ( & __init_end - & __init_begin ) > > 10 ) ) ;
}