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