|
|
1.1 root 1: /*
2: * Make the uba interrupt file ubglue.s
3: * mkubglue.c 1.4 81/05/22
4: */
5: #include <stdio.h>
6: #include "config.h"
7: #include "y.tab.h"
8:
9: ubglue()
10: {
11: register FILE *fp;
12: register struct device *dp, *mp;
13:
14: fp = fopen(LOCAL("ubglue.s"), "w");
15: if (fp == NULL) {
16: perror(LOCAL("ubglue.s"));
17: exit(1);
18: }
19: for (dp = dtab ; dp != NULL; dp = dp->d_next)
20: {
21: mp = dp->d_conn;
22: if (mp != NULL && mp != TO_NEXUS && !eq(mp->d_name, "mba"))
23: {
24: struct idlst *id, *id2;
25: for (id = dp->d_vec; id; id = id->id_next) {
26: for (id2 = dp->d_vec; id2; id2 = id2->id_next) {
27: if (id2 == id) {
28: if (machine == MACHINE_VAX)
29: vax_vec(fp, id->id, dp->d_unit);
30: else if (machine == MACHINE_SUN2 ||
31: machine == MACHINE_SUN3)
32: sun_vec(fp, id->id, dp->d_unit);
33: break;
34: }
35: if (!strcmp(id->id, id2->id))
36: break;
37: }
38: }
39: }
40: }
41: fclose(fp);
42: }
43:
44: /*
45: * vax_vec
46: * Print an interrupt vector for the vax
47: */
48: vax_vec(fp, vector, number)
49: register FILE *fp;
50: char *vector;
51: int number;
52: {
53: char nbuf[80];
54: register char *v = nbuf;
55:
56: sprintf(v, "%s%d", vector, number);
57: fprintf(fp, "\t.globl\t_X%s\n\t.align\t2\n_X%s:\n\tpushr\t$0x3f\n", v, v);
58: if (strncmp(vector, "dzx", 3) == 0)
59: fprintf(fp, "\tmovl\t$%d,r0\n\tjbr\t_dzdma\n\n", number);
60: else
61: {
62: fprintf(fp, "\tpushl\t$%d\n", number);
63: fprintf(fp, "\tcalls\t$1,_%s\n\tpopr\t$0x3f\n", vector);
64: /* meter unibus interrupts on 750 and 730 */
65: fprintf(fp, "#if defined(VAX750) || defined(VAXZZ)\n");
66: fprintf(fp, "\tincl\t_cnt+V_INTR\n");
67: fprintf(fp, "#endif\n");
68: fprintf(fp, "\trei\n\n");
69: }
70: }
71:
72: /*
73: * sun_vec
74: * Print an interrupt vector for the sun
75: */
76: sun_vec(fp, vector, number)
77: register FILE *fp;
78: char *vector;
79: int number;
80: {
81: static firsttime = 1;
82:
83: if (firsttime) {
84: fprintf(fp, "#include \"../machine/asm_linkage.h\"\n\n");
85: firsttime = 0;
86: }
87:
88: fprintf(fp, "\tVECINTR(_X%s%d, _%s, _V%s%d)\n",
89: vector, number, vector, vector, number);
90: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.