xref: /plan9/sys/src/cmd/cwfs/malloc.c (revision 01a344a29f2ff35133953eaef092a50fc8c3163b)
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