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