|
|
1.1 root 1:
2: # line 1 "config.y"
3: typedef union {
4: int i;
5: char *cp;
6: struct idlst *idlst;
7: } YYSTYPE;
8: # define CPU 257
9: # define IDENT 258
10: # define CONFIG 259
11: # define ANY 260
12: # define DEVICE 261
13: # define UBA 262
14: # define MBA 263
15: # define NEXUS 264
16: # define CSR 265
17: # define DRIVE 266
18: # define VECTOR 267
19: # define OPTIONS 268
20: # define CONTROLLER 269
21: # define PSEUDO_DEVICE 270
22: # define FLAGS 271
23: # define ID 272
24: # define SEMICOLON 273
25: # define NUMBER 274
26: # define FPNUMBER 275
27: # define TRACE 276
28: # define DISK 277
29: # define SLAVE 278
30: # define AT 279
31: # define HZ 280
32: # define TIMEZONE 281
33: # define DST 282
34: # define MAXUSERS 283
35: # define MASTER 284
36: # define MAKEFILE 285
37: # define COMMA 286
38: # define MINUS 287
39: # define MACHINE 288
40: # define PRIORITY 289
41: # define VME16D16 290
42: # define VME24D16 291
43: # define VME32D16 292
44: # define VME16D32 293
45: # define VME24D32 294
46: # define VME32D32 295
47:
48: # line 15 "config.y"
49: /* config.y 1.11 81/05/22 */
50: #include "config.h"
51: #include <stdio.h>
52: struct device cur;
53: struct device *curp = NULL;
54: char *temp_id;
55: #define yyclearin yychar = -1
56: #define yyerrok yyerrflag = 0
57: extern int yychar;
58: extern short yyerrflag;
59: #ifndef YYMAXDEPTH
60: #define YYMAXDEPTH 150
61: #endif
62: YYSTYPE yylval, yyval;
63: # define YYERRCODE 256
64:
65: # line 255 "config.y"
66:
67:
68: yyerror(s)
69: char *s;
70: {
71: fprintf(stderr, "config: %s at line %d\n", s, yyline);
72: }
73:
74: /*
75: * ns:
76: * Return the passed string in a new space
77: */
78:
79: char *
80: ns(str)
81: register char *str;
82: {
83: register char *cp;
84:
85: cp = malloc(strlen(str)+1);
86: strcpy(cp, str);
87: return cp;
88: }
89:
90: /*
91: * newdev
92: * Add a device to the list
93: */
94:
95: newdev(dp)
96: register struct device *dp;
97: {
98: register struct device *np;
99:
100: np = (struct device *) malloc(sizeof *np);
101: *np = *dp;
102: if (curp == NULL)
103: dtab = np;
104: else
105: curp->d_next = np;
106: curp = np;
107: }
108:
109: /*
110: * mkconf
111: * Note that a configuration should be made
112: */
113:
114: mkconf(dev, sysname)
115: char *dev, *sysname;
116: {
117: register struct file_list *fl;
118:
119: fl = (struct file_list *) malloc(sizeof *fl);
120: fl->f_fn = ns(dev);
121: fl->f_needs = ns(sysname);
122: if (confp == NULL)
123: conf_list = fl;
124: else
125: confp->f_next = fl;
126: confp = fl;
127: }
128:
129: /*
130: * Connect:
131: * Find the pointer to connect to the given device and number.
132: * returns NULL if no such device and prints an error message
133: */
134:
135: struct device *connect(dev, num)
136: register char *dev;
137: register int num;
138: {
139: register struct device *dp;
140: struct device *huhcon();
141:
142: if (num == QUES)
143: return huhcon(dev);
144: for (dp = dtab; dp != NULL; dp = dp->d_next)
145: if ((num == dp->d_unit) && eq(dev, dp->d_name))
146: if (dp->d_type != CONTROLLER && dp->d_type != MASTER)
147: {
148: sprintf(errbuf, "%s connected to non-controller", dev);
149: yyerror(errbuf);
150: return NULL;
151: }
152: else
153: return dp;
154: sprintf(errbuf, "%s %d not defined", dev, num);
155: yyerror(errbuf);
156: return NULL;
157: }
158:
159: /*
160: * huhcon
161: * Connect to an unspecific thing
162: */
163:
164: struct device *huhcon(dev)
165: register char *dev;
166: {
167: register struct device *dp, *dcp;
168: struct device rdev;
169: int oldtype;
170:
171: /*
172: * First make certain that there are some of these to wildcard on
173: */
174: for (dp = dtab; dp != NULL; dp = dp->d_next)
175: if (eq(dp->d_name, dev))
176: break;
177: if (dp == NULL)
178: {
179: sprintf(errbuf, "no %s's to wildcard", dev);
180: yyerror(errbuf);
181: return NULL;
182: }
183: oldtype = dp->d_type;
184: dcp = dp->d_conn;
185: /*
186: * Now see if there is already a wildcard entry for this device
187: * (e.g. Search for a "uba ?")
188: */
189: for (; dp != NULL; dp = dp->d_next)
190: if (eq(dev, dp->d_name) && dp->d_unit == -1)
191: break;
192: /*
193: * If there isn't, make one becuase everything needs to be connected
194: * to something.
195: */
196: if (dp == NULL)
197: {
198: dp = &rdev;
199: init_dev(dp);
200: dp->d_unit = QUES;
201: dp->d_name = ns(dev);
202: dp->d_type = oldtype;
203: newdev(dp);
204: dp = curp;
205: /*
206: * Connect it to the same thing that other similar things are
207: * connected to, but make sure it is a wildcard unit
208: * (e.g. up connected to sc ?, here we make connect sc? to a uba?)
209: * If other things like this are on the NEXUS or if the aren't
210: * connected to anything, then make the same connection, else
211: * call ourself to connect to another unspecific device.
212: */
213: if (dcp == TO_NEXUS || dcp == NULL)
214: dp->d_conn = dcp;
215: else
216: dp->d_conn = connect(dcp->d_name, QUES);
217: }
218: return dp;
219: }
220:
221: /*
222: * init_dev:
223: * Set up the fields in the current device to their
224: * default values.
225: */
226:
227: init_dev(dp)
228: register struct device *dp;
229: {
230: dp->d_name = "OHNO!!!";
231: dp->d_type = DEVICE;
232: dp->d_conn = NULL;
233: dp->d_vec = NULL;
234: dp->d_addr = UNKNOWN;
235: dp->d_flags = dp->d_dk = 0;
236: dp->d_slave = dp->d_drive = dp->d_unit = UNKNOWN;
237: dp->d_count = 0;
238: dp->d_mach = dp->d_bus = 0;
239: dp->d_pri = 0;
240: }
241:
242: /*
243: * Check_nexus:
244: * Make certain that this is a reasonable type of thing to put
245: * on the nexus.
246: */
247:
248: check_nexus(dev, num)
249: register struct device *dev;
250: int num;
251: {
252: switch (machine) {
253:
254: case MACHINE_VAX:
255: if (!eq(dev->d_name, "uba") && !eq(dev->d_name, "mba"))
256: yyerror("only uba's and mba's should be connected to the nexus");
257: if (num != QUES)
258: yyerror("can't give specific nexus numbers");
259: break;
260:
261: case MACHINE_SUN2:
262: if (!eq(dev->d_name, "virtual") &&
263: !eq(dev->d_name, "obmem") &&
264: !eq(dev->d_name, "obio") &&
265: !eq(dev->d_name, "mbmem") &&
266: !eq(dev->d_name, "mbio") &&
267: !eq(dev->d_name, "vme16d16") &&
268: !eq(dev->d_name, "vme24d16")) {
269: (void)sprintf(errbuf,
270: "unknown bus type `%s' for nexus connection on %s",
271: dev->d_name, machinename);
272: yyerror(errbuf);
273: }
274: break;
275:
276: case MACHINE_SUN3:
277: if (!eq(dev->d_name, "virtual") &&
278: !eq(dev->d_name, "obmem") &&
279: !eq(dev->d_name, "obio") &&
280: !eq(dev->d_name, "vme16d16") &&
281: !eq(dev->d_name, "vme24d16") &&
282: !eq(dev->d_name, "vme32d16") &&
283: !eq(dev->d_name, "vme16d32") &&
284: !eq(dev->d_name, "vme24d32") &&
285: !eq(dev->d_name, "vme32d32")) {
286: (void)sprintf(errbuf,
287: "unknown bus type `%s' for nexus connection on %s",
288: dev->d_name, machinename);
289: yyerror(errbuf);
290: }
291: break;
292: }
293: }
294:
295: /*
296: * Check the timezone to make certain it is sensible
297: */
298:
299: check_tz()
300: {
301: if (timezone > 24 * 60)
302: yyerror("timezone is unreasonable");
303: else
304: hadtz = TRUE;
305: }
306:
307: /*
308: * bi_info gives the magic number used to construct the token for
309: * the autoconf code. bi_max is the maximum value (across all
310: * machine types for a given architecture) that a given "bus
311: * type" can legally have.
312: */
313: struct bus_info {
314: char *bi_name;
315: u_short bi_info;
316: u_int bi_max;
317: };
318:
319: struct bus_info sun2_info[] = {
320: { "virtual", 0x0001, (1<<24)-1 },
321: { "obmem", 0x0002, (1<<23)-1 },
322: { "obio", 0x0004, (1<<23)-1 },
323: { "mbmem", 0x0010, (1<<20)-1 },
324: { "mbio", 0x0020, (1<<16)-1 },
325: { "vme16d16", 0x0100, (1<<16)-1 },
326: { "vme24d16", 0x0200, (1<<24)-(1<<16)-1 },
327: { (char *)0, 0, 0 }
328: };
329:
330: struct bus_info sun3_info[] = {
331: { "virtual", 0x0001, (1<<32)-1 },
332: { "obmem", 0x0002, (1<<32)-1 },
333: { "obio", 0x0004, (1<<21)-1 },
334: { "vme16d16", 0x0100, (1<<16)-1 },
335: { "vme24d16", 0x0200, (1<<24)-(1<<16)-1 },
336: { "vme32d16", 0x0400, (1<<32)-(1<<24)-1 },
337: { "vme16d32", 0x1000, (1<<16) },
338: { "vme24d32", 0x2000, (1<<24)-(1<<16)-1 },
339: { "vme32d32", 0x4000, (1<<32)-(1<<24)-1 },
340: { (char *)0, 0, 0 }
341: };
342:
343: bus_encode(addr, dp)
344: u_int addr;
345: register struct device *dp;
346: {
347: register char *busname;
348: register struct bus_info *bip;
349: register int num;
350:
351: if (machine == MACHINE_SUN2)
352: bip = sun2_info;
353: else if (machine == MACHINE_SUN3)
354: bip = sun3_info;
355: else {
356: yyerror("bad machine type for bus_encode");
357: exit(1);
358: }
359:
360: if (dp->d_conn == TO_NEXUS || dp->d_conn == 0) {
361: yyerror("bad connection");
362: exit(1);
363: }
364:
365: busname = dp->d_conn->d_name;
366: num = dp->d_conn->d_unit;
367:
368: for (; bip->bi_name != 0; bip++)
369: if (eq(busname, bip->bi_name))
370: break;
371:
372: if (bip->bi_name == 0) {
373: (void)sprintf(errbuf, "bad bus type '%s' for machine %s",
374: busname, machinename);
375: yyerror(errbuf);
376: } else if (addr > bip->bi_max) {
377: (void)sprintf(errbuf,
378: "0x%x exceeds maximum address 0x%x allowed for %s",
379: addr, bip->bi_max, busname);
380: yyerror(errbuf);
381: } else {
382: dp->d_bus = bip->bi_info; /* set up bus type info */
383: if (num != QUES)
384: /*
385: * Set up cpu type since the connecting
386: * bus type is not wildcarded.
387: */
388: dp->d_mach = num;
389: }
390: }
391: short yyexca[] ={
392: -1, 1,
393: 0, -1,
394: -2, 0,
395: -1, 2,
396: 0, 1,
397: -2, 0,
398: };
399: # define YYNPROD 66
400: # define YYLAST 168
401: short yyact[]={
402:
403: 8, 15, 17, 18, 74, 9, 86, 65, 52, 53,
404: 77, 85, 16, 12, 13, 84, 68, 7, 60, 45,
405: 6, 11, 67, 104, 19, 20, 73, 23, 10, 22,
406: 50, 21, 14, 52, 53, 103, 54, 55, 56, 57,
407: 58, 59, 102, 60, 91, 92, 69, 70, 43, 44,
408: 94, 101, 35, 88, 99, 97, 96, 93, 95, 87,
409: 82, 54, 55, 56, 57, 58, 59, 78, 47, 42,
410: 27, 26, 25, 24, 35, 66, 46, 40, 74, 72,
411: 89, 51, 90, 75, 38, 71, 48, 49, 37, 28,
412: 29, 5, 4, 3, 2, 34, 36, 39, 1, 41,
413: 30, 31, 32, 0, 33, 0, 0, 0, 0, 0,
414: 0, 0, 0, 0, 0, 64, 0, 61, 62, 63,
415: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
416: 0, 0, 76, 0, 0, 0, 0, 0, 0, 0,
417: 0, 0, 0, 100, 0, 0, 39, 79, 80, 81,
418: 83, 0, 0, 105, 0, 0, 0, 0, 0, 0,
419: 0, 0, 0, 0, 0, 0, 0, 98 };
420: short yypact[]={
421:
422: -1000,-1000,-256,-1000,-200,-201,-202,-1000,-203,-1000,
423: -1000,-1000,-1000,-1000,-198,-198,-198,-195,-198,-205,
424: -226,-262,-196,-206,-1000,-1000,-1000,-1000,-249,-229,
425: -249,-249,-249,-229,-1000,-1000,-1000,-279,-1000,-1000,
426: -1000,-197,-1000,-260,-266,-228,-1000,-1000,-263,-1000,
427: -254,-207,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
428: -1000,-263,-263,-263,-214,-198,-1000,-1000,-1000,-267,
429: -271,-1000,-283,-215,-198,-221,-216,-218,-1000,-1000,
430: -1000,-1000,-1000,-1000,-1000,-1000,-219,-189,-1000,-220,
431: -1000,-223,-232,-239,-251,-1000,-1000,-1000,-1000,-198,
432: -1000,-1000,-1000,-1000,-1000,-1000 };
433: short yypgo[]={
434:
435: 0, 80, 81, 53, 98, 94, 93, 92, 91, 88,
436: 84, 89, 86, 85, 90, 87, 83, 82, 79 };
437: short yyr1[]={
438:
439: 0, 4, 5, 5, 6, 6, 6, 6, 6, 8,
440: 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
441: 8, 8, 8, 8, 8, 9, 9, 10, 1, 2,
442: 2, 2, 2, 2, 2, 2, 2, 2, 7, 7,
443: 7, 7, 7, 7, 11, 14, 12, 12, 15, 15,
444: 16, 16, 17, 17, 17, 17, 13, 13, 13, 13,
445: 13, 18, 3, 3, 3, 3 };
446: short yyr2[]={
447:
448: 0, 1, 2, 0, 2, 2, 2, 1, 2, 2,
449: 2, 2, 2, 3, 2, 2, 3, 2, 3, 3,
450: 4, 3, 4, 2, 2, 3, 1, 1, 1, 1,
451: 1, 1, 1, 1, 1, 1, 1, 1, 4, 4,
452: 4, 4, 3, 4, 3, 0, 2, 0, 3, 3,
453: 2, 0, 2, 2, 2, 2, 1, 2, 3, 3,
454: 0, 2, 1, 2, 2, 3 };
455: short yychk[]={
456:
457: -1000, -4, -5, -6, -7, -8, 276, 273, 256, 261,
458: 284, 277, 269, 270, 288, 257, 268, 258, 259, 280,
459: 281, 287, 285, 283, 273, 273, 273, 273, -11, -14,
460: -11, -11, -11, -14, -1, 272, -1, -9, -10, -1,
461: 272, -1, 274, 274, 275, 281, 272, 274, -12, -15,
462: 279, -2, 262, 263, 290, 291, 292, 293, 294, 295,
463: 272, -12, -12, -12, -2, 286, 272, 282, 282, 274,
464: 275, -13, -18, 289, 267, -16, -2, 264, 274, -13,
465: -13, -13, 274, -10, 282, 282, 289, 274, -3, -1,
466: -17, 265, 266, 278, 271, 274, 274, 274, -18, 274,
467: -3, 274, 274, 274, 274, -3 };
468: short yydef[]={
469:
470: 3, -2, -2, 2, 0, 0, 0, 7, 0, 45,
471: 45, 45, 45, 45, 0, 0, 0, 0, 0, 0,
472: 0, 0, 0, 0, 4, 5, 6, 8, 47, 0,
473: 47, 47, 47, 0, 9, 28, 10, 11, 26, 27,
474: 12, 0, 14, 15, 17, 0, 23, 24, 60, 51,
475: 0, 0, 29, 30, 31, 32, 33, 34, 35, 36,
476: 37, 60, 60, 60, 42, 0, 13, 16, 18, 19,
477: 21, 38, 56, 0, 0, 46, 0, 0, 44, 39,
478: 40, 41, 43, 25, 20, 22, 0, 57, 61, 62,
479: 50, 0, 0, 0, 0, 48, 49, 58, 59, 63,
480: 64, 52, 53, 54, 55, 65 };
481: # ifdef YYDEBUG
482: # include "y.debug"
483: # endif
484:
485: # define YYFLAG -1000
486: # define YYERROR goto yyerrlab
487: # define YYACCEPT return(0)
488: # define YYABORT return(1)
489:
490: /* parser for yacc output */
491:
492: #ifdef YYDEBUG
493: int yydebug = 0; /* 1 for debugging */
494: #endif
495: YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
496: int yychar = -1; /* current input token number */
497: int yynerrs = 0; /* number of errors */
498: short yyerrflag = 0; /* error recovery flag */
499:
500: yyparse()
501: { short yys[YYMAXDEPTH];
502: int yyj, yym;
503: register YYSTYPE *yypvt;
504: register int yystate, yyn;
505: register short *yyps;
506: register YYSTYPE *yypv;
507: register short *yyxi;
508:
509: yystate = 0;
510: yychar = -1;
511: yynerrs = 0;
512: yyerrflag = 0;
513: yyps= &yys[-1];
514: yypv= &yyv[-1];
515:
516: yystack: /* put a state and value onto the stack */
517: #ifdef YYDEBUG
518: if(yydebug >= 3)
519: if(yychar < 0 || yytoknames[yychar] == 0)
520: printf("char %d in %s", yychar, yystates[yystate]);
521: else
522: printf("%s in %s", yytoknames[yychar], yystates[yystate]);
523: #endif
524: if( ++yyps >= &yys[YYMAXDEPTH] ) {
525: yyerror( "yacc stack overflow" );
526: return(1);
527: }
528: *yyps = yystate;
529: ++yypv;
530: *yypv = yyval;
531: yynewstate:
532: yyn = yypact[yystate];
533: if(yyn <= YYFLAG) goto yydefault; /* simple state */
534: if(yychar<0) {
535: yychar = yylex();
536: #ifdef YYDEBUG
537: if(yydebug >= 2) {
538: if(yychar <= 0)
539: printf("lex EOF\n");
540: else if(yytoknames[yychar])
541: printf("lex %s\n", yytoknames[yychar]);
542: else
543: printf("lex (%c)\n", yychar);
544: }
545: #endif
546: if(yychar < 0)
547: yychar = 0;
548: }
549: if((yyn += yychar) < 0 || yyn >= YYLAST)
550: goto yydefault;
551: if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
552: yychar = -1;
553: yyval = yylval;
554: yystate = yyn;
555: if( yyerrflag > 0 ) --yyerrflag;
556: goto yystack;
557: }
558: yydefault:
559: /* default state action */
560: if( (yyn=yydef[yystate]) == -2 ) {
561: if(yychar < 0) {
562: yychar = yylex();
563: #ifdef YYDEBUG
564: if(yydebug >= 2)
565: if(yychar < 0)
566: printf("lex EOF\n");
567: else
568: printf("lex %s\n", yytoknames[yychar]);
569: #endif
570: if(yychar < 0)
571: yychar = 0;
572: }
573: /* look through exception table */
574: for(yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate);
575: yyxi += 2 ) ; /* VOID */
576: while( *(yyxi+=2) >= 0 ){
577: if( *yyxi == yychar ) break;
578: }
579: if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */
580: }
581: if( yyn == 0 ){ /* error */
582: /* error ... attempt to resume parsing */
583: switch( yyerrflag ){
584: case 0: /* brand new error */
585: #ifdef YYDEBUG
586: yyerror("syntax error\n%s", yystates[yystate]);
587: if(yytoknames[yychar])
588: yyerror("saw %s\n", yytoknames[yychar]);
589: else if(yychar >= ' ' && yychar < '\177')
590: yyerror("saw `%c'\n", yychar);
591: else if(yychar == 0)
592: yyerror("saw EOF\n");
593: else
594: yyerror("saw char 0%o\n", yychar);
595: #else
596: yyerror( "syntax error" );
597: #endif
598: yyerrlab:
599: ++yynerrs;
600: case 1:
601: case 2: /* incompletely recovered error ... try again */
602: yyerrflag = 3;
603: /* find a state where "error" is a legal shift action */
604: while ( yyps >= yys ) {
605: yyn = yypact[*yyps] + YYERRCODE;
606: if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
607: yystate = yyact[yyn]; /* simulate a shift of "error" */
608: goto yystack;
609: }
610: yyn = yypact[*yyps];
611: /* the current yyps has no shift onn "error", pop stack */
612: #ifdef YYDEBUG
613: if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
614: #endif
615: --yyps;
616: --yypv;
617: }
618: /* there is no state on the stack with an error shift ... abort */
619: yyabort:
620: return(1);
621: case 3: /* no shift yet; clobber input char */
622: #ifdef YYDEBUG
623: if( yydebug ) {
624: printf("error recovery discards ");
625: if(yytoknames[yychar])
626: printf("%s\n", yytoknames[yychar]);
627: else if(yychar >= ' ' && yychar < '\177')
628: printf("`%c'\n", yychar);
629: else if(yychar == 0)
630: printf("EOF\n");
631: else
632: printf("char 0%o\n", yychar);
633: }
634: #endif
635: if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
636: yychar = -1;
637: goto yynewstate; /* try again in the same state */
638: }
639: }
640: /* reduction by production yyn */
641: #ifdef YYDEBUG
642: if(yydebug) { char *s;
643: printf("reduce %d in:\n\t", yyn);
644: for(s = yystates[yystate]; *s; s++) {
645: putchar(*s);
646: if(*s == '\n' && *(s+1))
647: putchar('\t');
648: }
649: }
650: #endif
651: yyps -= yyr2[yyn];
652: yypvt = yypv;
653: yypv -= yyr2[yyn];
654: yyval = yypv[1];
655: yym=yyn;
656: /* consult goto table to find next state */
657: yyn = yyr1[yyn];
658: yyj = yypgo[yyn] + *yyps + 1;
659: if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
660: switch(yym){
661:
662: case 4:
663: # line 33 "config.y"
664: { newdev(&cur); } break;
665: case 6:
666: # line 35 "config.y"
667: { do_trace = ! do_trace; } break;
668: case 9:
669: # line 42 "config.y"
670: {
671: if (eq(yypvt[-0].cp, "vax")) {
672: machine = MACHINE_VAX;
673: machinename = "vax";
674: } else if (eq(yypvt[-0].cp, "sun2")) {
675: machine = MACHINE_SUN2;
676: machinename = "sun2";
677: } else if (eq(yypvt[-0].cp, "sun3")) {
678: machine = MACHINE_SUN3;
679: machinename = "sun3";
680: } else
681: yyerror("Unknown machine type");
682: } break;
683: case 10:
684: # line 55 "config.y"
685: {
686: struct cputype *cp = (struct cputype *)malloc(sizeof (struct cputype));
687: cp->cpu_name = ns(yypvt[-0].cp);
688: cp->cpu_next = cputype;
689: cputype = cp;
690: free(temp_id);
691: } break;
692: case 12:
693: # line 63 "config.y"
694: { ident = ns(yypvt[-0].cp); } break;
695: case 13:
696: # line 64 "config.y"
697: { mkconf(temp_id, yypvt[-0].cp); free(temp_id); } break;
698: case 14:
699: # line 65 "config.y"
700: {
701: yyerror("HZ specification obsolete; delete");
702: hz = 60;
703: } break;
704: case 15:
705: # line 69 "config.y"
706: { timezone = 60 * yypvt[-0].i; check_tz(); } break;
707: case 16:
708: # line 70 "config.y"
709: { timezone = 60 * yypvt[-1].i; dst = 1; check_tz(); } break;
710: case 17:
711: # line 71 "config.y"
712: { timezone = yypvt[-0].i; check_tz(); } break;
713: case 18:
714: # line 72 "config.y"
715: { timezone = yypvt[-1].i; dst = 1; check_tz(); } break;
716: case 19:
717: # line 73 "config.y"
718:
719: { timezone = -60 * yypvt[-0].i; check_tz(); } break;
720: case 20:
721: # line 75 "config.y"
722:
723: { timezone = -60 * yypvt[-1].i; dst = 1; check_tz(); } break;
724: case 21:
725: # line 77 "config.y"
726:
727: { timezone = -yypvt[-0].i; check_tz(); } break;
728: case 22:
729: # line 79 "config.y"
730:
731: { timezone = -yypvt[-1].i; dst = 1; check_tz(); } break;
732: case 23:
733: # line 81 "config.y"
734:
735: { mkfile = ns(yypvt[-0].cp); } break;
736: case 24:
737: # line 83 "config.y"
738: { maxusers = yypvt[-0].i; } break;
739: case 27:
740: # line 92 "config.y"
741: {
742: struct opt *op = (struct opt *)malloc(sizeof (struct opt));
743: op->op_name = ns(yypvt[-0].cp);
744: op->op_next = opt;
745: opt = op;
746: free(temp_id);
747: } break;
748: case 28:
749: # line 102 "config.y"
750: { yyval.cp = temp_id = ns(yypvt[-0].cp); } break;
751: case 29:
752: # line 107 "config.y"
753: {
754: if (machine != MACHINE_VAX)
755: yyerror("wrong machine type for uba");
756: yyval.cp = ns("uba");
757: } break;
758: case 30:
759: # line 113 "config.y"
760: {
761: if (machine != MACHINE_VAX)
762: yyerror("wrong machine type for mba");
763: yyval.cp = ns("mba");
764: } break;
765: case 31:
766: # line 119 "config.y"
767: {
768: if (machine != MACHINE_SUN2 && machine != MACHINE_SUN3)
769: yyerror("wrong machine type for vme16d16");
770: yyval.cp = ns("vme16d16");
771: } break;
772: case 32:
773: # line 125 "config.y"
774: {
775: if (machine != MACHINE_SUN2 && machine != MACHINE_SUN3)
776: yyerror("wrong machine type for vme24d16");
777: yyval.cp = ns("vme24d16");
778: } break;
779: case 33:
780: # line 131 "config.y"
781: {
782: if (machine != MACHINE_SUN3)
783: yyerror("wrong machine type for vme32d16");
784: yyval.cp = ns("vme32d16");
785: } break;
786: case 34:
787: # line 137 "config.y"
788: {
789: if (machine != MACHINE_SUN3)
790: yyerror("wrong machine type for vme16d32");
791: yyval.cp = ns("vme16d32");
792: } break;
793: case 35:
794: # line 143 "config.y"
795: {
796: if (machine != MACHINE_SUN3)
797: yyerror("wrong machine type for vme24d32");
798: yyval.cp = ns("vme24d32");
799: } break;
800: case 36:
801: # line 149 "config.y"
802: {
803: if (machine != MACHINE_SUN3)
804: yyerror("wrong machine type for vme32d32");
805: yyval.cp = ns("vme32d32");
806: } break;
807: case 37:
808: # line 154 "config.y"
809: { yyval.cp = ns(yypvt[-0].cp); } break;
810: case 38:
811: # line 158 "config.y"
812: { cur.d_type = DEVICE; } break;
813: case 39:
814: # line 159 "config.y"
815: { cur.d_type = MASTER; } break;
816: case 40:
817: # line 160 "config.y"
818:
819: { cur.d_dk = 1; cur.d_type = DEVICE; } break;
820: case 41:
821: # line 162 "config.y"
822: { cur.d_type = CONTROLLER; } break;
823: case 42:
824: # line 163 "config.y"
825:
826: { cur.d_name = yypvt[-0].cp; cur.d_type = PSEUDO_DEVICE; } break;
827: case 43:
828: # line 165 "config.y"
829:
830: { cur.d_name = yypvt[-1].cp; cur.d_type = PSEUDO_DEVICE;
831: cur.d_count = yypvt[-0].i; } break;
832: case 44:
833: # line 171 "config.y"
834: {
835: cur.d_name = yypvt[-1].cp;
836: if (eq(yypvt[-1].cp, "mba"))
837: seen_mba = TRUE;
838: else if (eq(yypvt[-1].cp, "uba"))
839: seen_uba = TRUE;
840: cur.d_unit = yypvt[-0].i;
841: } break;
842: case 45:
843: # line 182 "config.y"
844: { init_dev(&cur); } break;
845: case 48:
846: # line 191 "config.y"
847: {
848: if (eq(cur.d_name, "mba") || eq(cur.d_name, "uba")) {
849: sprintf(errbuf,
850: "%s must be connected to a nexus", cur.d_name);
851: yyerror(errbuf);
852: }
853: cur.d_conn = connect(yypvt[-1].cp, yypvt[-0].i);
854: } break;
855: case 49:
856: # line 199 "config.y"
857: { check_nexus(&cur, yypvt[-0].i); cur.d_conn = TO_NEXUS; } break;
858: case 52:
859: # line 209 "config.y"
860: {
861: cur.d_addr = yypvt[-0].i;
862: if (machine == MACHINE_SUN2 || machine == MACHINE_SUN3)
863: bus_encode(yypvt[-0].i, &cur);
864: } break;
865: case 53:
866: # line 214 "config.y"
867: { cur.d_drive = yypvt[-0].i; } break;
868: case 54:
869: # line 215 "config.y"
870:
871: {
872: if (cur.d_conn != NULL && cur.d_conn != TO_NEXUS
873: && cur.d_conn->d_type == MASTER)
874: cur.d_slave = yypvt[-0].i;
875: else
876: yyerror("can't specify slave--not to master");
877: } break;
878: case 55:
879: # line 223 "config.y"
880: { cur.d_flags = yypvt[-0].i; } break;
881: case 56:
882: # line 228 "config.y"
883: { cur.d_pri = 0; } break;
884: case 57:
885: # line 230 "config.y"
886: { cur.d_pri = yypvt[-0].i; } break;
887: case 58:
888: # line 232 "config.y"
889: { cur.d_pri = yypvt[-0].i; } break;
890: case 59:
891: # line 234 "config.y"
892: { cur.d_pri = yypvt[-1].i; } break;
893: case 61:
894: # line 239 "config.y"
895: { cur.d_vec = yypvt[-0].idlst; } break;
896: case 62:
897: # line 242 "config.y"
898:
899: { struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
900: a->id = yypvt[-0].cp; a->id_next = 0; a->vec = 0; yyval.idlst = a; } break;
901: case 63:
902: # line 245 "config.y"
903:
904: { struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
905: a->id = yypvt[-1].cp; a->id_next = 0; a->vec = yypvt[-0].i; yyval.idlst = a; } break;
906: case 64:
907: # line 248 "config.y"
908:
909: { struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
910: a->id = yypvt[-1].cp; a->id_next = yypvt[-0].idlst; a->vec = 0; yyval.idlst = a; } break;
911: case 65:
912: # line 252 "config.y"
913: { struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
914: a->id = yypvt[-2].cp; a->id_next = yypvt[-0].idlst; a->vec = yypvt[-1].i; yyval.idlst = a; } break;
915: }
916: goto yystack; /* stack new state and value */
917: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.