| /* |
| * 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; |
| } |