diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/ki/bpt.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/ki/bpt.c')
-rwxr-xr-x | sys/src/cmd/ki/bpt.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/sys/src/cmd/ki/bpt.c b/sys/src/cmd/ki/bpt.c new file mode 100755 index 000000000..6647034a5 --- /dev/null +++ b/sys/src/cmd/ki/bpt.c @@ -0,0 +1,129 @@ +#include <u.h> +#include <libc.h> +#include <ctype.h> +#include <bio.h> +#include <mach.h> +#define Extern extern +#include "sparc.h" + +void +dobplist(void) +{ + Breakpoint *b; + char buf[512]; + + for(b = bplist; b; b = b->next) { + switch(b->type) { + case Instruction: + Bprint(bioout, "0x%lux,%d:b %d done, at ", b->addr, b->count, b->done); + symoff(buf, sizeof(buf), b->addr, CTEXT); + Bprint(bioout, "%s", buf); + break; + + case Access: + Bprint(bioout, "0x%lux,%d:ba %d done, at ", b->addr, b->count, b->done); + symoff(buf, sizeof(buf), b->addr, CDATA); + Bprint(bioout, "%s", buf); + break; + + case Read: + Bprint(bioout, "0x%lux,%d:br %d done, at ", b->addr, b->count, b->done); + symoff(buf, sizeof(buf), b->addr, CDATA); + Bprint(bioout, "%s", buf); + break; + + case Write: + Bprint(bioout, "0x%lux,%d:bw %d done, at ", b->addr, b->count, b->done); + symoff(buf, sizeof(buf), b->addr, CDATA); + Bprint(bioout, "%s", buf); + break; + + case Equal: + Bprint(bioout, "0x%lux,%d:be at ", b->addr, b->count); + symoff(buf, sizeof(buf), b->addr, CDATA); + Bprint(bioout, "%s", buf); + break; + } + Bprint(bioout, "\n"); + } +} + +void +breakpoint(char *addr, char *cp) +{ + Breakpoint *b; + int type; + + cp = nextc(cp); + type = Instruction; + switch(*cp) { + case 'r': + membpt++; + type = Read; + break; + case 'a': + membpt++; + type = Access; + break; + case 'w': + membpt++; + type = Write; + break; + case 'e': + membpt++; + type = Equal; + break; + } + b = emalloc(sizeof(Breakpoint)); + b->addr = expr(addr); + b->type = type; + b->count = cmdcount; + b->done = cmdcount; + + b->next = bplist; + bplist = b; +} + +void +delbpt(char *addr) +{ + Breakpoint *b, **l; + ulong baddr; + + baddr = expr(addr); + l = &bplist; + for(b = *l; b; b = b->next) { + if(b->addr == baddr) { + if(b->type != Instruction) + membpt++; + *l = b->next; + free(b); + return; + } + l = &b->next; + } + + Bprint(bioout, "no breakpoint\n"); +} + +void +brkchk(ulong addr, int type) +{ + Breakpoint *b; + + for(b = bplist; b; b = b->next) { + if(b->addr == addr && (b->type&type)) { + if(b->type == Equal && getmem_4(addr) == b->count) { + count = 1; + atbpt = 1; + return; + } + if(--b->done == 0) { + b->done = b->count; + count = 1; + atbpt = 1; + return; + } + } + } +} |