home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / amiga / os / machsun3.tz / machsun3 / mk.kernel / sun3 / db_interface.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-15  |  4.9 KB  |  243 lines

  1. /* 
  2.  * Mach Operating System
  3.  * Copyright (c) 1992 Carnegie Mellon University
  4.  * All Rights Reserved.
  5.  * 
  6.  * Permission to use, copy, modify and distribute this software and its
  7.  * documentation is hereby granted, provided that both the copyright
  8.  * notice and this permission notice appear in all copies of the
  9.  * software, derivative works or modified versions, and any portions
  10.  * thereof, and that both notices appear in supporting documentation.
  11.  * 
  12.  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
  13.  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
  14.  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
  15.  * 
  16.  * Carnegie Mellon requests users of this software to return to
  17.  * 
  18.  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
  19.  *  School of Computer Science
  20.  *  Carnegie Mellon University
  21.  *  Pittsburgh PA 15213-3890
  22.  * 
  23.  * any improvements or extensions that they make and grant Carnegie Mellon 
  24.  * the rights to redistribute these changes.
  25.  */
  26. /*
  27.  * HISTORY
  28.  * $Log:    db_interface.c,v $
  29.  * Revision 2.6  92/01/03  20:31:01  dbg
  30.  *     Ignore RB_KDB - always enter DDB.
  31.  *     [91/11/06            dbg]
  32.  * 
  33.  * Revision 2.5  91/07/31  18:12:50  dbg
  34.  *     Stack switching support.
  35.  *     [91/07/12            dbg]
  36.  * 
  37.  * Revision 2.4  91/03/16  14:58:16  rpd
  38.  *     Replaced db_nofault with db_recover.
  39.  *     [91/03/14            rpd]
  40.  * 
  41.  * Revision 2.3  90/10/25  14:47:16  rwd
  42.  *     Added watchpoint support.
  43.  *     [90/10/16            rwd]
  44.  * 
  45.  * Revision 2.2  90/08/27  22:11:17  dbg
  46.  *     Reduce lint.
  47.  *     [90/08/07            dbg]
  48.  *     Created.
  49.  *     [90/07/25            dbg]
  50.  * 
  51.  */
  52.  
  53. /*
  54.  * Interface to new debugger.
  55.  */
  56. #include <sys/reboot.h>
  57.  
  58. #include <sun3/pmap.h>
  59. #include <sun3/thread.h>
  60. #include <sun3/db_machdep.h>
  61. #include <sun3/machparam.h>
  62. #include <sun3/setjmp.h>
  63.  
  64. #include <mach/vm_param.h>
  65. #include <mach/exception.h>
  66.  
  67. #include <kern/thread.h>
  68.  
  69. int    db_active = 0;
  70.  
  71. /*
  72.  * Received keyboard interrupt sequence.
  73.  */
  74. kdb_kintr()
  75. {
  76.     if (db_active == 0) {
  77.  
  78.         extern void softcall(), enter_kdb();
  79.         /*
  80.          * Schedule a software interrupt to get to KDB.
  81.          */
  82.         current_thread()->pcb->flag &= ~TRACE_AST;
  83.         current_thread()->pcb->flag |= TRACE_KDB;
  84.         softcall(enter_kdb, (char *)0);
  85.     }
  86. }
  87.  
  88. /*
  89.  *  kdb_trap - field a TRACE or BPT trap
  90.  */
  91.  
  92. extern jmp_buf_t *db_recover;
  93.  
  94. kdb_trap(type, regs)
  95.     int    type;
  96.     register struct mc68020_saved_state *regs;
  97. {
  98.     switch (type)
  99.     {
  100.     case T_TRACE:    /* single-step */
  101.     case T_BRKPT:    /* breakpoint */
  102.         case T_WATCHPOINT:
  103.         break;
  104.     case EXC_BREAKPOINT:
  105.         type = T_BRKPT;
  106.         break;
  107.  
  108.     default:
  109.     {
  110.         kdbprinttrap(type, 0);
  111.         if (db_recover != 0) {
  112.         db_printf("Caught exception in ddb.\n");
  113.         db_error("");
  114.         /*NOTREACHED*/
  115.         }
  116.     }
  117.     }
  118.  
  119.     /*  Should switch to kdb's own stack here. */
  120.  
  121.     ddb_regs = *regs;
  122.  
  123.     db_active++;
  124.     cnpollc(TRUE);
  125.     (void) setvideoenable(1);
  126.  
  127.     db_trap(type, 0);
  128.  
  129.     cnpollc(FALSE);
  130.     db_active--;
  131.  
  132.     *regs = ddb_regs;
  133.  
  134.     /*
  135.      * Indicate that single_step is for KDB.
  136.      * But lock out interrupts to prevent TRACE_KDB from setting the
  137.      * trace bit in the current SR (and trapping while exiting KDB).
  138.      */
  139.     (void) spl7();
  140. /*
  141.     if (!USERMODE(regs->sr) && (regs->sr & SR_T1) && (current_thread())) {
  142.     current_thread()->pcb->pcb_flag |= TRACE_KDB;
  143. */
  144.     if ((regs->sr & SR_T1) && (current_thread())) {
  145.     current_thread()->pcb->flag |= TRACE_KDB;
  146.     }
  147.  
  148.     return(1);
  149. }
  150.  
  151. extern char *    trap_type[];
  152. extern int    TRAP_TYPES;
  153.  
  154. /*
  155.  * Print trap reason.
  156.  */
  157. kdbprinttrap(type, code)
  158.     int    type, code;
  159. {
  160.     printf("kernel: ");
  161.     if (type >= TRAP_TYPES || type < 0)
  162.         printf("type %d", type);
  163.     else
  164.         printf("%s", trap_type[type]);
  165.     printf(" trap\n");
  166. }
  167.  
  168. /*
  169.  * Read bytes from kernel address space for debugger.
  170.  */
  171.  
  172. extern jmp_buf_t    db_jmpbuf;
  173.  
  174. void
  175. db_read_bytes(addr, size, data)
  176.     vm_offset_t    addr;
  177.     register int    size;
  178.     register char    *data;
  179. {
  180.     register char    *src;
  181.  
  182.     src = (char *)addr;
  183.     while (--size >= 0)
  184.         *data++ = *src++;
  185. }
  186.  
  187. /*
  188.  * Write bytes to kernel address space for debugger.
  189.  */
  190. void
  191. db_write_bytes(addr, size, data)
  192.     vm_offset_t    addr;
  193.     register int    size;
  194.     register char    *data;
  195. {
  196.     register char    *dst;
  197.  
  198.     int        oldmap0 = 0;
  199.     int        oldmap1 = 0;
  200.     vm_offset_t    addr1;
  201.     extern char    etext;
  202.  
  203.     if (addr >= VM_MIN_KERNEL_ADDRESS &&
  204.         addr <= (vm_offset_t)&etext)
  205.     {
  206.         oldmap0 = getpgmap(addr);
  207. #ifdef    SUN3_260
  208.         vac_pageflush((char *)addr);
  209. #endif
  210.         setpgmap(addr, (oldmap0 & ~PG_PROT) | PG_KW);
  211.  
  212.         addr1 = sun_trunc_page(addr + size - 1);
  213.         if (sun_trunc_page(addr) != addr1) {
  214.         /* data crosses a page boundary */
  215.  
  216.         oldmap1 = getpgmap(addr1);
  217. #ifdef    SUN3_260
  218.         vac_pageflush((char *)addr1);
  219. #endif
  220.         setpgmap(addr1, (oldmap1 & ~PG_PROT) | PG_KW);
  221.         }
  222.     }
  223.  
  224.     dst = (char *)addr;
  225.  
  226.     while (--size >= 0)
  227.         *dst++ = *data++;
  228.  
  229.     if (oldmap0) {
  230. #ifdef    SUN3_260
  231.         vac_pageflush((char *)addr);
  232. #endif
  233.         setpgmap(addr, oldmap0);
  234.         if (oldmap1) {
  235. #ifdef    SUN3_260
  236.         vac_pageflush((char *)addr1);
  237. #endif
  238.         setpgmap(addr1, oldmap1);
  239.         }
  240.     }
  241. }
  242.  
  243.