add missing cons call
[akaros.git] / kern / drivers / dev / tab.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 /* 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 consdevtab;
25 extern struct dev rootdevtab;
26 /*extern struct dev regressdevtab;
27 extern struct dev pipedevtab;
28 extern struct dev procdevtab;
29 extern struct dev etherdevtab;
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         &consdevtab,
37         &rootdevtab,
38 /*
39         &regressdevtab,
40         &pipedevtab,
41         &procdevtab,
42         &etherdevtab,
43         &ipdevtab,
44         &mntdevtab,
45         &srvdevtab,
46         &vmdevtab,*/
47         NULL,
48 };
49
50 void devtabreset()
51 {
52         int i;
53         printk("devtabresets\n");
54
55         for (i = 0; devtab[i] != NULL; i++)
56                 devtab[i]->reset();
57 }
58
59 void devtabinit()
60 {
61         int i;
62
63         printk("devtabinit\n");
64         for (i = 0; devtab[i] != NULL; i++)
65                 devtab[i]->init();
66 }
67
68 void devtabshutdown()
69 {
70         int i;
71
72         /*
73          * Shutdown in reverse order.
74          */
75         for (i = 0; devtab[i] != NULL; i++) ;
76         for (i--; i >= 0; i--)
77                 devtab[i]->shutdown();
78 }
79
80 struct dev *devtabget(int dc, int user)
81 {
82         int i;
83
84         for (i = 0; devtab[i] != NULL; i++) {
85                 if (devtab[i]->dc == dc)
86                         return devtab[i];
87         }
88
89         printk("devtabget FAILED %c\n", dc);
90         error(Enonexist);
91 }
92
93 long
94 devtabread(struct chan *c, void *buf, long n, int64_t off)
95 {
96         ERRSTACK(1);
97
98         int i;
99         struct dev *dev;
100         char *alloc, *e, *p;
101
102         alloc = kzmalloc(READSTR, KMALLOC_WAIT);
103         if (alloc == NULL)
104                 error(Enomem);
105
106         p = alloc;
107         e = p + READSTR;
108         for (i = 0; devtab[i] != NULL; i++) {
109                 dev = devtab[i];
110                 printd("p %p e %p e-p %d\n", p, e, e - p);
111                 printd("do %d %c %s\n", i, dev->dc, dev->name);
112                 p += snprintf(p, e - p, "#%c %s\n", dev->dc, dev->name);
113         }
114
115         if (waserror()) {
116                 kfree(alloc);
117                 nexterror();
118         }
119         n = readstr(off, buf, n, alloc);
120
121         kfree(alloc);
122         poperror();
123
124         return n;
125 }