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