malloc.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include "all.h"
  2. #include "io.h"
  3. long niob;
  4. long nhiob;
  5. Hiob *hiob;
  6. /*
  7. * Called to allocate permanent data structures
  8. * Alignment is in number of bytes. It pertains both to the start and
  9. * end of the allocated memory.
  10. */
  11. void*
  12. ialloc(ulong n, int align)
  13. {
  14. void *p = mallocalign(n, align, 0, 0);
  15. if (p == nil)
  16. panic("ialloc: out of memory");
  17. memset(p, 0, n);
  18. return p;
  19. }
  20. void
  21. prbanks(void)
  22. {
  23. Mbank *mbp;
  24. for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++)
  25. print("bank[%ld]: base 0x%8.8lux, limit 0x%8.8lux (%.0fMB)\n",
  26. mbp - mconf.bank, mbp->base, mbp->limit,
  27. (mbp->limit - mbp->base)/(double)MB);
  28. }
  29. static void
  30. cmd_memory(int, char *[])
  31. {
  32. prbanks();
  33. }
  34. enum { HWIDTH = 8 }; /* buffers per hash */
  35. /*
  36. * allocate rest of mem
  37. * for io buffers.
  38. */
  39. void
  40. iobufinit(void)
  41. {
  42. long m;
  43. int i;
  44. char *xiop;
  45. Iobuf *p, *q;
  46. Hiob *hp;
  47. Mbank *mbp;
  48. wlock(&mainlock); /* init */
  49. wunlock(&mainlock);
  50. prbanks();
  51. m = 0;
  52. for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++)
  53. m += mbp->limit - mbp->base;
  54. niob = m / (sizeof(Iobuf) + RBUFSIZE + sizeof(Hiob)/HWIDTH);
  55. nhiob = niob / HWIDTH;
  56. while(!prime(nhiob))
  57. nhiob++;
  58. print("\t%ld buffers; %ld hashes\n", niob, nhiob);
  59. hiob = ialloc(nhiob * sizeof(Hiob), 0);
  60. hp = hiob;
  61. for(i=0; i<nhiob; i++) {
  62. lock(hp);
  63. unlock(hp);
  64. hp++;
  65. }
  66. p = ialloc(niob * sizeof(Iobuf), 0);
  67. xiop = ialloc(niob * RBUFSIZE, 0);
  68. hp = hiob;
  69. for(i=0; i < niob; i++) {
  70. // p->name = "buf";
  71. qlock(p);
  72. qunlock(p);
  73. if(hp == hiob)
  74. hp = hiob + nhiob;
  75. hp--;
  76. q = hp->link;
  77. if(q) {
  78. p->fore = q;
  79. p->back = q->back;
  80. q->back = p;
  81. p->back->fore = p;
  82. } else {
  83. hp->link = p;
  84. p->fore = p;
  85. p->back = p;
  86. }
  87. p->dev = devnone;
  88. p->addr = -1;
  89. // p->xiobuf = ialloc(RBUFSIZE, RBUFSIZE);
  90. p->xiobuf = xiop;
  91. p->iobuf = (char*)-1;
  92. p++;
  93. xiop += RBUFSIZE;
  94. }
  95. /*
  96. * Make sure that no more of bank[0] can be used.
  97. */
  98. mconf.bank[0].base = mconf.bank[0].limit;
  99. i = 0;
  100. for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++)
  101. i += mbp->limit - mbp->base;
  102. print("\tmem left = %,d, out of %,ld\n", i, conf.mem);
  103. /* paranoia: add this command as late as is easy */
  104. cmd_install("memory", "-- print ranges of memory banks", cmd_memory);
  105. }
  106. void*
  107. iobufmap(Iobuf *p)
  108. {
  109. return p->iobuf = p->xiobuf;
  110. }
  111. void
  112. iobufunmap(Iobuf *p)
  113. {
  114. p->iobuf = (char*)-1;
  115. }