13 for(i = 0; i < p->n; i++){
21 if(ins == 0) continue;
40 if(a >= nregs || b >= nregs || c >= nregs || c == 0)
45 if(c >= nregs || c == 0)
52 if(a >= nregs || b >= nregs || i + 1 + c >= p->n)
56 if(a >= nregs || b != 0 || c != 0)
60 if(a >= DTNVARS || b >= nregs)
65 if(a >= nregs || b == 0 || b > 64 || c >= nregs)
68 default: goto invalid;
71 if(p->n == 0 || p->b[p->n - 1] >> 24 != DTE_RET){
72 werrstr("must end with RET");
78 werrstr("invalid instruction %#.8ux @ %#.4ux", ins, i);
83 dtgverify(DTChan *, DTActGr *g)
87 if(g->pred != nil && dteverify(g->pred) < 0)
89 for(i = 0; i < g->nact; i++)
90 switch(g->acts[i].type){
92 if(g->acts[i].p == nil || dteverify(g->acts[i].p) < 0 || (uint)g->acts[i].size > 8)
96 if(g->acts[i].p == nil || dteverify(g->acts[i].p) < 0 || (uint)g->acts[i].size > DTRECMAX)
100 if(g->acts[i].p == nil || dteverify(g->acts[i].p) < 0 || (uint)g->acts[i].size > 8)
102 if(i == g->nact - 1 || g->acts[i+1].type != ACTAGGVAL || g->acts[i+1].agg.id != g->acts[i].agg.id)
106 if(g->acts[i].p == nil || dteverify(g->acts[i].p) < 0 || (uint)g->acts[i].size > 8)
108 if(i == 0 || g->acts[i-1].type != ACTAGGKEY)
110 if(dtaunpackid(&g->acts[i].agg) < 0)
114 if(g->acts[i].p == nil || dteverify(g->acts[i].p) < 0)
126 dteexec(DTExpr *p, DTTrigInfo *info, s64int *retv)
140 case DTE_ADD: R[c] = R[a] + R[b]; break;
141 case DTE_SUB: R[c] = R[a] - R[b]; break;
142 case DTE_MUL: R[c] = R[a] * R[b]; break;
143 case DTE_SDIV: if(R[b] == 0) goto div0; R[c] = R[a] / R[b]; break;
144 case DTE_SMOD: if(R[b] == 0) goto div0; R[c] = R[a] % R[b]; break;
145 case DTE_UDIV: if(R[b] == 0) goto div0; R[c] = (uvlong)R[a] / (uvlong)R[b]; break;
146 case DTE_UMOD: if(R[b] == 0) goto div0; R[c] = (uvlong)R[a] % (uvlong)R[b]; break;
147 case DTE_AND: R[c] = R[a] & R[b]; break;
148 case DTE_OR: R[c] = R[a] | R[b]; break;
149 case DTE_XOR: R[c] = R[a] ^ R[b]; break;
150 case DTE_XNOR: R[c] = ~(R[a] ^ R[b]); break;
151 case DTE_LDI: R[c] = (s64int)ins << 40 >> 54 << (ins >> 8 & 63); break;
152 case DTE_XORI: R[c] ^= (s64int)ins << 40 >> 54 << (ins >> 8 & 63); break;
154 if((u64int)R[b] >= 64)
160 if((u64int)R[b] >= 64)
163 R[c] = (u64int)R[a] >> R[b];
166 if((u64int)R[b] >= 64)
171 case DTE_SEQ: R[c] = R[a] == R[b]; break;
172 case DTE_SNE: R[c] = R[a] != R[b]; break;
173 case DTE_SLT: R[c] = R[a] < R[b]; break;
174 case DTE_SLE: R[c] = R[a] <= R[b]; break;
175 case DTE_BEQ: if(R[a] == R[b]) i += c; break;
176 case DTE_BNE: if(R[a] != R[b]) i += c; break;
177 case DTE_BLT: if(R[a] < R[b]) i += c; break;
178 case DTE_BLE: if(R[a] <= R[b]) i += c; break;
191 R[b] = info->arg[a - DTV_ARG0];
193 case DTV_TIME: R[b] = info->ts; break;
194 case DTV_MACHNO: R[b] = info->machno; break;
199 case DTE_ZXT: R[c] = (uvlong)R[a] << 64 - b >> 64 - b; break;
200 case DTE_SXT: R[c] = (vlong)R[a] << 64 - b >> 64 - b; break;
201 case DTE_RET: *retv = R[a]; return 0;
206 snprint(info->ch->errstr, sizeof(info->ch->errstr), "division by zero");
211 dtpeekstr(uvlong addr, u8int *v, int len)
215 for(i = 0; i < len; i++){
216 if(addr + i < addr || dtpeek(addr + i, &v[i], 1) < 0){
224 memset(&v[i], 0, len - i);
228 #define PUT1(c) *bp++ = c;
229 #define PUT2(c) *bp++ = c; *bp++ = c >> 8;
230 #define PUT4(c) *bp++ = c; *bp++ = c >> 8; *bp++ = c >> 16; *bp++ = c >> 24;
231 #define PUT8(c) PUT4(c); PUT4(c>>32);
234 dtcfault(DTTrigInfo *info, int type, char *fmt, ...)
244 b = info->ch->wrbufs[info->machno];
247 for(s = fmt; *s != 0; s++)
249 case 'i': n += 4; break;
250 case 'p': n += 8; break;
255 if(b->wr + n > DTBUFSZ)
257 bp = &b->data[b->wr];
265 for(s = fmt; *s != 0; s++)
272 q = (uintptr) va_arg(va, void *);
277 assert(bp - b->data - b->wr == n);
278 b->wr = bp - b->data;
283 dtgexec(DTActGr *g, DTTrigInfo *info)
291 b = g->chan->wrbufs[info->machno];
292 if(b->wr + g->reclen > DTBUFSZ)
295 if(dteexec(g->pred, info, &v) < 0)
300 bp = &b->data[b->wr];
303 for(i = 0; i < g->nact; i++){
304 if(g->acts[i].type == ACTCANCEL)
306 if(dteexec(g->acts[i].p, info, &v) < 0)
308 switch(g->acts[i].type){
310 for(j = 0; j < g->acts[i].size; j++){
316 if(dtpeekstr(v, bp, g->acts[i].size) < 0){
317 dtcfault(info, DTFILL, "ip", dtgetvar(DTV_PID), v);
320 bp += g->acts[i].size;
323 for(j = 0; j < g->acts[i].size; j++){
329 dtarecord(g->chan, info->machno, &g->acts[i].agg, aggkey, g->acts[i-1].size, v);
333 assert(bp - b->data - b->wr == g->reclen);
334 b->wr = bp - b->data;
339 dtptrigger(DTProbe *p, int machno, DTTrigInfo *info)
345 info->machno = machno;
346 for(e = p->enablist.probnext; e != &p->enablist; e = e->probnext)
347 if(e->gr->chan->state == DTCGO){
348 info->ch = e->gr->chan;
349 info->epid = e->epid;
350 if(dtgexec(e->gr, info) < 0)
351 e->gr->chan->state = DTCFAULT;
353 dtmachunlock(machno);