3 #define FDEV(d) ((d)->fw.fw)
11 l -= l/(BUFSIZE*8) + 1;
23 print("fworm ream\n");
29 print("\tfwsize = %lld\n", (Wideoff)a);
30 print("\tbwsize = %lld\n", (Wideoff)b-a);
33 p = getbuf(fdev, a, Bmod|Bres);
36 memset(p->iobuf, 0, RBUFSIZE);
45 print("fworm init\n");
50 fwormread(Device *d, Off b, void *c)
57 fprint(2, "fworm read %lld\n", (Wideoff)b);
60 l -= l/(BUFSIZE*8) + 1;
62 panic("fworm: rbounds %lld", (Wideoff)b);
65 p = getbuf(fdev, l, Brd|Bres);
66 if(!p || checktag(p, Tvirgo, l))
67 panic("fworm: checktag %lld", (Wideoff)l);
69 if(!(p->iobuf[l/8] & (1<<(l%8)))) {
71 fprint(2, "fworm: read %lld\n", (Wideoff)b);
75 return devread(fdev, b, c);
79 fwormwrite(Device *d, Off b, void *c)
86 fprint(2, "fworm write %lld\n", (Wideoff)b);
89 l -= l/(BUFSIZE*8) + 1;
91 panic("fworm: wbounds %lld", (Wideoff)b);
94 p = getbuf(fdev, l, Brd|Bmod|Bres);
95 if(!p || checktag(p, Tvirgo, l))
96 panic("fworm: checktag %lld", (Wideoff)l);
98 if((p->iobuf[l/8] & (1<<(l%8)))) {
100 fprint(2, "fworm: write %lld\n", (Wideoff)b);
103 p->iobuf[l/8] |= 1<<(l%8);
105 return devwrite(fdev, b, c);