blob: e88df66ac974af810001eadbac0526ae66429eef [file] [log] [blame]
/*
* Stub.
*/
//#define DEBUG
#include <kmalloc.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <error.h>
#include <pmap.h>
#include <sys/queue.h>
#include <smp.h>
#include <kref.h>
#include <atomic.h>
#include <alarm.h>
#include <event.h>
#include <umem.h>
void devtabreset(void)
{
ERRSTACK(1);
volatile int i;
if (waserror()) {
panic("A devtab reset (probably %p) failed!", devtab[i].reset);
poperror();
return;
}
for (i = 0; &devtab[i] < __devtabend; i++) {
if (devtab[i].reset)
devtab[i].reset();
}
poperror();
}
void devtabinit(void)
{
ERRSTACK(1);
volatile int i;
if (waserror()) {
panic("A devtab init (probably %p) failed!", devtab[i].init);
poperror();
return;
}
for (i = 0; &devtab[i] < __devtabend; i++) {
/* if we have errors, check the align of struct dev and objdump
*/
printd("i %d, '%s', dev %p, init %p\n", i, devtab[i].name,
&devtab[i], devtab[i].init);
if (devtab[i].init)
devtab[i].init();
}
poperror();
}
void devtabshutdown(void)
{
int i;
/*
* Shutdown in reverse order.
*/
for (i = 0; &devtab[i] < __devtabend; i++) ;
for (i--; i >= 0; i--) {
if (devtab[i].shutdown)
devtab[i].shutdown();
}
}
struct dev *devtabget(const char *name, int user)
{
int i = devno(name, user);
if (i > 0)
return &devtab[i];
printk("devtabget FAILED %s\n", name);
error(ENOENT, ERROR_FIXME);
}
long devtabread(struct chan *c, void *buf, long n, int64_t off)
{
ERRSTACK(1);
int i;
struct dev *dev;
char *alloc, *e, *p;
alloc = kzmalloc(READSTR, MEM_WAIT);
if (alloc == NULL)
error(ENOMEM, ERROR_FIXME);
p = alloc;
e = p + READSTR;
for (i = 0; &devtab[i] < __devtabend; i++) {
dev = &devtab[i];
printd("p %p e %p e-p %d\n", p, e, e - p);
printd("do %d %s\n", i, dev->name);
p += snprintf(p, e - p, "#%s\n", dev->name);
}
if (waserror()) {
kfree(alloc);
nexterror();
}
n = readstr(off, buf, n, alloc);
kfree(alloc);
poperror();
return n;
}