|
|
1.1 ! root 1: /* Copyright (c) 1982 Regents of the University of California */ ! 2: ! 3: static char sccsid[] = "@(#)setbp.c 1.1 1/18/82"; ! 4: ! 5: /* ! 6: * Breakpoint/machine interface. ! 7: */ ! 8: ! 9: #include "defs.h" ! 10: #include <signal.h> ! 11: #include "machine.h" ! 12: #include "process.h" ! 13: #include "main.h" ! 14: #include "pxops.h" ! 15: #include "process/process.rep" ! 16: ! 17: #define BP_OP O_BPT /* breakpoint trap */ ! 18: #define BP_ERRNO SIGILL /* signal received at a breakpoint */ ! 19: ! 20: /* ! 21: * Setting a breakpoint at a location consists of saving ! 22: * the half-word at the location and poking a BP_OP there. ! 23: * ! 24: * We save the locations and half-words on a list for use in unsetting. ! 25: */ ! 26: ! 27: typedef struct savelist SAVELIST; ! 28: ! 29: struct savelist { ! 30: ADDRESS location; ! 31: short save; ! 32: short refcount; ! 33: SAVELIST *link; ! 34: }; ! 35: ! 36: LOCAL SAVELIST *savelist; ! 37: ! 38: /* ! 39: * Set a breakpoint at the given address. Only save the half-word there ! 40: * if it's not already a breakpoint. ! 41: */ ! 42: ! 43: setbp(addr) ! 44: ADDRESS addr; ! 45: { ! 46: short w; ! 47: short save; ! 48: register SAVELIST *newsave, *s; ! 49: ! 50: if (option('b')) { ! 51: printf("setting breakpoint at %d\n", addr); ! 52: fflush(stdout); ! 53: } ! 54: for (s = savelist; s != NIL; s = s->link) { ! 55: if (s->location == addr) { ! 56: s->refcount++; ! 57: return; ! 58: } ! 59: } ! 60: iread(&save, addr, sizeof(save)); ! 61: newsave = alloc(1, SAVELIST); ! 62: newsave->location = addr; ! 63: newsave->save = save; ! 64: newsave->refcount = 1; ! 65: newsave->link = savelist; ! 66: savelist = newsave; ! 67: w = BP_OP; ! 68: iwrite(&w, addr, sizeof(w)); ! 69: } ! 70: ! 71: /* ! 72: * Unset a breakpoint; unfortunately we have to search the SAVELIST ! 73: * to find the saved value. The assumption is that the SAVELIST will ! 74: * usually be quite small. ! 75: */ ! 76: ! 77: unsetbp(addr) ! 78: ADDRESS addr; ! 79: { ! 80: register SAVELIST *s, *prev; ! 81: ! 82: if (option('b')) { ! 83: printf("unsetting breakpoint at %d\n", addr); ! 84: fflush(stdout); ! 85: } ! 86: prev = NIL; ! 87: for (s = savelist; s != NIL; s = s->link) { ! 88: if (s->location == addr) { ! 89: iwrite(&s->save, addr, sizeof(s->save)); ! 90: s->refcount--; ! 91: if (s->refcount == 0) { ! 92: if (prev == NIL) { ! 93: savelist = s->link; ! 94: } else { ! 95: prev->link = s->link; ! 96: } ! 97: dispose(s); ! 98: } ! 99: return; ! 100: } ! 101: prev = s; ! 102: } ! 103: panic("unsetbp: couldn't find address %d", addr); ! 104: } ! 105: ! 106: /* ! 107: * Predicate to test if the reason the process stopped was because ! 108: * of a breakpoint. ! 109: */ ! 110: ! 111: BOOLEAN isbperr() ! 112: { ! 113: register PROCESS *p; ! 114: ! 115: p = process; ! 116: return(p->status==STOPPED && p->signo==BP_ERRNO); ! 117: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.