Annotation of 42BSD/etc/config/mkioconf.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.