xref: /plan9/sys/src/cmd/cwfs/fworm.c (revision 01a344a29f2ff35133953eaef092a50fc8c3163b)
1*01a344a2SDavid du Colombier #include "all.h"
2*01a344a2SDavid du Colombier 
3*01a344a2SDavid du Colombier #define	FDEV(d)		((d)->fw.fw)
4*01a344a2SDavid du Colombier 
5*01a344a2SDavid du Colombier enum { DEBUG = 0 };
6*01a344a2SDavid du Colombier 
7*01a344a2SDavid du Colombier Devsize
fwormsize(Device * d)8*01a344a2SDavid du Colombier fwormsize(Device *d)
9*01a344a2SDavid du Colombier {
10*01a344a2SDavid du Colombier 	Devsize l;
11*01a344a2SDavid du Colombier 
12*01a344a2SDavid du Colombier 	l = devsize(FDEV(d));
13*01a344a2SDavid du Colombier 	l -= l/(BUFSIZE*8) + 1;
14*01a344a2SDavid du Colombier 	return l;
15*01a344a2SDavid du Colombier }
16*01a344a2SDavid du Colombier 
17*01a344a2SDavid du Colombier void
fwormream(Device * d)18*01a344a2SDavid du Colombier fwormream(Device *d)
19*01a344a2SDavid du Colombier {
20*01a344a2SDavid du Colombier 	Iobuf *p;
21*01a344a2SDavid du Colombier 	Device *fdev;
22*01a344a2SDavid du Colombier 	Off a, b;
23*01a344a2SDavid du Colombier 
24*01a344a2SDavid du Colombier 	print("fworm ream\n");
25*01a344a2SDavid du Colombier 	devinit(d);
26*01a344a2SDavid du Colombier 	fdev = FDEV(d);
27*01a344a2SDavid du Colombier 	a = fwormsize(d);
28*01a344a2SDavid du Colombier 	b = devsize(fdev);
29*01a344a2SDavid du Colombier 	print("\tfwsize = %lld\n", (Wideoff)a);
30*01a344a2SDavid du Colombier 	print("\tbwsize = %lld\n", (Wideoff)b-a);
31*01a344a2SDavid du Colombier 	for(; a < b; a++) {
32*01a344a2SDavid du Colombier 		p = getbuf(fdev, a, Bmod|Bres);
33*01a344a2SDavid du Colombier 		if(!p)
34*01a344a2SDavid du Colombier 			panic("fworm: init");
35*01a344a2SDavid du Colombier 		memset(p->iobuf, 0, RBUFSIZE);
36*01a344a2SDavid du Colombier 		settag(p, Tvirgo, a);
37*01a344a2SDavid du Colombier 		putbuf(p);
38*01a344a2SDavid du Colombier 	}
39*01a344a2SDavid du Colombier }
40*01a344a2SDavid du Colombier 
41*01a344a2SDavid du Colombier void
fworminit(Device * d)42*01a344a2SDavid du Colombier fworminit(Device *d)
43*01a344a2SDavid du Colombier {
44*01a344a2SDavid du Colombier 	print("fworm init\n");
45*01a344a2SDavid du Colombier 	devinit(FDEV(d));
46*01a344a2SDavid du Colombier }
47*01a344a2SDavid du Colombier 
48*01a344a2SDavid du Colombier int
fwormread(Device * d,Off b,void * c)49*01a344a2SDavid du Colombier fwormread(Device *d, Off b, void *c)
50*01a344a2SDavid du Colombier {
51*01a344a2SDavid du Colombier 	Iobuf *p;
52*01a344a2SDavid du Colombier 	Device *fdev;
53*01a344a2SDavid du Colombier 	Devsize l;
54*01a344a2SDavid du Colombier 
55*01a344a2SDavid du Colombier 	if(DEBUG)
56*01a344a2SDavid du Colombier 		print("fworm read  %lld\n", (Wideoff)b);
57*01a344a2SDavid du Colombier 	fdev = FDEV(d);
58*01a344a2SDavid du Colombier 	l = devsize(fdev);
59*01a344a2SDavid du Colombier 	l -= l/(BUFSIZE*8) + 1;
60*01a344a2SDavid du Colombier 	if(b >= l)
61*01a344a2SDavid du Colombier 		panic("fworm: rbounds %lld", (Wideoff)b);
62*01a344a2SDavid du Colombier 	l += b/(BUFSIZE*8);
63*01a344a2SDavid du Colombier 
64*01a344a2SDavid du Colombier 	p = getbuf(fdev, l, Brd|Bres);
65*01a344a2SDavid du Colombier 	if(!p || checktag(p, Tvirgo, l))
66*01a344a2SDavid du Colombier 		panic("fworm: checktag %lld", (Wideoff)l);
67*01a344a2SDavid du Colombier 	l = b % (BUFSIZE*8);
68*01a344a2SDavid du Colombier 	if(!(p->iobuf[l/8] & (1<<(l%8)))) {
69*01a344a2SDavid du Colombier 		putbuf(p);
70*01a344a2SDavid du Colombier 		print("fworm: read %lld\n", (Wideoff)b);
71*01a344a2SDavid du Colombier 		return 1;
72*01a344a2SDavid du Colombier 	}
73*01a344a2SDavid du Colombier 	putbuf(p);
74*01a344a2SDavid du Colombier 	return devread(fdev, b, c);
75*01a344a2SDavid du Colombier }
76*01a344a2SDavid du Colombier 
77*01a344a2SDavid du Colombier int
fwormwrite(Device * d,Off b,void * c)78*01a344a2SDavid du Colombier fwormwrite(Device *d, Off b, void *c)
79*01a344a2SDavid du Colombier {
80*01a344a2SDavid du Colombier 	Iobuf *p;
81*01a344a2SDavid du Colombier 	Device *fdev;
82*01a344a2SDavid du Colombier 	Devsize l;
83*01a344a2SDavid du Colombier 
84*01a344a2SDavid du Colombier 	if(DEBUG)
85*01a344a2SDavid du Colombier 		print("fworm write %lld\n", (Wideoff)b);
86*01a344a2SDavid du Colombier 	fdev = FDEV(d);
87*01a344a2SDavid du Colombier 	l = devsize(fdev);
88*01a344a2SDavid du Colombier 	l -= l/(BUFSIZE*8) + 1;
89*01a344a2SDavid du Colombier 	if(b >= l)
90*01a344a2SDavid du Colombier 		panic("fworm: wbounds %lld", (Wideoff)b);
91*01a344a2SDavid du Colombier 	l += b/(BUFSIZE*8);
92*01a344a2SDavid du Colombier 
93*01a344a2SDavid du Colombier 	p = getbuf(fdev, l, Brd|Bmod|Bres);
94*01a344a2SDavid du Colombier 	if(!p || checktag(p, Tvirgo, l))
95*01a344a2SDavid du Colombier 		panic("fworm: checktag %lld", (Wideoff)l);
96*01a344a2SDavid du Colombier 	l = b % (BUFSIZE*8);
97*01a344a2SDavid du Colombier 	if((p->iobuf[l/8] & (1<<(l%8)))) {
98*01a344a2SDavid du Colombier 		putbuf(p);
99*01a344a2SDavid du Colombier 		print("fworm: write %lld\n", (Wideoff)b);
100*01a344a2SDavid du Colombier 		return 1;
101*01a344a2SDavid du Colombier 	}
102*01a344a2SDavid du Colombier 	p->iobuf[l/8] |= 1<<(l%8);
103*01a344a2SDavid du Colombier 	putbuf(p);
104*01a344a2SDavid du Colombier 	return devwrite(fdev, b, c);
105*01a344a2SDavid du Colombier }
106