7593e36504aacebdb57f9fd83f675b829768734b
[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 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, dev %p, init %p\n", i, &devtab[i], devtab[i].init);
34                 devtab[i].init();
35         }
36 }
37
38 void devtabshutdown()
39 {
40         int i;
41
42         /*
43          * Shutdown in reverse order.
44          */
45         for (i = 0; &devtab[i] < __devtabend; i++) ;
46         for (i--; i >= 0; i--)
47                 devtab[i].shutdown();
48 }
49
50 struct dev *devtabget(int dc, int user)
51 {
52         int i;
53
54         for (i = 0; &devtab[i] < __devtabend; i++) {
55                 if (devtab[i].dc == dc)
56                         return &devtab[i];
57         }
58
59         printk("devtabget FAILED %c\n", dc);
60         error(Enonexist);
61 }
62
63 long
64 devtabread(struct chan *c, void *buf, long n, int64_t off)
65 {
66         ERRSTACK(1);
67
68         int i;
69         struct dev *dev;
70         char *alloc, *e, *p;
71
72         alloc = kzmalloc(READSTR, KMALLOC_WAIT);
73         if (alloc == NULL)
74                 error(Enomem);
75
76         p = alloc;
77         e = p + READSTR;
78         for (i = 0; &devtab[i] < __devtabend; i++) {
79                 dev = &devtab[i];
80                 printd("p %p e %p e-p %d\n", p, e, e - p);
81                 printd("do %d %c %s\n", i, dev->dc, dev->name);
82                 p += snprintf(p, e - p, "#%c %s\n", dev->dc, dev->name);
83         }
84
85         if (waserror()) {
86                 kfree(alloc);
87                 nexterror();
88         }
89         n = readstr(off, buf, n, alloc);
90
91         kfree(alloc);
92         poperror();
93
94         return n;
95 }