|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.