]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/port/mkdevc
kernel: fix fairshare formula in comment (thanks erik)
[plan9front.git] / sys / src / 9 / port / mkdevc
1 #!/bin/rc
2
3 awk -v 'objtype='$objtype -v 'pwd='`{pwd} '
4 BEGIN{
5         if(ARGC < 2)
6                 exit
7 }
8
9 /^[ \t]*$/{
10         next;
11 }
12 /^#/{
13         next;
14 }
15 collect && /^[^ \t]/{
16         collect = 0;
17 }
18 collect && section == "dev"{
19         dev[ndev++] = $1;
20         if($1 == "ad")
21                 devad = 1;
22         else if($1 == "sd")
23                 devsd = 1;
24         else if($1 == "uart")
25                 devuart = 1;
26         else if($1 == "vga")
27                 devvga = 1;
28         for(i = 2; i <= NF; i++){
29                 if($i == "dma" && objtype ~ "(386|alpha|amd64)")
30                         i8237dma++;
31         }
32 }
33 collect && section == "ip"{
34         ip[nip++] = $1;
35 }
36 collect && section == "link"{
37         link[nlink++] = $1;
38 }
39 collect && section == "misc"{
40         sub(/^[ \t]*/, "");
41         misc[nmisc++] = $1;
42         if($1 ~ "^arch.*")
43                 arch[narch++] = $1;
44         else if($1 ~ "^ad.*")
45                 adifc[nadifc++] = $1;
46         else if($1 ~ "^sd.*")
47                 sdifc[nsdifc++] = $1;
48         else if($1 ~ "^uart.*")
49                 physuart[nphysuart++] = substr($1, 5, length($1)-4) "physuart";
50         else if($1 ~ "^vga.*"){
51                 if(NF == 1)
52                         vgadev[nvgadev++] = $1;
53                 else for(i = 2; i <= NF; i++){
54                         if($i ~ "[+]cur")
55                                 vgadev[nvgadev++] = $1;
56                         if($i ~ "[+=]cur")
57                                 vgacur[nvgacur++] = $1;
58                 }
59         }
60 }
61
62 collect && section == "port"{
63         sub(/^[ \t]*/, "");
64         port[nport++] = $0;
65 }
66 $0 ~ /^[^ \t]/{
67         if($1 ~ "(bootdir|dev|ip|link|misc|port)"){
68                 section = $1;
69                 collect = 1;
70         }
71         next;
72 }
73
74 END{
75         if(ARGC < 2)
76                 exit "usage"
77
78         printf "#include \"u.h\"\n";
79         printf "#include \"../port/lib.h\"\n";
80         printf "#include \"mem.h\"\n";
81         printf "#include \"dat.h\"\n";
82         printf "#include \"fns.h\"\n";
83         printf "#include \"io.h\"\n";
84         printf "#include \"../port/error.h\"\n\n";
85
86         for(i = 0; i < ndev; i++)
87                 printf "extern Dev %sdevtab;\n", dev[i];
88         printf "Dev* devtab[]={\n";
89         for(i = 0; i < ndev; i++)
90                 printf "\t&%sdevtab,\n", dev[i];
91         printf "\tnil,\n};\n\n";
92
93         if(objtype ~ "(386|alpha|amd64)"){
94                 alloc = "nil";
95                 if(i8237dma){
96                         printf "extern void _i8237alloc(void);\n";
97                         alloc = "_i8237alloc";
98                 }
99                 printf "void (*i8237alloc)(void) = %s;\n", alloc;
100                 printf "int i8237dma = %d;\n\n", i8237dma;
101         }
102
103         for(i = 0; i < nlink; i++)
104                 printf "extern void %slink(void);\n", link[i];
105
106         printf "void links(void){\n";
107         print "\tbootlinks();\n";
108         for(i = 0; i < nlink; i++)
109                 printf "\t%slink();\n", link[i];
110         printf "}\n\n";
111
112         if(narch || objtype == "386"){
113                 for(i = 0; i < narch; i++)
114                         printf "extern PCArch %s;\n", arch[i];
115                 printf "PCArch* knownarch[] = {\n";
116                 for(i = 0; i < narch; i++)
117                         printf "\t&%s,\n", arch[i];
118                 printf "\tnil,\n};\n\n";
119         }
120
121         if(devad){
122                 printf "#include \"../port/ad.h\"\n";
123                 for(i = 0; i < nadifc; i++)
124                         printf "extern ADifc %sifc;\n", adifc[i];
125                 printf "ADifc* adifc[] = {\n";
126                 for(i = 0; i < nadifc; i++)
127                         printf "\t&%sifc,\n", adifc[i];
128                 printf "\tnil,\n};\n\n";
129         }
130         if(devsd){
131                 printf "#include \"../port/sd.h\"\n";
132                 for(i = 0; i < nsdifc; i++)
133                         printf "extern SDifc %sifc;\n", sdifc[i];
134                 printf "SDifc* sdifc[] = {\n";
135                 for(i = 0; i < nsdifc; i++)
136                         printf "\t&%sifc,\n", sdifc[i];
137                 printf "\tnil,\n};\n\n";
138         }
139
140         if(devuart){
141                 for(i = 0; i < nphysuart; i++)
142                         printf "extern PhysUart %s;\n", physuart[i];
143                 printf "PhysUart* physuart[] = {\n";
144                 for(i = 0; i < nphysuart; i++)
145                         printf "\t&%s,\n", physuart[i];
146                 printf "\tnil,\n};\n\n";
147         }
148
149         if(devvga){
150                 printf "#define Image   IMAGE\n";
151                 printf "#include <draw.h>\n";
152                 printf "#include <memdraw.h>\n";
153                 printf "#include <cursor.h>\n";
154                 printf "#include \"screen.h\"\n";
155
156                 for(i = 0; i < nvgadev; i++)
157                         printf "extern VGAdev %sdev;\n", vgadev[i];
158                 printf "VGAdev* vgadev[] = {\n";
159                 for(i = 0; i < nvgadev; i++)
160                         printf "\t&%sdev,\n", vgadev[i];
161                 printf "\tnil,\n};\n\n";
162
163                 for(i = 0; i < nvgacur; i++)
164                         printf "extern VGAcur %scur;\n", vgacur[i];
165                 printf "VGAcur* vgacur[] = {\n";
166                 for(i = 0; i < nvgacur; i++)
167                         printf "\t&%scur,\n", vgacur[i];
168                 printf "\tnil,\n};\n\n";
169         }
170         
171         if(nip){
172                 printf "#include \"../ip/ip.h\"\n";
173                 for(i = 0; i < nip; i++)
174                         printf "extern void %sinit(Fs*);\n", ip[i];
175                 printf "void (*ipprotoinit[])(Fs*) = {\n";
176                 for(i = 0; i < nip; i++)
177                         printf "\t%sinit,\n", ip[i];
178                 printf "\tnil,\n};\n\n";
179         }
180
181         if(nport){
182                 for(i = 0; i < nport; i++)
183                         printf "%s\n", port[i];
184                 printf "\n";
185         }
186
187         printf "char* conffile = \"%s/%s\";\n", pwd, ARGV[1];
188         printf "ulong kerndate = KERNDATE;\n";
189
190         exit
191 }' $*