#include "all.h" int devread(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; } int devwrite(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; } Devsize devsize(Device *d) { if(devtab[d->type].size) return devtab[d->type].size(d); panic("illegal device in devsize: %Z", d); return 0; } Off superaddr(Device *d) { if(devtab[d->type].superaddr) return devtab[d->type].superaddr(d); return SUPER_ADDR; } Off getraddr(Device *d) { if(devtab[d->type].getraddr) return devtab[d->type].getraddr(d); return ROOT_ADDR; } void devream(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); } } void devrecover(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); } void devinit(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); } int devsecsize(Device *d) { if(devtab[d->type].secsize == 0) return 512; return devtab[d->type].secsize(d); }