101 lines · 1.6 KB · C
RawDownload
#include "all.h" intdevread(Device *d, Off b, void *c){	if(devtab[d->type].read)		return devtab[d->type].read(d, b, c);	print("illegal device in read: %Z(%lld)\n", d, (Wideoff)b);	return 1;} intdevwrite(Device *d, Off b, void *c){	if (readonly)		return 0;	if(devtab[d->type].write)		return devtab[d->type].write(d, b, c);	if(d->type == Devnone)		return 0;	panic("illegal device in write: %Z(%lld)\n", d, (Wideoff)b);	return 1;} Devsizedevsize(Device *d){	if(devtab[d->type].size)		return devtab[d->type].size(d);	panic("illegal device in devsize: %Z", d);	return 0;} Offsuperaddr(Device *d){	if(devtab[d->type].superaddr)		return devtab[d->type].superaddr(d);	return SUPER_ADDR;} Offgetraddr(Device *d){	if(devtab[d->type].getraddr)		return devtab[d->type].getraddr(d);	return ROOT_ADDR;} voiddevream(Device *d, int top){	print("	devream: %Z %d\n", d, top); 	if(!devtab[d->type].ream){		print("ream: unknown dev type %Z\n", d);		return;	}	devtab[d->type].ream(d, top);	devinit(d);	if(devtab[d->type].c != 'c')		/* BOTCH */	if(top) {		wlock(&mainlock);		rootream(d, ROOT_ADDR);		superream(d, SUPER_ADDR);		wunlock(&mainlock);	}} voiddevrecover(Device *d){	print("recover: %Z\n", d);	if(devtab[d->type].recover){		devtab[d->type].recover(d);		return;	}	print("recover: unknown dev type %Z\n", d);} voiddevinit(Device *d){	if(d->init)		return;	d->init = 1;	print("	devinit %Z\n", d);	if(devtab[d->type].init){		devtab[d->type].init(d);		return;	}	print("devinit unknown device %Z\n", d);} intdevsecsize(Device *d){	if(devtab[d->type].secsize == 0)		return 512;	return devtab[d->type].secsize(d);}