summaryrefslogtreecommitdiff
path: root/sys/src/libdtracy
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2018-12-11 09:20:34 +0000
committeraiju <devnull@localhost>2018-12-11 09:20:34 +0000
commit40d6302b5f289ad8a617d12fa911197dddafc634 (patch)
tree28de7f2afdfe0c7239a08e6aa8fdfe6924ee1d8c /sys/src/libdtracy
parenta6517fb4984458d6f5ce4864a408c5057d15306d (diff)
forgotten files
Diffstat (limited to 'sys/src/libdtracy')
-rw-r--r--sys/src/libdtracy/prog.c53
1 files changed, 51 insertions, 2 deletions
diff --git a/sys/src/libdtracy/prog.c b/sys/src/libdtracy/prog.c
index f0637acad..402638f13 100644
--- a/sys/src/libdtracy/prog.c
+++ b/sys/src/libdtracy/prog.c
@@ -230,6 +230,55 @@ dtpeekstr(uvlong addr, u8int *v, int len)
#define PUT4(c) *bp++ = c; *bp++ = c >> 8; *bp++ = c >> 16; *bp++ = c >> 24;
#define PUT8(c) PUT4(c); PUT4(c>>32);
+int
+dtcfault(DTTrigInfo *info, int type, char *fmt, ...)
+{
+ DTBuf *b;
+ va_list va;
+ int n;
+ char *s;
+ u8int *bp;
+ u32int l;
+ uvlong q;
+
+ b = info->ch->wrbufs[info->machno];
+ n = 20;
+ va_start(va, fmt);
+ for(s = fmt; *s != 0; s++)
+ switch(*s){
+ case 'i': n += 4; break;
+ case 'p': n += 8; break;
+ default:
+ assert(0);
+ }
+ va_end(va);
+ if(b->wr + n > DTBUFSZ)
+ return -1;
+ bp = &b->data[b->wr];
+ PUT4(-1);
+ PUT8(info->ts);
+ PUT1(type);
+ PUT2(n);
+ PUT1(0);
+ PUT4(info->epid);
+ va_start(va, fmt);
+ for(s = fmt; *s != 0; s++)
+ switch(*s){
+ case 'i':
+ l = va_arg(va, int);
+ PUT4(l);
+ break;
+ case 'p':
+ q = (uintptr) va_arg(va, void *);
+ PUT8(q);
+ break;
+ }
+ va_end(va);
+ assert(bp - b->data - b->wr == n);
+ b->wr = bp - b->data;
+ return 0;
+}
+
static int
dtgexec(DTActGr *g, DTTrigInfo *info)
{
@@ -265,8 +314,8 @@ dtgexec(DTActGr *g, DTTrigInfo *info)
break;
case ACTTRACESTR:
if(dtpeekstr(v, bp, g->acts[i].size) < 0){
- snprint(info->ch->errstr, sizeof(info->ch->errstr), "fault @ %#llux", v);
- return -1;
+ dtcfault(info, DTFILL, "ip", dtgetvar(DTV_PID), v);
+ return 0;
}
bp += g->acts[i].size;
break;