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