Compile in devtab and alarm device
[akaros.git] / kern / drivers / dev / tab.c
1 /*
2  * Stub.
3  */
4 //#define DEBUG
5 #include <vfs.h>
6 #include <kfs.h>
7 #include <slab.h>
8 #include <kmalloc.h>
9 #include <kref.h>
10 #include <string.h>
11 #include <stdio.h>
12 #include <assert.h>
13 #include <error.h>
14 #include <cpio.h>
15 #include <pmap.h>
16 #include <smp.h>
17 #include <umem.h>
18
19 /* at some point this will be done via ldscript Hackes. */
20 //extern struct dev* devtab[];
21 // the sooner the better!
22
23 extern struct dev alarmdevtab;
24 extern struct dev regressdevtab;
25 extern struct dev pipedevtab;
26 extern struct dev procdevtab;
27 extern struct dev miscdevtab;
28 extern struct dev etherdevtab;
29 extern struct dev rootdevtab;
30 extern struct dev ipdevtab;
31 extern struct dev mntdevtab;
32 extern struct dev srvdevtab;
33 extern struct dev vmdevtab;
34 struct dev *devtab[] = {
35         &alarmdevtab,
36         &rootdevtab,
37         &miscdevtab,
38         &regressdevtab,
39         &pipedevtab,
40         &procdevtab,
41         &etherdevtab,
42         &ipdevtab,
43         &mntdevtab,
44         &srvdevtab,
45         &vmdevtab,
46         NULL,
47 };
48
49 void devtabreset()
50 {
51         int i;
52         printk("devtabresets\n");
53
54         for (i = 0; devtab[i] != NULL; i++)
55                 devtab[i]->reset(current);
56 }
57
58 void devtabinit()
59 {
60         int i;
61
62         printk("devtabinit\n");
63         for (i = 0; devtab[i] != NULL; i++)
64                 devtab[i]->init(current);
65 }
66
67 void devtabshutdown()
68 {
69         int i;
70
71         /*
72          * Shutdown in reverse order.
73          */
74         for (i = 0; devtab[i] != NULL; i++) ;
75         for (i--; i >= 0; i--)
76                 devtab[i]->shutdown(current);
77 }
78
79 struct dev *devtabget(int dc, int user)
80 {
81         int i;
82
83         for (i = 0; devtab[i] != NULL; i++) {
84                 if (devtab[i]->dc == dc)
85                         return devtab[i];
86         }
87
88         printk("devtabget FAILED %c\n", dc);
89         error(Enonexist);
90 }
91
92 long
93 devtabread(struct chan *c, void *buf, long n, int64_t off)
94 {
95         ERRSTACK(1);
96
97         int i;
98         struct dev *dev;
99         char *alloc, *e, *p;
100
101         alloc = kzmalloc(READSTR, KMALLOC_WAIT);
102         if (alloc == NULL)
103                 error(Enomem);
104
105         p = alloc;
106         e = p + READSTR;
107         for (i = 0; devtab[i] != NULL; i++) {
108                 dev = devtab[i];
109                 printd("p %p e %p e-p %d\n", p, e, e - p);
110                 printd("do %d %c %s\n", i, dev->dc, dev->name);
111                 p += snprintf(p, e - p, "#%c %s\n", dev->dc, dev->name);
112         }
113
114         if (waserror()) {
115                 kfree(alloc);
116                 nexterror();
117         }
118         n = readstr(off, buf, n, alloc);
119
120         kfree(alloc);
121         poperror();
122
123         return n;
124 }