1 #include <u.h> 2 #include <libc.h> 3 #include <ctype.h> 4 #include <bio.h> 5 #include <mach.h> 6 #define Extern extern 7 #include "power.h" 8 9 void 10 dobplist(void) 11 { 12 Breakpoint *b; 13 char buf[512]; 14 15 for(b = bplist; b; b = b->next) { 16 switch(b->type) { 17 case Instruction: 18 Bprint(bioout, "0x%lux,%d:b %d done, at ", b->addr, b->count, b->done); 19 symoff(buf, sizeof(buf), b->addr, CTEXT); 20 Bprint(bioout, "%s", buf); 21 break; 22 23 case Access: 24 Bprint(bioout, "0x%lux,%d:ba %d done, at ", b->addr, b->count, b->done); 25 symoff(buf, sizeof(buf), b->addr, CDATA); 26 Bprint(bioout, "%s", buf); 27 break; 28 29 case Read: 30 Bprint(bioout, "0x%lux,%d:br %d done, at ", b->addr, b->count, b->done); 31 symoff(buf, sizeof(buf), b->addr, CDATA); 32 Bprint(bioout, "%s", buf); 33 break; 34 35 case Write: 36 Bprint(bioout, "0x%lux,%d:bw %d done, at ", b->addr, b->count, b->done); 37 symoff(buf, sizeof(buf), b->addr, CDATA); 38 Bprint(bioout, "%s", buf); 39 break; 40 41 case Equal: 42 Bprint(bioout, "0x%lux,%d:be at ", b->addr, b->count); 43 symoff(buf, sizeof(buf), b->addr, CDATA); 44 Bprint(bioout, "%s", buf); 45 break; 46 } 47 Bprint(bioout, "\n"); 48 } 49 } 50 51 void 52 breakpoint(char *addr, char *cp) 53 { 54 Breakpoint *b; 55 int type; 56 57 cp = nextc(cp); 58 type = Instruction; 59 switch(*cp) { 60 case 'r': 61 membpt++; 62 type = Read; 63 break; 64 case 'a': 65 membpt++; 66 type = Access; 67 break; 68 case 'w': 69 membpt++; 70 type = Write; 71 break; 72 case 'e': 73 membpt++; 74 type = Equal; 75 break; 76 } 77 b = emalloc(sizeof(Breakpoint)); 78 b->addr = expr(addr); 79 b->type = type; 80 b->count = cmdcount; 81 b->done = cmdcount; 82 83 b->next = bplist; 84 bplist = b; 85 } 86 87 void 88 delbpt(char *addr) 89 { 90 Breakpoint *b, **l; 91 ulong baddr; 92 93 baddr = expr(addr); 94 l = &bplist; 95 for(b = *l; b; b = b->next) { 96 if(b->addr == baddr) { 97 if(b->type != Instruction) 98 membpt++; 99 *l = b->next; 100 free(b); 101 return; 102 } 103 l = &b->next; 104 } 105 106 Bprint(bioout, "no breakpoint\n"); 107 } 108 109 void 110 brkchk(ulong addr, int type) 111 { 112 Breakpoint *b; 113 114 for(b = bplist; b; b = b->next) { 115 if(b->addr == addr && (b->type&type)) { 116 if(b->type == Equal && getmem_4(addr) == b->count) { 117 count = 1; 118 atbpt = 1; 119 return; 120 } 121 if(--b->done == 0) { 122 b->done = b->count; 123 count = 1; 124 atbpt = 1; 125 return; 126 } 127 } 128 } 129 } 130