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) 05/08/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 } 166