Annotation of 43BSDReno/usr.sbin/config/mkubglue.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[] = "@(#)mkubglue.c 5.1 (Berkeley) 5/8/85";
                      9: #endif not lint
                     10: 
                     11: /*
                     12:  * Make the uba interrupt file ubglue.s
                     13:  */
                     14: #include <stdio.h>
                     15: #include "config.h"
                     16: #include "y.tab.h"
                     17: 
                     18: ubglue()
                     19: {
                     20:        register FILE *fp;
                     21:        register struct device *dp, *mp;
                     22: 
                     23:        fp = fopen(path("ubglue.s"), "w");
                     24:        if (fp == 0) {
                     25:                perror(path("ubglue.s"));
                     26:                exit(1);
                     27:        }
                     28:        for (dp = dtab; dp != 0; dp = dp->d_next) {
                     29:                mp = dp->d_conn;
                     30:                if (mp != 0 && mp != (struct device *)-1 &&
                     31:                    !eq(mp->d_name, "mba")) {
                     32:                        struct idlst *id, *id2;
                     33: 
                     34:                        for (id = dp->d_vec; id; id = id->id_next) {
                     35:                                for (id2 = dp->d_vec; id2; id2 = id2->id_next) {
                     36:                                        if (id2 == id) {
                     37:                                                dump_vec(fp, id->id, dp->d_unit);
                     38:                                                break;
                     39:                                        }
                     40:                                        if (!strcmp(id->id, id2->id))
                     41:                                                break;
                     42:                                }
                     43:                        }
                     44:                }
                     45:        }
                     46:        dump_std(fp);
                     47:        for (dp = dtab; dp != 0; dp = dp->d_next) {
                     48:                mp = dp->d_conn;
                     49:                if (mp != 0 && mp != (struct device *)-1 &&
                     50:                    !eq(mp->d_name, "mba")) {
                     51:                        struct idlst *id, *id2;
                     52: 
                     53:                        for (id = dp->d_vec; id; id = id->id_next) {
                     54:                                for (id2 = dp->d_vec; id2; id2 = id2->id_next) {
                     55:                                        if (id2 == id) {
                     56:                                                dump_intname(fp, id->id,
                     57:                                                        dp->d_unit);
                     58:                                                break;
                     59:                                        }
                     60:                                        if (!strcmp(id->id, id2->id))
                     61:                                                break;
                     62:                                }
                     63:                        }
                     64:                }
                     65:        }
                     66:        dump_ctrs(fp);
                     67:        (void) fclose(fp);
                     68: }
                     69: 
                     70: static int cntcnt = 0;         /* number of interrupt counters allocated */
                     71: 
                     72: /*
                     73:  * print an interrupt vector
                     74:  */
                     75: dump_vec(fp, vector, number)
                     76:        register FILE *fp;
                     77:        char *vector;
                     78:        int number;
                     79: {
                     80:        char nbuf[80];
                     81:        register char *v = nbuf;
                     82: 
                     83:        (void) sprintf(v, "%s%d", vector, number);
                     84:        fprintf(fp, "\t.globl\t_X%s\n\t.align\t2\n_X%s:\n\tpushr\t$0x3f\n",
                     85:            v, v);
                     86:        fprintf(fp, "\tincl\t_fltintrcnt+(4*%d)\n", cntcnt++);
                     87:        if (strncmp(vector, "dzx", 3) == 0)
                     88:                fprintf(fp, "\tmovl\t$%d,r0\n\tjmp\tdzdma\n\n", number);
                     89:        else {
                     90:                if (strncmp(vector, "uur", 3) == 0) {
                     91:                        fprintf(fp, "#ifdef UUDMA\n");
                     92:                        fprintf(fp, "\tmovl\t$%d,r0\n\tjsb\tuudma\n", number);
                     93:                        fprintf(fp, "#endif\n");
                     94:                }
                     95:                fprintf(fp, "\tpushl\t$%d\n", number);
                     96:                fprintf(fp, "\tcalls\t$1,_%s\n\tpopr\t$0x3f\n", vector);
                     97:                fprintf(fp, "\tincl\t_cnt+V_INTR\n\trei\n\n");
                     98:        }
                     99: }
                    100: 
                    101: /*
                    102:  * Start the interrupt name table with the names
                    103:  * of the standard vectors not on the unibus.
                    104:  * The number and order of these names should correspond
                    105:  * with the definitions in scb.s.
                    106:  */
                    107: dump_std(fp)
                    108:        register FILE *fp;
                    109: {
                    110:        fprintf(fp, "\n\t.globl\t_intrnames\n");
                    111:        fprintf(fp, "\n\t.globl\t_eintrnames\n");
                    112:        fprintf(fp, "\t.data\n");
                    113:        fprintf(fp, "_intrnames:\n");
                    114:        fprintf(fp, "\t.asciz\t\"clock\"\n");
                    115:        fprintf(fp, "\t.asciz\t\"cnr\"\n");
                    116:        fprintf(fp, "\t.asciz\t\"cnx\"\n");
                    117:        fprintf(fp, "\t.asciz\t\"tur\"\n");
                    118:        fprintf(fp, "\t.asciz\t\"tux\"\n");
                    119:        fprintf(fp, "\t.asciz\t\"mba0\"\n");
                    120:        fprintf(fp, "\t.asciz\t\"mba1\"\n");
                    121:        fprintf(fp, "\t.asciz\t\"mba2\"\n");
                    122:        fprintf(fp, "\t.asciz\t\"mba3\"\n");
                    123:        fprintf(fp, "\t.asciz\t\"uba0\"\n");
                    124:        fprintf(fp, "\t.asciz\t\"uba1\"\n");
                    125:        fprintf(fp, "\t.asciz\t\"uba2\"\n");
                    126:        fprintf(fp, "\t.asciz\t\"uba3\"\n");
                    127: #define        I_FIXED         13                      /* number of names above */
                    128: }
                    129: 
                    130: dump_intname(fp, vector, number)
                    131:        register FILE *fp;
                    132:        char *vector;
                    133:        int number;
                    134: {
                    135:        register char *cp = vector;
                    136: 
                    137:        fprintf(fp, "\t.asciz\t\"");
                    138:        /*
                    139:         * Skip any "int" or "intr" in the name.
                    140:         */
                    141:        while (*cp)
                    142:                if (cp[0] == 'i' && cp[1] == 'n' &&  cp[2] == 't') {
                    143:                        cp += 3;
                    144:                        if (*cp == 'r')
                    145:                                cp++;
                    146:                } else {
                    147:                        putc(*cp, fp);
                    148:                        cp++;
                    149:                }
                    150:        fprintf(fp, "%d\"\n", number);
                    151: }
                    152: 
                    153: dump_ctrs(fp)
                    154:        register FILE *fp;
                    155: {
                    156:        fprintf(fp, "_eintrnames:\n");
                    157:        fprintf(fp, "\n\t.globl\t_intrcnt\n");
                    158:        fprintf(fp, "\n\t.globl\t_eintrcnt\n");
                    159:        fprintf(fp, "_intrcnt:\n", I_FIXED);
                    160:        fprintf(fp, "\t.space\t4 * %d\n", I_FIXED);
                    161:        fprintf(fp, "_fltintrcnt:\n", cntcnt);
                    162:        fprintf(fp, "\t.space\t4 * %d\n", cntcnt);
                    163:        fprintf(fp, "_eintrcnt:\n\n");
                    164:        fprintf(fp, "\t.text\n");
                    165: }

unix.superglobalmegacorp.com

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