Annotation of researchv9/sys/conf/src/config/mkioconf.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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