Annotation of 43BSD/etc/config/mkglue.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1980 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: static char sccsid[] = "@(#)mkglue.c   5.1 (Berkeley) 2/18/86";
                      9: #endif not lint
                     10: 
                     11: /*
                     12:  * Make the bus adaptor interrupt glue files.
                     13:  */
                     14: #include <stdio.h>
                     15: #include "config.h"
                     16: #include "y.tab.h"
                     17: #include <ctype.h>
                     18: 
                     19: /*
                     20:  * Create the UNIBUS interrupt vector glue file.
                     21:  */
                     22: ubglue()
                     23: {
                     24:        register FILE *fp, *gp;
                     25:        register struct device *dp, *mp;
                     26: 
                     27:        fp = fopen(path("ubglue.s"), "w");
                     28:        if (fp == 0) {
                     29:                perror(path("ubglue.s"));
                     30:                exit(1);
                     31:        }
                     32:        gp = fopen(path("ubvec.s"), "w");
                     33:        if (gp == 0) {
                     34:                perror(path("ubvec.s"));
                     35:                exit(1);
                     36:        }
                     37:        for (dp = dtab; dp != 0; dp = dp->d_next) {
                     38:                mp = dp->d_conn;
                     39:                if (mp != 0 && mp != (struct device *)-1 &&
                     40:                    !eq(mp->d_name, "mba")) {
                     41:                        struct idlst *id, *id2;
                     42: 
                     43:                        for (id = dp->d_vec; id; id = id->id_next) {
                     44:                                for (id2 = dp->d_vec; id2; id2 = id2->id_next) {
                     45:                                        if (id2 == id) {
                     46:                                                dump_ubavec(fp, id->id,
                     47:                                                    dp->d_unit);
                     48:                                                break;
                     49:                                        }
                     50:                                        if (!strcmp(id->id, id2->id))
                     51:                                                break;
                     52:                                }
                     53:                        }
                     54:                }
                     55:        }
                     56:        dump_std(fp, gp);
                     57:        for (dp = dtab; dp != 0; dp = dp->d_next) {
                     58:                mp = dp->d_conn;
                     59:                if (mp != 0 && mp != (struct device *)-1 &&
                     60:                    !eq(mp->d_name, "mba")) {
                     61:                        struct idlst *id, *id2;
                     62: 
                     63:                        for (id = dp->d_vec; id; id = id->id_next) {
                     64:                                for (id2 = dp->d_vec; id2; id2 = id2->id_next) {
                     65:                                        if (id2 == id) {
                     66:                                                dump_intname(fp, id->id,
                     67:                                                        dp->d_unit);
                     68:                                                break;
                     69:                                        }
                     70:                                        if (!strcmp(id->id, id2->id))
                     71:                                                break;
                     72:                                }
                     73:                        }
                     74:                }
                     75:        }
                     76:        dump_ctrs(fp);
                     77:        (void) fclose(fp);
                     78:        (void) fclose(gp);
                     79: }
                     80: 
                     81: static int cntcnt = 0;         /* number of interrupt counters allocated */
                     82: 
                     83: /*
                     84:  * Print a UNIBUS interrupt vector.
                     85:  */
                     86: dump_ubavec(fp, vector, number)
                     87:        register FILE *fp;
                     88:        char *vector;
                     89:        int number;
                     90: {
                     91:        char nbuf[80];
                     92:        register char *v = nbuf;
                     93: 
                     94:        (void) sprintf(v, "%s%d", vector, number);
                     95:        fprintf(fp, "\t.globl\t_X%s\n\t.align\t2\n_X%s:\n\tpushr\t$0x3f\n",
                     96:            v, v);
                     97:        fprintf(fp, "\tincl\t_fltintrcnt+(4*%d)\n", cntcnt++);
                     98:        if (strncmp(vector, "dzx", 3) == 0)
                     99:                fprintf(fp, "\tmovl\t$%d,r0\n\tjmp\tdzdma\n\n", number);
                    100:        else {
                    101:                if (strncmp(vector, "uur", 3) == 0) {
                    102:                        fprintf(fp, "#ifdef UUDMA\n");
                    103:                        fprintf(fp, "\tmovl\t$%d,r0\n\tjsb\tuudma\n", number);
                    104:                        fprintf(fp, "#endif\n");
                    105:                }
                    106:                fprintf(fp, "\tpushl\t$%d\n", number);
                    107:                fprintf(fp, "\tcalls\t$1,_%s\n\tpopr\t$0x3f\n", vector);
                    108:                fprintf(fp, "\tincl\t_cnt+V_INTR\n\trei\n\n");
                    109:        }
                    110: }
                    111: 
                    112: static char *vaxinames[] = {
                    113:        "clock", "cnr", "cnx", "tur", "tux",
                    114:        "mba0", "mba1", "mba2", "mba3",
                    115:        "uba0", "uba1", "uba2", "uba3"
                    116: };
                    117: static struct stdintrs {
                    118:        char    **si_names;     /* list of standard interrupt names */
                    119:        int     si_n;           /* number of such names */
                    120: } stdintrs[] = {
                    121:        { vaxinames, sizeof (vaxinames) / sizeof (vaxinames[0]) },
                    122: };
                    123: /*
                    124:  * Start the interrupt name table with the names
                    125:  * of the standard vectors not directly associated
                    126:  * with a bus.  Also, dump the defines needed to
                    127:  * reference the associated counters into a separate
                    128:  * file which is prepended to locore.s.
                    129:  */
                    130: dump_std(fp, gp)
                    131:        register FILE *fp, *gp;
                    132: {
                    133:        register struct stdintrs *si = &stdintrs[machine-1];
                    134:        register char **cpp;
                    135:        register int i;
                    136: 
                    137:        fprintf(fp, "\n\t.globl\t_intrnames\n");
                    138:        fprintf(fp, "\n\t.globl\t_eintrnames\n");
                    139:        fprintf(fp, "\t.data\n");
                    140:        fprintf(fp, "_intrnames:\n");
                    141:        cpp = si->si_names;
                    142:        for (i = 0; i < si->si_n; i++) {
                    143:                register char *cp, *tp;
                    144:                char buf[80];
                    145: 
                    146:                cp = *cpp;
                    147:                if (cp[0] == 'i' && cp[1] == 'n' && cp[2] == 't') {
                    148:                        cp += 3;
                    149:                        if (*cp == 'r')
                    150:                                cp++;
                    151:                }
                    152:                for (tp = buf; *cp; cp++)
                    153:                        if (islower(*cp))
                    154:                                *tp++ = toupper(*cp);
                    155:                        else
                    156:                                *tp++ = *cp;
                    157:                *tp = '\0';
                    158:                fprintf(gp, "#define\tI_%s\t%d\n", buf, i*sizeof (long));
                    159:                fprintf(fp, "\t.asciz\t\"%s\"\n", *cpp);
                    160:                cpp++;
                    161:        }
                    162: }
                    163: 
                    164: dump_intname(fp, vector, number)
                    165:        register FILE *fp;
                    166:        char *vector;
                    167:        int number;
                    168: {
                    169:        register char *cp = vector;
                    170: 
                    171:        fprintf(fp, "\t.asciz\t\"");
                    172:        /*
                    173:         * Skip any "int" or "intr" in the name.
                    174:         */
                    175:        while (*cp)
                    176:                if (cp[0] == 'i' && cp[1] == 'n' &&  cp[2] == 't') {
                    177:                        cp += 3;
                    178:                        if (*cp == 'r')
                    179:                                cp++;
                    180:                } else {
                    181:                        putc(*cp, fp);
                    182:                        cp++;
                    183:                }
                    184:        fprintf(fp, "%d\"\n", number);
                    185: }
                    186: 
                    187: /*
                    188:  * Reserve space for the interrupt counters.
                    189:  */
                    190: dump_ctrs(fp)
                    191:        register FILE *fp;
                    192: {
                    193:        struct stdintrs *si = &stdintrs[machine-1];
                    194: 
                    195:        fprintf(fp, "_eintrnames:\n");
                    196:        fprintf(fp, "\n\t.globl\t_intrcnt\n");
                    197:        fprintf(fp, "\n\t.globl\t_eintrcnt\n");
                    198:        fprintf(fp, "\t.align 2\n");
                    199:        fprintf(fp, "_intrcnt:\n");
                    200:        fprintf(fp, "\t.space\t4 * %d\n", si->si_n);
                    201:        fprintf(fp, "_fltintrcnt:\n", cntcnt);
                    202:        fprintf(fp, "\t.space\t4 * %d\n", cntcnt);
                    203:        fprintf(fp, "_eintrcnt:\n\n");
                    204:        fprintf(fp, "\t.text\n");
                    205: }

unix.superglobalmegacorp.com

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