7b0acd716f72ea3133b25dfa85d9c6bc1d05a2f4
[akaros.git] / kern / src / ns / devtab.c
1 /*
2  * Stub.
3  */
4 //#define DEBUG
5 #include <kmalloc.h>
6 #include <string.h>
7 #include <stdio.h>
8 #include <assert.h>
9 #include <error.h>
10 #include <pmap.h>
11 #include <sys/queue.h>
12 #include <smp.h>
13 #include <kref.h>
14 #include <atomic.h>
15 #include <alarm.h>
16 #include <event.h>
17 #include <umem.h>
18
19 void devtabreset()
20 {
21         int i;
22
23         for (i = 0; &devtab[i] < __devtabend; i++)
24                 devtab[i].reset();
25 }
26
27 void devtabinit()
28 {
29         int i;
30
31         for (i = 0; &devtab[i] < __devtabend; i++) {
32                 /* if we have errors, check the align of struct dev and objdump */
33                 printd("i %d, '%s', dev %p, init %p\n", i, devtab[i].name,
34                                 &devtab[i], devtab[i].init);
35                 devtab[i].init();
36         }
37 }
38
39 void devtabshutdown()
40 {
41         int i;
42
43         /*
44          * Shutdown in reverse order.
45          */
46         for (i = 0; &devtab[i] < __devtabend; i++) ;
47         for (i--; i >= 0; i--)
48                 devtab[i].shutdown();
49 }
50
51 struct dev *devtabget(const char *name, int user)
52 {
53         int i = devno(name, user);
54         if (i > 0)
55                 return &devtab[i];
56
57         printk("devtabget FAILED %s\n", name);
58         set_errno(ENOENT);
59         error(Enonexist);
60 }
61
62 long devtabread(struct chan *c, void *buf, long n, int64_t off)
63 {
64         ERRSTACK(1);
65
66         int i;
67         struct dev *dev;
68         char *alloc, *e, *p;
69
70         alloc = kzmalloc(READSTR, KMALLOC_WAIT);
71         if (alloc == NULL)
72                 error(Enomem);
73
74         p = alloc;
75         e = p + READSTR;
76         for (i = 0; &devtab[i] < __devtabend; i++) {
77                 dev = &devtab[i];
78                 printd("p %p e %p e-p %d\n", p, e, e - p);
79                 printd("do %d %s\n", i, dev->name);
80                 p += snprintf(p, e - p, "#%s\n", dev->name);
81         }
82
83         if (waserror()) {
84                 kfree(alloc);
85                 nexterror();
86         }
87         n = readstr(off, buf, n, alloc);
88
89         kfree(alloc);
90         poperror();
91
92         return n;
93 }