|
|
1.1 root 1: #include "../h/rt.h"
2: #ifdef VAX
3: /*
4: * create - return an entry block for a co-expression.
5: */
6:
7: create(nargs, arg1)
8: int nargs;
9: struct descrip arg1;
10: {
11: register int *ap, *sp, *tp;
12: register struct descrip *dp;
13: register struct b_estack *ep;
14: register struct b_eblock *hp;
15: int na, nl, *r5, i, j, *newap;
16: extern interp();
17: extern struct b_estack *alcestk();
18: extern struct b_eblock *alceblk();
19:
20: SetBound;
21: if (QUAL(arg1) || TYPE(arg1) != T_INTEGER)
22: syserr("create: illegal entry point");
23:
24: /*
25: * Get a new co-expression stack and initialize activator, result
26: * count, and stack base.
27: */
28: esneed();
29: ep = alcestk();
30: ep->activator = nulldesc;
31: ep->nresults = 0;
32: ep->sbase = sp = (int *)ep;
33: /*
34: * Move hardware ap of calling function into the variable ap.
35: */
36: asm(" addl3 8(fp),$4,r11");
37: /*
38: * Calculate number of arguments and number of local variables.
39: */
40: na = *ap;
41: tp = ap + 1 + (2 * na);
42: nl = ((struct descrip *)tp)->value.bptr->proc.ndynam;
43:
44: /*
45: * Get a new co-expression heap block. Note that the "+ 1" in
46: * na + nl + 1 is for arg0, the calling procedure.
47: */
48: hneed(sizeof(struct b_eblock) + (na + nl + 1) * sizeof(struct descrip));
49: hp = alceblk(INTVAL(arg1),na,nl);
50: ep->freshblk.type = D_EBLOCK;
51: BLKLOC(ep->freshblk) = (union block *) hp;
52:
53: /*
54: * Copy arguments into refresh block. dp starts at arg0 and works down.
55: */
56: dp = (struct descrip *) ((int *)(ap + 1 + (2 * na)));
57: i = 0;
58: hp->elems[0] = *dp--;
59: j = na;
60: while (j-- > 0) {
61: hp->elems[++i] = *dp--;
62: }
63:
64: /*
65: * Copy arguments into new stack. This is more painful than copying
66: * into the refresh block because the arguments are copied a word
67: * at a time. tp starts at the high word of arg0 and goes down.
68: */
69: tp = ap + 2 + (2 * na);
70: *--sp = *tp--;
71: *--sp = *tp--;
72: j = na;
73: while (j-- > 0) {
74: *--sp = *tp--;
75: *--sp = *tp--;
76: }
77:
78: /*
79: * Set up original procedure frame in new stack.
80: */
81: *--sp = *tp--; /* copy nargs */
82: *--sp = *tp; /* copy nwords (argc) */
83: newap = sp; /* and save a pointer to it. */
84: *--sp = 0; /* return pc */
85: *--sp = 0; /* saved r5 (frame pointer) */
86: *--sp = 0; /* saved ap */
87: *--sp = 0; /* psw/reg. mask */
88: *--sp = 0; /* condition handler */
89: r5 = sp; /* and save a pointer to it */
90: *--sp = line; /* saved line number */
91: *--sp = (int) file; /* saved file name */
92:
93: /*
94: * Copy local variables into new stack. The asm sets tp to the
95: * address of the start of local region in caller's procedure frame.
96: */
97: asm(" addl3 12(fp),$-12,r9");
98: j = nl;
99: while (j-- > 0) {
100: *--sp = *tp--;
101: *--sp = *tp--;
102: }
103: /*
104: * Copy local variables into the refresh block. The asm sets dp to
105: * the address of the first local.
106: */
107: asm(" addl3 12(fp),$-16,r8");
108: j = nl;
109: while (j-- > 0)
110: hp->elems[++i] = *dp--;
111:
112: /*
113: * Set up dummy call to coact.
114: */
115: *--sp = nulldesc.type; /* place for result */
116: *--sp = INTVAL(nulldesc);
117: *--sp = nulldesc.type; /* place for activate coexpr */
118: *--sp = INTVAL(nulldesc);
119: *--sp = 1; /* nargs */
120: *--sp = 3; /* 3 longwords in nargs */
121: tp = sp; /* save pointer to start of arg
122: list in this frame */
123: *--sp = INTVAL(arg1); /* saved r9 (coexpr entry point) */
124: *--sp = (int) interp; /* return pc */
125: *--sp = (int) r5; /* saved r5 */
126: *--sp = (int) newap; /* saved ap */
127: *--sp = 0x02000000; /* psw/reg mask with bit set to
128: restore r9, the ipc */
129: *--sp = 0; /* condition handler */
130: ep->boundary = sp; /* (initial boundary) */
131: *--sp = line; /* saved line number */
132: *--sp = (int) file; /* saved file name */
133: ep->sp = sp; /* initial stack pointer */
134: ep->ap = tp; /* initial arg. pointer */
135:
136: /*
137: * Return the new co-expression.
138: */
139: arg1.type = D_ESTACK;
140: BLKLOC(arg1) = (union block *) ep;
141: ClearBound;
142: }
143: #endif VAX
144: #ifdef PORT
145: create()
146: {
147: syserr("Attempt to create a co-expression");
148: }
149: #endif PORT
150:
151: #ifdef PDP11
152: /*
153: * create - return an entry block for a co-expression
154: *
155: * NOTE: this code is highly dependent on stack frame layout.
156: */
157:
158: create(nargs, arg1)
159: int nargs;
160: struct descrip arg1;
161: {
162: register int *ap, *sp;
163: register struct b_estack *ep;
164: register struct b_eblock *hp;
165: int na, nl, *r5, i;
166: extern interp();
167: extern struct b_estack *alcestk();
168: extern struct b_eblock *alceblk();
169:
170: if (QUAL(arg1) || TYPE(arg1) != T_INTEGER)
171: syserr("create: illegal entry point");
172:
173: esneed(); /* check for room in stack space */
174: ep = alcestk(); /* allocate expression stack */
175: ep->activator = nulldesc;
176: ep->nresults = 0;
177:
178: ep->sbase = sp = (int *)ep; /* initialize new stack pointer */
179: ap = (int *)*(&nargs-2) + 2; /* find nargs of caller */
180: na = *ap; /* get value of nargs */
181: ap += 1 + 2 * na; /* find arg0 of caller */
182: nl = ((struct descrip *)ap)->value.bptr->proc.ndynam; /* get # locals */
183:
184: hneed(sizeof(struct b_eblock) + (na + nl + 1) * sizeof(struct descrip));
185: hp = alceblk(INTVAL(arg1),na,nl); /* allocate refresh block */
186: ep->freshblk.type = D_EBLOCK;
187: BLKLOC(ep->freshblk) = (union block *) hp;
188:
189: /* copy arguments into new stack and refresh block */
190: i = 0;
191: hp->elems[i] = *--(struct descrip *)sp = *(struct descrip *)ap;
192: while (na-- > 0)
193: hp->elems[++i] = *--(struct descrip *)sp = *--(struct descrip *)ap;
194:
195: /* set up original procedure frame in new stack */
196: *--sp = *--ap; /* copy nargs */
197: *--sp = 0; /* return pc */
198: *--sp = 0; /* saved r5 */
199: r5 = sp; /* (save its address) */
200: *--sp = 0; /* saved r4 */
201: *--sp = 0; /* saved r3 */
202: *--sp = 0; /* saved r2 */
203: *--sp = line; /* saved line number */
204: *--sp = (int) file; /* saved file name */
205:
206: /* copy local variables into new stack */
207: ap -= 7;
208: while (nl-- > 0)
209: hp->elems[++i] = *--(struct descrip *)sp = *--(struct descrip *)ap;
210:
211: /* set up dummy call to coact */
212: *--(struct descrip *)sp = nulldesc; /* place for result */
213: *--(struct descrip *)sp = nulldesc; /* place for activate coexpr */
214: /* these values are the initial register state for the co-expression */
215: *--sp = 1; /* nargs */
216: *--sp = (int) interp; /* return pc */
217: *--sp = (int) r5; /* saved r5 */
218: ep->boundary = sp; /* (initial boundary) */
219: *--sp = 0; /* saved r4 */
220: *--sp = 0; /* saved r3 */
221: *--sp = INTVAL(arg1); /* saved r2 (coexpr entry point) */
222: *--sp = line; /* saved line number */
223: *--sp = (int) file; /* saved file name */
224: ep->sp = sp; /* initial stack pointer */
225: arg1.type = D_ESTACK;
226: BLKLOC(arg1) = (union block *) ep;
227: }
228: #endif PDP11
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.