#include "all.h" #ifdef OLD#define swaboff swab4#else#define swaboff swab8#endif intswabread(Device *d, Off b, void *c){ int e; e = devread(d->swab.d, b, c); if(e == 0) swab(c, 0); return e;} intswabwrite(Device *d, Off b, void *c){ int e; swab(c, 1); e = devwrite(d->swab.d, b, c); swab(c, 0); return e;} Devsizeswabsize(Device *d){ return devsize(d->swab.d);} Offswabsuper(Device *d){ return superaddr(d->swab.d);} Offswabraddr(Device *d){ return getraddr(d->swab.d);} voidswabream(Device *d, int top){ devream(d->swab.d, top);} voidswabrecover(Device *d){ devrecover(d->swab.d);} voidswabinit(Device *d){ devinit(d->swab.d);} voidswab2(void *c){ uchar *p; int t; p = c; t = p[0]; p[0] = p[1]; p[1] = t;} voidswab4(void *c){ uchar *p; int t; p = c; t = p[0]; p[0] = p[3]; p[3] = t; t = p[1]; p[1] = p[2]; p[2] = t;} voidswab8(void *c){ uchar *p; int t; p = c; t = p[0]; p[0] = p[7]; p[7] = t; t = p[1]; p[1] = p[6]; p[6] = t; t = p[2]; p[2] = p[5]; p[5] = t; t = p[3]; p[3] = p[4]; p[4] = t;} /* * swab a block * flag = 0 -- convert from foreign to native * flag = 1 -- convert from native to foreign */voidswab(void *c, int flag){ uchar *p; Tag *t; int i, j; Dentry *d; Cache *h; Bucket *b; Superb *s; Fbuf *f; Off *l; /* swab the tag */ p = (uchar*)c; t = (Tag*)(p + BUFSIZE); if(!flag) { swab2(&t->pad); swab2(&t->tag); swaboff(&t->path); } /* swab each block type */ switch(t->tag) { default: print("no swab for tag=%G rw=%d\n", t->tag, flag); for(j=0; j<16; j++) print(" %.2x", p[BUFSIZE+j]); print("\n"); for(i=0; i<16; i++) { print("%.4x", i*16); for(j=0; j<16; j++) print(" %.2x", p[i*16+j]); print("\n"); } panic("swab"); break; case Tsuper: s = (Superb*)p; swaboff(&s->fbuf.nfree); for(i=0; i<FEPERBUF; i++) swaboff(&s->fbuf.free[i]);#ifdef AUTOSWAB swaboff(&s->magic);#endif swaboff(&s->fstart); swaboff(&s->fsize); swaboff(&s->tfree); swaboff(&s->qidgen); swaboff(&s->cwraddr); swaboff(&s->roraddr); swaboff(&s->last); swaboff(&s->next); break; case Tdir: for(i=0; i<DIRPERBUF; i++) { d = (Dentry*)p + i; swab2(&d->uid); swab2(&d->gid); swab2(&d->mode); swab2(&d->muid); swaboff(&d->qid.path); swab4(&d->qid.version); swaboff(&d->size); for(j=0; j<NDBLOCK; j++) swaboff(&d->dblock[j]); for (j = 0; j < NIBLOCK; j++) swaboff(&d->iblocks[j]); swab4(&d->atime); swab4(&d->mtime); } break; case Tind1: case Tind2:#ifndef OLD case Tind3: case Tind4: /* add more Tind tags here ... */#endif l = (Off *)p; for(i=0; i<INDPERBUF; i++) { swaboff(l); l++; } break; case Tfree: f = (Fbuf*)p; swaboff(&f->nfree); for(i=0; i<FEPERBUF; i++) swaboff(&f->free[i]); break; case Tbuck: for(i=0; i<BKPERBLK; i++) { b = (Bucket*)p + i; swab4(&b->agegen); for(j=0; j<CEPERBK; j++) { swab2(&b->entry[j].age); swab2(&b->entry[j].state); swaboff(&b->entry[j].waddr); } } break; case Tcache: h = (Cache*)p; swaboff(&h->maddr); swaboff(&h->msize); swaboff(&h->caddr); swaboff(&h->csize); swaboff(&h->fsize); swaboff(&h->wsize); swaboff(&h->wmax); swaboff(&h->sbaddr); swaboff(&h->cwraddr); swaboff(&h->roraddr); swab4(&h->toytime); swab4(&h->time); break; case Tnone: // unitialized case Tfile: // someone elses problem case Tvirgo: // bit map -- all bytes case Tconfig: // configuration string -- all bytes break; } /* swab the tag */ if(flag) { swab2(&t->pad); swab2(&t->tag); swaboff(&t->path); }}
#include "all.h"
#ifdef OLD
#define swaboff swab4
#else
#define swaboff swab8
#endif
int
swabread(Device *d, Off b, void *c)
{
int e;
e = devread(d->swab.d, b, c);
if(e == 0)
swab(c, 0);
return e;
}
int
swabwrite(Device *d, Off b, void *c)
{
int e;
swab(c, 1);
e = devwrite(d->swab.d, b, c);
swab(c, 0);
return e;
}
Devsize
swabsize(Device *d)
{
return devsize(d->swab.d);
}
Off
swabsuper(Device *d)
{
return superaddr(d->swab.d);
}
Off
swabraddr(Device *d)
{
return getraddr(d->swab.d);
}
void
swabream(Device *d, int top)
{
devream(d->swab.d, top);
}
void
swabrecover(Device *d)
{
devrecover(d->swab.d);
}
void
swabinit(Device *d)
{
devinit(d->swab.d);
}
void
swab2(void *c)
{
uchar *p;
int t;
p = c;
t = p[0];
p[0] = p[1];
p[1] = t;
}
void
swab4(void *c)
{
uchar *p;
int t;
p = c;
t = p[0];
p[0] = p[3];
p[3] = t;
t = p[1];
p[1] = p[2];
p[2] = t;
}
void
swab8(void *c)
{
uchar *p;
int t;
p = c;
t = p[0];
p[0] = p[7];
p[7] = t;
t = p[1];
p[1] = p[6];
p[6] = t;
t = p[2];
p[2] = p[5];
p[5] = t;
t = p[3];
p[3] = p[4];
p[4] = t;
}
/*
* swab a block
* flag = 0 -- convert from foreign to native
* flag = 1 -- convert from native to foreign
*/
void
swab(void *c, int flag)
{
uchar *p;
Tag *t;
int i, j;
Dentry *d;
Cache *h;
Bucket *b;
Superb *s;
Fbuf *f;
Off *l;
/* swab the tag */
p = (uchar*)c;
t = (Tag*)(p + BUFSIZE);
if(!flag) {
swab2(&t->pad);
swab2(&t->tag);
swaboff(&t->path);
}
/* swab each block type */
switch(t->tag) {
default:
print("no swab for tag=%G rw=%d\n", t->tag, flag);
for(j=0; j<16; j++)
print(" %.2x", p[BUFSIZE+j]);
print("\n");
for(i=0; i<16; i++) {
print("%.4x", i*16);
for(j=0; j<16; j++)
print(" %.2x", p[i*16+j]);
print("\n");
}
panic("swab");
break;
case Tsuper:
s = (Superb*)p;
swaboff(&s->fbuf.nfree);
for(i=0; i<FEPERBUF; i++)
swaboff(&s->fbuf.free[i]);
#ifdef AUTOSWAB
swaboff(&s->magic);
#endif
swaboff(&s->fstart);
swaboff(&s->fsize);
swaboff(&s->tfree);
swaboff(&s->qidgen);
swaboff(&s->cwraddr);
swaboff(&s->roraddr);
swaboff(&s->last);
swaboff(&s->next);
break;
case Tdir:
for(i=0; i<DIRPERBUF; i++) {
d = (Dentry*)p + i;
swab2(&d->uid);
swab2(&d->gid);
swab2(&d->mode);
swab2(&d->muid);
swaboff(&d->qid.path);
swab4(&d->qid.version);
swaboff(&d->size);
for(j=0; j<NDBLOCK; j++)
swaboff(&d->dblock[j]);
for (j = 0; j < NIBLOCK; j++)
swaboff(&d->iblocks[j]);
swab4(&d->atime);
swab4(&d->mtime);
}
break;
case Tind1:
case Tind2:
#ifndef OLD
case Tind3:
case Tind4:
/* add more Tind tags here ... */
#endif
l = (Off *)p;
for(i=0; i<INDPERBUF; i++) {
swaboff(l);
l++;
}
break;
case Tfree:
f = (Fbuf*)p;
swaboff(&f->nfree);
for(i=0; i<FEPERBUF; i++)
swaboff(&f->free[i]);
break;
case Tbuck:
for(i=0; i<BKPERBLK; i++) {
b = (Bucket*)p + i;
swab4(&b->agegen);
for(j=0; j<CEPERBK; j++) {
swab2(&b->entry[j].age);
swab2(&b->entry[j].state);
swaboff(&b->entry[j].waddr);
}
}
break;
case Tcache:
h = (Cache*)p;
swaboff(&h->maddr);
swaboff(&h->msize);
swaboff(&h->caddr);
swaboff(&h->csize);
swaboff(&h->fsize);
swaboff(&h->wsize);
swaboff(&h->wmax);
swaboff(&h->sbaddr);
swaboff(&h->cwraddr);
swaboff(&h->roraddr);
swab4(&h->toytime);
swab4(&h->time);
break;
case Tnone: // unitialized
case Tfile: // someone elses problem
case Tvirgo: // bit map -- all bytes
case Tconfig: // configuration string -- all bytes
break;
}
/* swab the tag */
if(flag) {
swab2(&t->pad);
swab2(&t->tag);
swaboff(&t->path);
}
}