/* Copyright (c) 1990 by Sozobon, Limited. Authors: Johann Ruegg, Don Dugger * * Permission is granted to anyone to use this software for any purpose * on any computer system, and to redistribute it freely, with the * following restrictions: * 1) No charge may be made other than reasonable charges for reproduction. * 2) Modified versions must be clearly marked as such. * 3) The authors are not responsible for any harmful consequences * of using this software, even if they result from defects in it. * * trace.c */ #include <setjmp.h> #include "adb.h" #define IN_TRACE #include "lang.h" extern int trap2 (), trap3 (), trap4 (), trap5 (), trap6 (), trap7 (), trap8 (), trap9 (), trapx (); int myvecs; int running; int lasttrap; struct vlist { int number; int (*vector) (); long oldv; } vlist[] = { { 2, trap2 }, { 3, trap3 }, { 4, trap4 }, { 5, trap5 }, { 6, trap6 }, { 7, trap7 }, { 8, trap8 }, { 9, trap9 }, {0x102, trapx }, { 0, 0 } }; jmp_buf xqt_buf; extern jmp_buf trp_buf; long ptrace (req, pid, addr, data) int req, pid; long *addr; long data; { extern struct regs regs[]; extern int xqt (); extern long gemdos (); switch (req) { case RD_TEXT: case RD_DATA: if ((int) addr & (sizeof (data) - 1)) return (-1); data = *addr; return (data); case WR_TEXT: case WR_DATA: if ((int) addr & (sizeof (data) - 1)) return (-1); *addr = data; return (data); case SSTEP: *(regs[SR].value) = (*(regs[SR].value) & ~TBITS) | ITRACE; xqt (); return (0); case CONTINUE: *(regs[SR].value) = *(regs[SR].value) & ~TBITS; xqt (); return (0); case START_DBG: return (0); case RD_USER: case WR_USER: return (-1); } return (-1); } xqt () { running = 1; if (setjmp (xqt_buf) == 0) go (); running = 0; return; } int detail, be_instr; long be_addr; prbuserr () { prtf ("trap: %s\n", tnm[lasttrap]); prtf ("%s %c ", fcnm[detail & 7], (detail & 0x10) ? 'r' : 'w'); if (detail & 8) /* prt("(not instr) "); */ prt (M1); /* prtf("addr %I instr %i\n", */ prtf (M2, be_addr, be_instr); } trap (type, sr, pc) unsigned int type, sr; unsigned long pc; { extern struct regs regs[]; if (!running) { /* prt("internal trap: "); */ prt (M3); prt (tnm[type]); putchr ('\n'); longjmp (trp_buf, 1); } *(regs[SR].value) = (unsigned long) sr; *(regs[PC].value) = pc; lasttrap = type; longjmp (xqt_buf, 1); } vects () { long bios (); struct vlist *vp; vp = vlist; while (vp->number) { vp->oldv = bios (5, vp->number, vp->vector); vp++; } myvecs = 1; } oldvects () { struct vlist *vp; if (!myvecs) return; vp = vlist; while (vp->number) { bios (5, vp->number, vp->oldv); vp++; } myvecs = 0; }