|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)mkioconf.c 2.9 (Berkeley) 8/11/83";
3: #endif
4:
5: #include <stdio.h>
6: #include "y.tab.h"
7: #include "config.h"
8:
9: /*
10: * build the ioconf.c file
11: */
12: char *qu();
13: char *intv();
14:
15: #if MACHINE_VAX
16: vax_ioconf()
17: {
18: register struct device *dp, *mp, *np;
19: register int uba_n, slave;
20: FILE *fp;
21:
22: fp = fopen(path("ioconf.c"), "w");
23: if (fp == 0) {
24: perror(path("ioconf.c"));
25: exit(1);
26: }
27: fprintf(fp, "#include \"../machine/pte.h\"\n");
28: fprintf(fp, "#include \"../h/param.h\"\n");
29: fprintf(fp, "#include \"../h/buf.h\"\n");
30: fprintf(fp, "#include \"../h/map.h\"\n");
31: fprintf(fp, "#include \"../h/vm.h\"\n");
32: fprintf(fp, "\n");
33: fprintf(fp, "#include \"../vaxmba/mbavar.h\"\n");
34: fprintf(fp, "#include \"../vaxuba/ubavar.h\"\n\n");
35: fprintf(fp, "\n");
36: fprintf(fp, "#define C (caddr_t)\n\n");
37: /*
38: * First print the mba initialization structures
39: */
40: if (seen_mba) {
41: for (dp = dtab; dp != 0; dp = dp->d_next) {
42: mp = dp->d_conn;
43: if (mp == 0 || mp == TO_NEXUS ||
44: !eq(mp->d_name, "mba"))
45: continue;
46: fprintf(fp, "extern struct mba_driver %sdriver;\n",
47: dp->d_name);
48: }
49: fprintf(fp, "\nstruct mba_device mbdinit[] = {\n");
50: fprintf(fp, "\t/* Device, Unit, Mba, Drive, Dk */\n");
51: for (dp = dtab; dp != 0; dp = dp->d_next) {
52: mp = dp->d_conn;
53: if (dp->d_unit == QUES || mp == 0 ||
54: mp == TO_NEXUS || !eq(mp->d_name, "mba"))
55: continue;
56: if (dp->d_addr) {
57: printf("can't specify csr address on mba for %s%d\n",
58: dp->d_name, dp->d_unit);
59: continue;
60: }
61: if (dp->d_vec != 0) {
62: printf("can't specify vector for %s%d on mba\n",
63: dp->d_name, dp->d_unit);
64: continue;
65: }
66: if (dp->d_drive == UNKNOWN) {
67: printf("drive not specified for %s%d\n",
68: dp->d_name, dp->d_unit);
69: continue;
70: }
71: if (dp->d_slave != UNKNOWN) {
72: printf("can't specify slave number for %s%d\n",
73: dp->d_name, dp->d_unit);
74: continue;
75: }
76: fprintf(fp, "\t{ &%sdriver, %d, %s,",
77: dp->d_name, dp->d_unit, qu(mp->d_unit));
78: fprintf(fp, " %s, %d },\n",
79: qu(dp->d_drive), dp->d_dk);
80: }
81: fprintf(fp, "\t0\n};\n\n");
82: /*
83: * Print the mbsinit structure
84: * Driver Controller Unit Slave
85: */
86: fprintf(fp, "struct mba_slave mbsinit [] = {\n");
87: fprintf(fp, "\t/* Driver, Ctlr, Unit, Slave */\n");
88: for (dp = dtab; dp != 0; dp = dp->d_next) {
89: /*
90: * All slaves are connected to something which
91: * is connected to the massbus.
92: */
93: if ((mp = dp->d_conn) == 0 || mp == TO_NEXUS)
94: continue;
95: np = mp->d_conn;
96: if (np == 0 || np == TO_NEXUS ||
97: !eq(np->d_name, "mba"))
98: continue;
99: fprintf(fp, "\t{ &%sdriver, %s",
100: mp->d_name, qu(mp->d_unit));
101: fprintf(fp, ", %2d, %s },\n",
102: dp->d_unit, qu(dp->d_slave));
103: }
104: fprintf(fp, "\t0\n};\n\n");
105: }
106: /*
107: * Now generate interrupt vectors for the unibus
108: */
109: for (dp = dtab; dp != 0; dp = dp->d_next) {
110: if (dp->d_vec != 0) {
111: struct idlst *ip;
112: mp = dp->d_conn;
113: if (mp == 0 || mp == TO_NEXUS ||
114: !eq(mp->d_name, "uba"))
115: continue;
116: fprintf(fp,
117: "extern struct uba_driver %sdriver;\n",
118: dp->d_name);
119: fprintf(fp, "extern ");
120: ip = dp->d_vec;
121: for (;;) {
122: fprintf(fp, "X%s%d()", ip->id, dp->d_unit);
123: ip = ip->id_next;
124: if (ip == 0)
125: break;
126: fprintf(fp, ", ");
127: }
128: fprintf(fp, ";\n");
129: fprintf(fp, "int\t (*%sint%d[])() = { ", dp->d_name,
130: dp->d_unit, dp->d_unit);
131: ip = dp->d_vec;
132: for (;;) {
133: fprintf(fp, "X%s%d", ip->id, dp->d_unit);
134: ip = ip->id_next;
135: if (ip == 0)
136: break;
137: fprintf(fp, ", ");
138: }
139: fprintf(fp, ", 0 } ;\n");
140: }
141: }
142: fprintf(fp, "\nstruct uba_ctlr ubminit[] = {\n");
143: fprintf(fp, "/*\t driver,\tctlr,\tubanum,\talive,\tintr,\taddr */\n");
144: for (dp = dtab; dp != 0; dp = dp->d_next) {
145: mp = dp->d_conn;
146: if (dp->d_type != CONTROLLER || mp == TO_NEXUS || mp == 0 ||
147: !eq(mp->d_name, "uba"))
148: continue;
149: if (dp->d_vec == 0) {
150: printf("must specify vector for %s%d\n",
151: dp->d_name, dp->d_unit);
152: continue;
153: }
154: if (dp->d_addr == 0) {
155: printf("must specify csr address for %s%d\n",
156: dp->d_name, dp->d_unit);
157: continue;
158: }
159: if (dp->d_drive != UNKNOWN || dp->d_slave != UNKNOWN) {
160: printf("drives need their own entries; dont ");
161: printf("specify drive or slave for %s%d\n",
162: dp->d_name, dp->d_unit);
163: continue;
164: }
165: if (dp->d_flags) {
166: printf("controllers (e.g. %s%d) ",
167: dp->d_name, dp->d_unit);
168: printf("don't have flags, only devices do\n");
169: continue;
170: }
171: fprintf(fp,
172: "\t{ &%sdriver,\t%d,\t%s,\t0,\t%sint%d, C 0%o },\n",
173: dp->d_name, dp->d_unit, qu(mp->d_unit),
174: dp->d_name, dp->d_unit, dp->d_addr);
175: }
176: fprintf(fp, "\t0\n};\n");
177: /* unibus devices */
178: fprintf(fp, "\nstruct uba_device ubdinit[] = {\n");
179: fprintf(fp,
180: "\t/* driver, unit, ctlr, ubanum, slave, intr, addr, dk, flags*/\n");
181: for (dp = dtab; dp != 0; dp = dp->d_next) {
182: mp = dp->d_conn;
183: if (dp->d_unit == QUES || dp->d_type != DEVICE || mp == 0 ||
184: mp == TO_NEXUS || mp->d_type == MASTER ||
185: eq(mp->d_name, "mba"))
186: continue;
187: np = mp->d_conn;
188: if (np != 0 && np != TO_NEXUS && eq(np->d_name, "mba"))
189: continue;
190: np = 0;
191: if (eq(mp->d_name, "uba")) {
192: if (dp->d_vec == 0) {
193: printf("must specify vector for device %s%d\n",
194: dp->d_name, dp->d_unit);
195: continue;
196: }
197: if (dp->d_addr == 0) {
198: printf("must specify csr for device %s%d\n",
199: dp->d_name, dp->d_unit);
200: continue;
201: }
202: if (dp->d_drive != UNKNOWN || dp->d_slave != UNKNOWN) {
203: printf("drives/slaves can be specified ");
204: printf("only for controllers, ");
205: printf("not for device %s%d\n",
206: dp->d_name, dp->d_unit);
207: continue;
208: }
209: uba_n = mp->d_unit;
210: slave = QUES;
211: } else {
212: if ((np = mp->d_conn) == 0) {
213: printf("%s%d isn't connected to anything ",
214: mp->d_name, mp->d_unit);
215: printf(", so %s%d is unattached\n",
216: dp->d_name, dp->d_unit);
217: continue;
218: }
219: uba_n = np->d_unit;
220: if (dp->d_drive == UNKNOWN) {
221: printf("must specify ``drive number'' ");
222: printf("for %s%d\n", dp->d_name, dp->d_unit);
223: continue;
224: }
225: /* NOTE THAT ON THE UNIBUS ``drive'' IS STORED IN */
226: /* ``SLAVE'' AND WE DON'T WANT A SLAVE SPECIFIED */
227: if (dp->d_slave != UNKNOWN) {
228: printf("slave numbers should be given only ");
229: printf("for massbus tapes, not for %s%d\n",
230: dp->d_name, dp->d_unit);
231: continue;
232: }
233: if (dp->d_vec != 0) {
234: printf("interrupt vectors should not be ");
235: printf("given for drive %s%d\n",
236: dp->d_name, dp->d_unit);
237: continue;
238: }
239: if (dp->d_addr != 0) {
240: printf("csr addresses should be given only ");
241: printf("on controllers, not on %s%d\n",
242: dp->d_name, dp->d_unit);
243: continue;
244: }
245: slave = dp->d_drive;
246: }
247: fprintf(fp, "\t{ &%sdriver, %2d, %s,",
248: eq(mp->d_name, "uba") ? dp->d_name : mp->d_name, dp->d_unit,
249: eq(mp->d_name, "uba") ? " -1" : qu(mp->d_unit));
250: fprintf(fp, " %s, %2d, %s, C 0%-6o, %d, 0x%x },\n",
251: qu(uba_n), slave, intv(dp), dp->d_addr, dp->d_dk,
252: dp->d_flags);
253: }
254: fprintf(fp, "\t0\n};\n");
255: (void) fclose(fp);
256: }
257: #endif
258:
259: #if MACHINE_SUN
260: sun_ioconf()
261: {
262: register struct device *dp, *mp;
263: register int slave;
264: FILE *fp;
265:
266: fp = fopen(path("ioconf.c"), "w");
267: if (fp == 0) {
268: perror(path("ioconf.c"));
269: exit(1);
270: }
271: fprintf(fp, "#include \"../h/param.h\"\n");
272: fprintf(fp, "#include \"../h/buf.h\"\n");
273: fprintf(fp, "#include \"../h/map.h\"\n");
274: fprintf(fp, "#include \"../h/vm.h\"\n");
275: fprintf(fp, "\n");
276: fprintf(fp, "#include \"../sundev/mbvar.h\"\n");
277: fprintf(fp, "\n");
278: fprintf(fp, "#define C (caddr_t)\n\n");
279: fprintf(fp, "\n");
280: /*
281: * Now generate interrupt vectors for the Multibus
282: */
283: for (dp = dtab; dp != 0; dp = dp->d_next) {
284: if (dp->d_pri != 0) {
285: mp = dp->d_conn;
286: if (mp == 0 || mp == TO_NEXUS ||
287: !eq(mp->d_name, "mb"))
288: continue;
289: fprintf(fp, "extern struct mb_driver %sdriver;\n",
290: dp->d_name);
291: }
292: }
293: /*
294: * Now spew forth the mb_cinfo structure
295: */
296: fprintf(fp, "\nstruct mb_ctlr mbcinit[] = {\n");
297: fprintf(fp, "/*\t driver,\tctlr,\talive,\taddr,\tintpri */\n");
298: for (dp = dtab; dp != 0; dp = dp->d_next) {
299: mp = dp->d_conn;
300: if (dp->d_type != CONTROLLER || mp == TO_NEXUS || mp == 0 ||
301: !eq(mp->d_name, "mb"))
302: continue;
303: if (dp->d_pri == 0) {
304: printf("must specify priority for %s%d\n",
305: dp->d_name, dp->d_unit);
306: continue;
307: }
308: if (dp->d_addr == 0) {
309: printf("must specify csr address for %s%d\n",
310: dp->d_name, dp->d_unit);
311: continue;
312: }
313: if (dp->d_drive != UNKNOWN || dp->d_slave != UNKNOWN) {
314: printf("drives need their own entries; ");
315: printf("dont specify drive or slave for %s%d\n",
316: dp->d_name, dp->d_unit);
317: continue;
318: }
319: if (dp->d_flags) {
320: printf("controllers (e.g. %s%d) don't have flags, ");
321: printf("only devices do\n",
322: dp->d_name, dp->d_unit);
323: continue;
324: }
325: fprintf(fp, "\t{ &%sdriver,\t%d,\t0,\tC 0x%x,\t%d },\n",
326: dp->d_name, dp->d_unit, dp->d_addr, dp->d_pri);
327: }
328: fprintf(fp, "\t0\n};\n");
329: /*
330: * Now we go for the mb_device stuff
331: */
332: fprintf(fp, "\nstruct mb_device mbdinit[] = {\n");
333: fprintf(fp,
334: "\t/* driver, unit, ctlr, slave, addr, pri, dk, flags*/\n");
335: for (dp = dtab; dp != 0; dp = dp->d_next) {
336: mp = dp->d_conn;
337: if (dp->d_unit == QUES || dp->d_type != DEVICE || mp == 0 ||
338: mp == TO_NEXUS || mp->d_type == MASTER ||
339: eq(mp->d_name, "mba"))
340: continue;
341: if (eq(mp->d_name, "mb")) {
342: if (dp->d_pri == 0) {
343: printf("must specify vector for device %s%d\n",
344: dp->d_name, dp->d_unit);
345: continue;
346: }
347: if (dp->d_addr == 0) {
348: printf("must specify csr for device %s%d\n",
349: dp->d_name, dp->d_unit);
350: continue;
351: }
352: if (dp->d_drive != UNKNOWN || dp->d_slave != UNKNOWN) {
353: printf("drives/slaves can be specified only ");
354: printf("for controllers, not for device %s%d\n",
355: dp->d_name, dp->d_unit);
356: continue;
357: }
358: slave = QUES;
359: } else {
360: if (mp->d_conn == 0) {
361: printf("%s%d isn't connected to anything, ",
362: mp->d_name, mp->d_unit);
363: printf("so %s%d is unattached\n",
364: dp->d_name, dp->d_unit);
365: continue;
366: }
367: if (dp->d_drive == UNKNOWN) {
368: printf("must specify ``drive number'' for %s%d\n",
369: dp->d_name, dp->d_unit);
370: continue;
371: }
372: /* NOTE THAT ON THE UNIBUS ``drive'' IS STORED IN */
373: /* ``SLAVE'' AND WE DON'T WANT A SLAVE SPECIFIED */
374: if (dp->d_slave != UNKNOWN) {
375: printf("slave numbers should be given only ");
376: printf("for massbus tapes, not for %s%d\n",
377: dp->d_name, dp->d_unit);
378: continue;
379: }
380: if (dp->d_pri != 0) {
381: printf("interrupt priority should not be ");
382: printf("given for drive %s%d\n",
383: dp->d_name, dp->d_unit);
384: continue;
385: }
386: if (dp->d_addr != 0) {
387: printf("csr addresses should be given only");
388: printf("on controllers, not on %s%d\n",
389: dp->d_name, dp->d_unit);
390: continue;
391: }
392: slave = dp->d_drive;
393: }
394: fprintf(fp,
395: "\t{ &%sdriver, %2d, %s, %2d, C 0x%x, %d, %d, 0x%x },\n",
396: eq(mp->d_name, "mb") ? dp->d_name : mp->d_name, dp->d_unit,
397: eq(mp->d_name, "mb") ? " -1" : qu(mp->d_unit),
398: slave, dp->d_addr, dp->d_pri, dp->d_dk, dp->d_flags);
399: }
400: fprintf(fp, "\t0\n};\n");
401: (void) fclose(fp);
402: }
403: #endif
404:
405: char *intv(dev)
406: register struct device *dev;
407: {
408: static char buf[20];
409:
410: if (dev->d_vec == 0)
411: return (" 0");
412: return (sprintf(buf, "%sint%d", dev->d_name, dev->d_unit));
413: }
414:
415: char *
416: qu(num)
417: {
418:
419: if (num == QUES)
420: return ("'?'");
421: if (num == UNKNOWN)
422: return (" -1");
423: return (sprintf(errbuf, "%3d", num));
424: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.