init.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. i = max_mapnr;
  25. while (i-- > 0) {
  26. total++;
  27. if (PageReserved(mem_map+i))
  28. reserved++;
  29. else if (PageSwapCache(mem_map+i))
  30. cached++;
  31. else if (!page_count(mem_map+i))
  32. free++;
  33. else if (page_count(mem_map+i) == 1)
  34. nonshared++;
  35. else
  36. shared += page_count(mem_map+i) - 1;
  37. }
  38. printk("%d pages of RAM\n",total);
  39. printk("%d free pages\n",free);
  40. printk("%d reserved pages\n",reserved);
  41. printk("%d pages nonshared\n",nonshared);
  42. printk("%d pages shared\n",shared);
  43. printk("%d pages swap cached\n",cached);
  44. }
  45. void __init
  46. mem_init(void)
  47. {
  48. int codesize, reservedpages, datasize, initsize;
  49. unsigned long tmp;
  50. if(!mem_map)
  51. BUG();
  52. /* max/min_low_pfn was set by setup.c
  53. * now we just copy it to some other necessary places...
  54. *
  55. * high_memory was also set in setup.c
  56. */
  57. max_mapnr = num_physpages = max_low_pfn - min_low_pfn;
  58. /* this will put all memory onto the freelists */
  59. totalram_pages = free_all_bootmem();
  60. reservedpages = 0;
  61. for (tmp = 0; tmp < max_mapnr; tmp++) {
  62. /*
  63. * Only count reserved RAM pages
  64. */
  65. if (PageReserved(mem_map + tmp))
  66. reservedpages++;
  67. }
  68. codesize = (unsigned long) &_etext - (unsigned long) &_stext;
  69. datasize = (unsigned long) &_edata - (unsigned long) &_etext;
  70. initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin;
  71. printk(KERN_INFO
  72. "Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, "
  73. "%dk init)\n" ,
  74. (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
  75. max_mapnr << (PAGE_SHIFT-10),
  76. codesize >> 10,
  77. reservedpages << (PAGE_SHIFT-10),
  78. datasize >> 10,
  79. initsize >> 10
  80. );
  81. }
  82. /* free the pages occupied by initialization code */
  83. void
  84. free_initmem(void)
  85. {
  86. unsigned long addr;
  87. addr = (unsigned long)(&__init_begin);
  88. for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
  89. ClearPageReserved(virt_to_page(addr));
  90. init_page_count(virt_to_page(addr));
  91. free_page(addr);
  92. totalram_pages++;
  93. }
  94. printk (KERN_INFO "Freeing unused kernel memory: %luk freed\n",
  95. (unsigned long)((&__init_end - &__init_begin) >> 10));
  96. }