|
|
1.1 root 1: /*
2: * write system control block
3: */
4:
5: #include <libc.h>
6: #include "mkconf.h"
7:
8: #define SVSIZE 4 /* size of an scb vector */
9:
10: writlow(f)
11: char *f;
12: {
13: int fd;
14: register Scb *sp;
15: register int ssize;
16: register int i;
17: register Dev *dp;
18:
19: if ((fd = creat(f, 0666)) < 0) {
20: perror(f);
21: exit(1);
22: }
23: /*
24: * system control block
25: */
26: fprint(fd, "\t.text\n\t.align 9\n\t.set INTSTACK,1\n");
27: fprint(fd, "\t.globl\tscb\nscb:\n");
28: for (ssize = 0, sp = llist; sp; ssize = sp->offset+SVSIZE, sp = sp->next) {
29: for (; ssize < sp->offset; ssize += SVSIZE)
30: fprint(fd, "\t.long straycatch+0x%x+INTSTACK\n", ssize);
31: fprint(fd, "\t.long %s%s\n", sp->name, sp->type == SINTR ? "+INTSTACK" : "");
32: }
33: while ((ssize & 0x1fc) != 0) {
34: fprint(fd, "\t.long straycatch+0x%x+INTSTACK\n", ssize);
35: ssize += SVSIZE;
36: }
37: /*
38: * stray catching stuff
39: */
40: fprint(fd, "\t.globl\tstraycatch\nstraycatch:\n");
41: for (i = 0; i < ssize; i += SVSIZE)
42: fprint(fd, "\t.align 2; bsbw stray\n");
43: /*
44: * trampoline, because assembler can't cope with global bsbw
45: */
46: fprint(fd, "stray:\tjmp Xstray\n");
47: /*
48: * interface routines
49: */
50: for (dp = dlist; dp; dp = dp->next)
51: (*acode[dp->mdev->atype].putvec)(fd, dp);
52: close(fd);
53: }
54:
55: stdputvec(fd, dp, name, ix)
56: int fd;
57: Dev *dp;
58: char *name;
59: int ix;
60: {
61: Mdev *mp;
62:
63: mp = dp->mdev;
64: if (mp->flags & FRAWVEC)
65: return;
66: fprint(fd, "\t.align 2\n.globl _%s%dint\n%s:\n", mp->tag, ix, name);
67: fprint(fd, "\tpushr\t$0x3f\n");
68: if (dp->id == 0)
69: fprint(fd, "\tclrl\t-(sp)\n");
70: else
71: fprint(fd, "\tpushl\t$%d\n", dp->id);
72: fprint(fd, "\tcalls\t$1,_%s%dint\n", mp->tag, ix);
73: fprint(fd, "\tpopr\t$0x3f\n\trei\n");
74: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.