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