init.c 2.9 KB

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