diff options
author | aiju <devnull@localhost> | 2018-12-11 09:20:34 +0000 |
---|---|---|
committer | aiju <devnull@localhost> | 2018-12-11 09:20:34 +0000 |
commit | 40d6302b5f289ad8a617d12fa911197dddafc634 (patch) | |
tree | 28de7f2afdfe0c7239a08e6aa8fdfe6924ee1d8c /sys/src/cmd/dtracy/act.c | |
parent | a6517fb4984458d6f5ce4864a408c5057d15306d (diff) |
forgotten files
Diffstat (limited to 'sys/src/cmd/dtracy/act.c')
-rw-r--r-- | sys/src/cmd/dtracy/act.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/sys/src/cmd/dtracy/act.c b/sys/src/cmd/dtracy/act.c index 063be6cb9..3412382c3 100644 --- a/sys/src/cmd/dtracy/act.c +++ b/sys/src/cmd/dtracy/act.c @@ -462,6 +462,34 @@ parseclause(Clause *cl, uchar *p, uchar *e, Enab *en, Biobuf *bp) return 0; } +uchar * +parsefault(uchar *p0, uchar *e) +{ + uchar *p; + u32int epid; + u8int type, dummy; + u16int n; + Enab *en; + + p = unpack(p0, e, "csci", &type, &n, &dummy, &epid); + if(p == nil) return nil; + en = epidlookup(epid); + switch(type){ + case DTFILL: { + u32int pid; + u64int addr; + + p = unpack(p, e, "iv", &pid, &addr); + if(p == nil) return nil; + fprint(2, "dtracy: illegal access: probe=%s, pid=%d, addr=%#llx\n", en != nil ? en->probe : nil, pid, addr); + break; + } + default: + fprint(2, "dtracy: unknown fault type %#.2ux\n", type); + } + return p0 + n - 12; +} + int parsebuf(uchar *p, int n, Biobuf *bp) { @@ -474,6 +502,11 @@ parsebuf(uchar *p, int n, Biobuf *bp) while(p < e){ p = unpack(p, e, "iv", &epid, &ts); if(p == nil) goto err; + if(epid == (u32int)-1){ + p = parsefault(p, e); + if(p == nil) goto err; + continue; + } en = epidlookup(epid); if(en == nil) goto err; if(parseclause(en->cl, p - 12, p + en->reclen - 12, en, bp) < 0) return -1; |