summaryrefslogtreecommitdiff
path: root/sys/src/cmd/cwfs/malloc.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/cwfs/malloc.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/cwfs/malloc.c')
-rwxr-xr-xsys/src/cmd/cwfs/malloc.c130
1 files changed, 130 insertions, 0 deletions
diff --git a/sys/src/cmd/cwfs/malloc.c b/sys/src/cmd/cwfs/malloc.c
new file mode 100755
index 000000000..b7014f770
--- /dev/null
+++ b/sys/src/cmd/cwfs/malloc.c
@@ -0,0 +1,130 @@
+#include "all.h"
+#include "io.h"
+
+long niob;
+long nhiob;
+Hiob *hiob;
+
+/*
+ * Called to allocate permanent data structures
+ * Alignment is in number of bytes. It pertains both to the start and
+ * end of the allocated memory.
+ */
+void*
+ialloc(ulong n, int align)
+{
+ void *p = mallocalign(n, align, 0, 0);
+
+ if (p == nil)
+ panic("ialloc: out of memory");
+ memset(p, 0, n);
+ return p;
+}
+
+void
+prbanks(void)
+{
+ Mbank *mbp;
+
+ for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++)
+ print("bank[%ld]: base 0x%8.8lux, limit 0x%8.8lux (%.0fMB)\n",
+ mbp - mconf.bank, mbp->base, mbp->limit,
+ (mbp->limit - mbp->base)/(double)MB);
+}
+
+static void
+cmd_memory(int, char *[])
+{
+ prbanks();
+}
+
+enum { HWIDTH = 8 }; /* buffers per hash */
+
+/*
+ * allocate rest of mem
+ * for io buffers.
+ */
+void
+iobufinit(void)
+{
+ long m;
+ int i;
+ char *xiop;
+ Iobuf *p, *q;
+ Hiob *hp;
+ Mbank *mbp;
+
+ wlock(&mainlock); /* init */
+ wunlock(&mainlock);
+
+ prbanks();
+ m = 0;
+ for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++)
+ m += mbp->limit - mbp->base;
+
+ niob = m / (sizeof(Iobuf) + RBUFSIZE + sizeof(Hiob)/HWIDTH);
+ nhiob = niob / HWIDTH;
+ while(!prime(nhiob))
+ nhiob++;
+ print("\t%ld buffers; %ld hashes\n", niob, nhiob);
+ hiob = ialloc(nhiob * sizeof(Hiob), 0);
+ hp = hiob;
+ for(i=0; i<nhiob; i++) {
+ lock(hp);
+ unlock(hp);
+ hp++;
+ }
+ p = ialloc(niob * sizeof(Iobuf), 0);
+ xiop = ialloc(niob * RBUFSIZE, 0);
+ hp = hiob;
+ for(i=0; i < niob; i++) {
+// p->name = "buf";
+ qlock(p);
+ qunlock(p);
+ if(hp == hiob)
+ hp = hiob + nhiob;
+ hp--;
+ q = hp->link;
+ if(q) {
+ p->fore = q;
+ p->back = q->back;
+ q->back = p;
+ p->back->fore = p;
+ } else {
+ hp->link = p;
+ p->fore = p;
+ p->back = p;
+ }
+ p->dev = devnone;
+ p->addr = -1;
+// p->xiobuf = ialloc(RBUFSIZE, RBUFSIZE);
+ p->xiobuf = xiop;
+ p->iobuf = (char*)-1;
+ p++;
+ xiop += RBUFSIZE;
+ }
+
+ /*
+ * Make sure that no more of bank[0] can be used.
+ */
+ mconf.bank[0].base = mconf.bank[0].limit;
+
+ i = 0;
+ for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++)
+ i += mbp->limit - mbp->base;
+ print("\tmem left = %,d, out of %,ld\n", i, conf.mem);
+ /* paranoia: add this command as late as is easy */
+ cmd_install("memory", "-- print ranges of memory banks", cmd_memory);
+}
+
+void*
+iobufmap(Iobuf *p)
+{
+ return p->iobuf = p->xiobuf;
+}
+
+void
+iobufunmap(Iobuf *p)
+{
+ p->iobuf = (char*)-1;
+}