xref: /plan9/sys/src/9/port/mkdevc (revision c10716e2030eb464a7ed5e3a612347e65a8905d9)
1#!/bin/rc
2
3awk -v 'objtype='$objtype -v 'pwd='`{pwd} '
4BEGIN{
5	if(ARGC < 2)
6		exit
7}
8
9/^[ \t]*$/{
10	next;
11}
12/^#/{
13	next;
14}
15collect && /^[^ \t]/{
16	collect = 0;
17}
18collect && 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}
33collect && section == "ip"{
34	ip[nip++] = $1;
35}
36collect && section == "link"{
37	link[nlink++] = $1;
38}
39collect && 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
62collect && 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
74END{
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}' $*
192