13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <ctype.h>
43e12c5d1SDavid du Colombier #include <bio.h>
5bd389b36SDavid du Colombier #include <mach.h>
63e12c5d1SDavid du Colombier #define Extern extern
73e12c5d1SDavid du Colombier #include "sparc.h"
83e12c5d1SDavid du Colombier
93e12c5d1SDavid du Colombier void
dobplist(void)103e12c5d1SDavid du Colombier dobplist(void)
113e12c5d1SDavid du Colombier {
123e12c5d1SDavid du Colombier Breakpoint *b;
13*219b2ee8SDavid du Colombier char buf[512];
143e12c5d1SDavid du Colombier
153e12c5d1SDavid du Colombier for(b = bplist; b; b = b->next) {
163e12c5d1SDavid du Colombier switch(b->type) {
173e12c5d1SDavid du Colombier case Instruction:
183e12c5d1SDavid du Colombier Bprint(bioout, "0x%lux,%d:b %d done, at ", b->addr, b->count, b->done);
19*219b2ee8SDavid du Colombier symoff(buf, sizeof(buf), b->addr, CTEXT);
20*219b2ee8SDavid du Colombier Bprint(bioout, "%s", buf);
213e12c5d1SDavid du Colombier break;
223e12c5d1SDavid du Colombier
233e12c5d1SDavid du Colombier case Access:
243e12c5d1SDavid du Colombier Bprint(bioout, "0x%lux,%d:ba %d done, at ", b->addr, b->count, b->done);
25*219b2ee8SDavid du Colombier symoff(buf, sizeof(buf), b->addr, CDATA);
26*219b2ee8SDavid du Colombier Bprint(bioout, "%s", buf);
273e12c5d1SDavid du Colombier break;
283e12c5d1SDavid du Colombier
293e12c5d1SDavid du Colombier case Read:
303e12c5d1SDavid du Colombier Bprint(bioout, "0x%lux,%d:br %d done, at ", b->addr, b->count, b->done);
31*219b2ee8SDavid du Colombier symoff(buf, sizeof(buf), b->addr, CDATA);
32*219b2ee8SDavid du Colombier Bprint(bioout, "%s", buf);
333e12c5d1SDavid du Colombier break;
343e12c5d1SDavid du Colombier
353e12c5d1SDavid du Colombier case Write:
363e12c5d1SDavid du Colombier Bprint(bioout, "0x%lux,%d:bw %d done, at ", b->addr, b->count, b->done);
37*219b2ee8SDavid du Colombier symoff(buf, sizeof(buf), b->addr, CDATA);
38*219b2ee8SDavid du Colombier Bprint(bioout, "%s", buf);
393e12c5d1SDavid du Colombier break;
403e12c5d1SDavid du Colombier
413e12c5d1SDavid du Colombier case Equal:
423e12c5d1SDavid du Colombier Bprint(bioout, "0x%lux,%d:be at ", b->addr, b->count);
43*219b2ee8SDavid du Colombier symoff(buf, sizeof(buf), b->addr, CDATA);
44*219b2ee8SDavid du Colombier Bprint(bioout, "%s", buf);
453e12c5d1SDavid du Colombier break;
463e12c5d1SDavid du Colombier }
473e12c5d1SDavid du Colombier Bprint(bioout, "\n");
483e12c5d1SDavid du Colombier }
493e12c5d1SDavid du Colombier }
503e12c5d1SDavid du Colombier
513e12c5d1SDavid du Colombier void
breakpoint(char * addr,char * cp)523e12c5d1SDavid du Colombier breakpoint(char *addr, char *cp)
533e12c5d1SDavid du Colombier {
543e12c5d1SDavid du Colombier Breakpoint *b;
553e12c5d1SDavid du Colombier int type;
563e12c5d1SDavid du Colombier
573e12c5d1SDavid du Colombier cp = nextc(cp);
583e12c5d1SDavid du Colombier type = Instruction;
593e12c5d1SDavid du Colombier switch(*cp) {
603e12c5d1SDavid du Colombier case 'r':
613e12c5d1SDavid du Colombier membpt++;
623e12c5d1SDavid du Colombier type = Read;
633e12c5d1SDavid du Colombier break;
643e12c5d1SDavid du Colombier case 'a':
653e12c5d1SDavid du Colombier membpt++;
663e12c5d1SDavid du Colombier type = Access;
673e12c5d1SDavid du Colombier break;
683e12c5d1SDavid du Colombier case 'w':
693e12c5d1SDavid du Colombier membpt++;
703e12c5d1SDavid du Colombier type = Write;
713e12c5d1SDavid du Colombier break;
723e12c5d1SDavid du Colombier case 'e':
733e12c5d1SDavid du Colombier membpt++;
743e12c5d1SDavid du Colombier type = Equal;
753e12c5d1SDavid du Colombier break;
763e12c5d1SDavid du Colombier }
773e12c5d1SDavid du Colombier b = emalloc(sizeof(Breakpoint));
783e12c5d1SDavid du Colombier b->addr = expr(addr);
793e12c5d1SDavid du Colombier b->type = type;
803e12c5d1SDavid du Colombier b->count = cmdcount;
813e12c5d1SDavid du Colombier b->done = cmdcount;
823e12c5d1SDavid du Colombier
833e12c5d1SDavid du Colombier b->next = bplist;
843e12c5d1SDavid du Colombier bplist = b;
853e12c5d1SDavid du Colombier }
863e12c5d1SDavid du Colombier
873e12c5d1SDavid du Colombier void
delbpt(char * addr)883e12c5d1SDavid du Colombier delbpt(char *addr)
893e12c5d1SDavid du Colombier {
903e12c5d1SDavid du Colombier Breakpoint *b, **l;
913e12c5d1SDavid du Colombier ulong baddr;
923e12c5d1SDavid du Colombier
933e12c5d1SDavid du Colombier baddr = expr(addr);
943e12c5d1SDavid du Colombier l = &bplist;
953e12c5d1SDavid du Colombier for(b = *l; b; b = b->next) {
963e12c5d1SDavid du Colombier if(b->addr == baddr) {
973e12c5d1SDavid du Colombier if(b->type != Instruction)
983e12c5d1SDavid du Colombier membpt++;
993e12c5d1SDavid du Colombier *l = b->next;
1003e12c5d1SDavid du Colombier free(b);
1013e12c5d1SDavid du Colombier return;
1023e12c5d1SDavid du Colombier }
1033e12c5d1SDavid du Colombier l = &b->next;
1043e12c5d1SDavid du Colombier }
1053e12c5d1SDavid du Colombier
1063e12c5d1SDavid du Colombier Bprint(bioout, "no breakpoint\n");
1073e12c5d1SDavid du Colombier }
1083e12c5d1SDavid du Colombier
1093e12c5d1SDavid du Colombier void
brkchk(ulong addr,int type)1103e12c5d1SDavid du Colombier brkchk(ulong addr, int type)
1113e12c5d1SDavid du Colombier {
1123e12c5d1SDavid du Colombier Breakpoint *b;
1133e12c5d1SDavid du Colombier
1143e12c5d1SDavid du Colombier for(b = bplist; b; b = b->next) {
1153e12c5d1SDavid du Colombier if(b->addr == addr && (b->type&type)) {
1163e12c5d1SDavid du Colombier if(b->type == Equal && getmem_4(addr) == b->count) {
1173e12c5d1SDavid du Colombier count = 1;
1183e12c5d1SDavid du Colombier atbpt = 1;
1193e12c5d1SDavid du Colombier return;
1203e12c5d1SDavid du Colombier }
1213e12c5d1SDavid du Colombier if(--b->done == 0) {
1223e12c5d1SDavid du Colombier b->done = b->count;
1233e12c5d1SDavid du Colombier count = 1;
1243e12c5d1SDavid du Colombier atbpt = 1;
1253e12c5d1SDavid du Colombier return;
1263e12c5d1SDavid du Colombier }
1273e12c5d1SDavid du Colombier }
1283e12c5d1SDavid du Colombier }
1293e12c5d1SDavid du Colombier }
130