memory.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "u.h"
  2. #include "mem.h"
  3. #include "dat.h"
  4. #include "fns.h"
  5. #include "lib.h"
  6. static int debug;
  7. enum {
  8. Maxbank = 2,
  9. };
  10. Bank bank[Maxbank];
  11. int nbank;
  12. void
  13. meminit(void)
  14. {
  15. Memdsc *mem;
  16. Memclust *c;
  17. int i;
  18. uvlong npage, p0, p1;
  19. extern ulong _main[], edata[];
  20. mem = (Memdsc*)((ulong)hwrpb + hwrpb->memoff);
  21. if (debug)
  22. print("\nnumber of clusters: %lld\n", mem->nclust);
  23. npage = 0;
  24. conf.maxphys = 0;
  25. for (i = 0; i < mem->nclust; i++) {
  26. c = &mem->clust[i];
  27. p0 = c->pfn*hwrpb->by2pg;
  28. p1 = (c->pfn+c->npages)*hwrpb->by2pg;
  29. if (debug) {
  30. print("clust%d: %llux-%llux, tested %llud/%llud vabitm %llux usage %llux\n",
  31. i, p0, p1, c->ntest, c->npages, c->vabitm, c->usage);
  32. if (c->vabitm)
  33. print("\tfirst 64 pages: %llux\n", *(uvlong*)c->vabitm);
  34. }
  35. npage += c->npages;
  36. if (p1 > conf.maxphys)
  37. conf.maxphys = p1;
  38. switch ((ulong)c->usage&3) {
  39. case 0:
  40. if (nbank >= Maxbank) {
  41. print("increase Maxbank; lost %lldMB\n", c->npages*hwrpb->by2pg/MB);
  42. break;
  43. }
  44. bank[nbank].min = p0;
  45. bank[nbank].max = p1;
  46. nbank++;
  47. break;
  48. case 2:
  49. print("nvram skipped\n");
  50. break;
  51. }
  52. }
  53. if (debug)
  54. print("\n");
  55. print("Memory size: %lludMB\n", npage*hwrpb->by2pg/MB);
  56. print("\n");
  57. /* kernel virtual space = 2G. leave room for kmapio */
  58. if (conf.maxphys > 1024*MB) {
  59. print("meminit: too much physical memory; only first gigabyte mapped\n\n");
  60. conf.maxphys = 1024*MB;
  61. }
  62. conf.nbank = nbank;
  63. conf.bank = bank;
  64. }
  65. int
  66. validrgn(ulong min, ulong max)
  67. {
  68. int i;
  69. min &= ~KZERO;
  70. max &= ~KZERO;
  71. for (i = 0; i < nbank; i++)
  72. if (bank[i].min <= min && max <= bank[i].max)
  73. return 1;
  74. return 0;
  75. }
  76. uvlong
  77. allocate(int pages)
  78. {
  79. uvlong top, len;
  80. int from, i;
  81. top = 0;
  82. len = pages*hwrpb->by2pg;
  83. from = -1;
  84. for (i = 0; i < nbank; i++)
  85. if (bank[i].max - bank[i].min >= len && bank[i].max > top) {
  86. top = bank[i].max;
  87. from = i;
  88. }
  89. if (from < 0)
  90. return 0;
  91. bank[from].max -= len;
  92. conf.bank[from].max = bank[from].max;
  93. for (i = 0; i < len>>3; i++)
  94. stqp(bank[from].max+8*i, 0);
  95. return bank[from].max;
  96. }