home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / program / compiler / szadb21b / source / src / trace.c < prev    next >
C/C++ Source or Header  |  1990-05-16  |  3KB  |  161 lines

  1. /* Copyright (c) 1990 by Sozobon, Limited.  Authors: Johann Ruegg, Don Dugger
  2.  *
  3.  * Permission is granted to anyone to use this software for any purpose
  4.  * on any computer system, and to redistribute it freely, with the
  5.  * following restrictions:
  6.  * 1) No charge may be made other than reasonable charges for reproduction.
  7.  * 2) Modified versions must be clearly marked as such.
  8.  * 3) The authors are not responsible for any harmful consequences
  9.  *    of using this software, even if they result from defects in it.
  10.  *
  11.  *    trace.c
  12.  */
  13.  
  14. #include <setjmp.h>
  15. #include "adb.h"
  16.  
  17. #define IN_TRACE
  18. #include "lang.h"
  19.  
  20. extern int 
  21. trap2 (), trap3 (), trap4 (), trap5 (), trap6 (),
  22. trap7 (), trap8 (), trap9 (), trapx ();
  23.  
  24. int             myvecs;
  25. int             running;
  26. int             lasttrap;
  27.  
  28. struct vlist {
  29.     int             number;
  30.     int             (*vector) ();
  31.     long            oldv;
  32. }               vlist[] = {
  33.  
  34.     {    2, trap2   },
  35.     {    3, trap3   },
  36.     {    4, trap4   },
  37.     {    5, trap5   },
  38.     {    6, trap6   },
  39.     {    7, trap7   },
  40.     {    8, trap8   },
  41.     {    9, trap9   },
  42.     {0x102, trapx  },
  43.     {    0, 0       }
  44. };
  45.  
  46. jmp_buf         xqt_buf;
  47. extern jmp_buf  trp_buf;
  48.  
  49. long
  50. ptrace (req, pid, addr, data)
  51.     int             req, pid;
  52.     long           *addr;
  53.     long            data;
  54. {
  55.     extern struct regs regs[];
  56.     extern int      xqt ();
  57.     extern long     gemdos ();
  58.  
  59.     switch (req) {
  60.  
  61.     case RD_TEXT:
  62.     case RD_DATA:
  63.     if ((int) addr & (sizeof (data) - 1))
  64.         return (-1);
  65.     data = *addr;
  66.     return (data);
  67.     case WR_TEXT:
  68.     case WR_DATA:
  69.     if ((int) addr & (sizeof (data) - 1))
  70.         return (-1);
  71.     *addr = data;
  72.     return (data);
  73.     case SSTEP:
  74.     *(regs[SR].value) = (*(regs[SR].value) & ~TBITS) | ITRACE;
  75.     xqt ();
  76.     return (0);
  77.     case CONTINUE:
  78.     *(regs[SR].value) = *(regs[SR].value) & ~TBITS;
  79.     xqt ();
  80.     return (0);
  81.     case START_DBG:
  82.     return (0);
  83.     case RD_USER:
  84.     case WR_USER:
  85.     return (-1);
  86.  
  87.     }
  88.     return (-1);
  89. }
  90.  
  91. xqt ()
  92. {
  93.     running = 1;
  94.     if (setjmp (xqt_buf) == 0)
  95.     go ();
  96.     running = 0;
  97.     return;
  98. }
  99.  
  100. int             detail, be_instr;
  101. long            be_addr;
  102.  
  103. prbuserr ()
  104. {
  105.     prtf ("trap: %s\n", tnm[lasttrap]);
  106.     prtf ("%s %c ", fcnm[detail & 7],
  107.       (detail & 0x10) ? 'r' : 'w');
  108.     if (detail & 8)
  109. /*        prt("(not instr) ");    */
  110.     prt (M1);
  111. /*    prtf("addr %I instr %i\n",    */
  112.     prtf (M2,
  113.       be_addr, be_instr);
  114. }
  115.  
  116. trap (type, sr, pc)
  117.     unsigned int    type, sr;
  118.     unsigned long   pc;
  119. {
  120.     extern struct regs regs[];
  121.  
  122.     if (!running) {
  123. /*        prt("internal trap: ");    */
  124.     prt (M3);
  125.     prt (tnm[type]);
  126.     putchr ('\n');
  127.     longjmp (trp_buf, 1);
  128.     }
  129.     *(regs[SR].value) = (unsigned long) sr;
  130.     *(regs[PC].value) = pc;
  131.     lasttrap = type;
  132.     longjmp (xqt_buf, 1);
  133. }
  134.  
  135. vects ()
  136. {
  137.     long            bios ();
  138.     struct vlist   *vp;
  139.  
  140.     vp = vlist;
  141.     while (vp->number) {
  142.     vp->oldv = bios (5, vp->number, vp->vector);
  143.     vp++;
  144.     }
  145.     myvecs = 1;
  146. }
  147.  
  148. oldvects ()
  149. {
  150.     struct vlist   *vp;
  151.  
  152.     if (!myvecs)
  153.     return;
  154.     vp = vlist;
  155.     while (vp->number) {
  156.     bios (5, vp->number, vp->oldv);
  157.     vp++;
  158.     }
  159.     myvecs = 0;
  160. }
  161.