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