9ns: Add get_cwd()
[akaros.git] / kern / src / ns / devtab.c
index 40ef1e3..95a23b1 100644 (file)
 
 void devtabreset()
 {
 
 void devtabreset()
 {
-       int i;
+       ERRSTACK(1);
+       volatile int i;
 
 
-       for (i = 0; &devtab[i] < __devtabend; i++)
-               devtab[i].reset();
+       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 devtabinit()
 {
-       int i;
+       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);
        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);
-               devtab[i].init();
+               if (devtab[i].init)
+                       devtab[i].init();
        }
        }
+       poperror();
 }
 
 void devtabshutdown()
 }
 
 void devtabshutdown()
@@ -44,8 +61,10 @@ void devtabshutdown()
         * Shutdown in reverse order.
         */
        for (i = 0; &devtab[i] < __devtabend; i++) ;
         * Shutdown in reverse order.
         */
        for (i = 0; &devtab[i] < __devtabend; i++) ;
-       for (i--; i >= 0; i--)
-               devtab[i].shutdown();
+       for (i--; i >= 0; i--) {
+               if (devtab[i].shutdown)
+                       devtab[i].shutdown();
+       }
 }
 
 struct dev *devtabget(const char *name, int user)
 }
 
 struct dev *devtabget(const char *name, int user)
@@ -55,7 +74,7 @@ struct dev *devtabget(const char *name, int user)
                return &devtab[i];
 
        printk("devtabget FAILED %s\n", name);
                return &devtab[i];
 
        printk("devtabget FAILED %s\n", name);
-       error(ENOENT, NULL);
+       error(ENOENT, ERROR_FIXME);
 }
 
 long devtabread(struct chan *c, void *buf, long n, int64_t off)
 }
 
 long devtabread(struct chan *c, void *buf, long n, int64_t off)
@@ -66,9 +85,9 @@ long devtabread(struct chan *c, void *buf, long n, int64_t off)
        struct dev *dev;
        char *alloc, *e, *p;
 
        struct dev *dev;
        char *alloc, *e, *p;
 
-       alloc = kzmalloc(READSTR, KMALLOC_WAIT);
+       alloc = kzmalloc(READSTR, MEM_WAIT);
        if (alloc == NULL)
        if (alloc == NULL)
-               error(ENOMEM, NULL);
+               error(ENOMEM, ERROR_FIXME);
 
        p = alloc;
        e = p + READSTR;
 
        p = alloc;
        e = p + READSTR;