NetBSD sync to sth like 970218
authorniklas <niklas@openbsd.org>
Fri, 21 Mar 1997 00:36:34 +0000 (00:36 +0000)
committerniklas <niklas@openbsd.org>
Fri, 21 Mar 1997 00:36:34 +0000 (00:36 +0000)
sys/arch/m68k/conf/files.m68k
sys/arch/m68k/include/db_machdep.h
sys/arch/m68k/include/frame.h
sys/arch/m68k/m68k/db_interface.c
sys/arch/m68k/m68k/db_trace.c
sys/arch/m68k/m68k/kgdb_m68k.c [new file with mode: 0644]

index 112c229..553db89 100644 (file)
@@ -1,10 +1,11 @@
-#       $OpenBSD: files.m68k,v 1.5 1997/02/10 11:11:46 downsj Exp $
-#       $NetBSD: files.m68k,v 1.15 1997/02/02 06:55:15 thorpej Exp $
+#       $OpenBSD: files.m68k,v 1.6 1997/03/21 00:36:34 niklas Exp $
+#       $NetBSD: files.m68k,v 1.16 1997/02/12 01:01:07 gwr Exp $
 #
 file   arch/m68k/m68k/db_disasm.c              ddb
 file   arch/m68k/m68k/db_interface.c           ddb
 file   arch/m68k/m68k/db_trace.c               ddb
 file   arch/m68k/m68k/in_cksum.c               inet
+file   arch/m68k/m68k/kgdb_m68k.c              kgdb
 file   arch/m68k/m68k/mappedcopy.c             mappedcopy
 file   arch/m68k/m68k/ns_cksum.c               ns
 file   arch/m68k/m68k/oc_cksum.s               inet
index 607f4e7..de29071 100644 (file)
@@ -1,5 +1,5 @@
-/*     $OpenBSD: db_machdep.h,v 1.3 1997/01/19 13:53:09 niklas Exp $   */
-/*     $NetBSD: db_machdep.h,v 1.14 1997/01/15 23:11:46 gwr Exp $      */
+/*     $OpenBSD: db_machdep.h,v 1.4 1997/03/21 00:36:36 niklas Exp $   */
+/*     $NetBSD: db_machdep.h,v 1.19 1997/02/18 22:29:58 gwr Exp $      */
 
 /* 
  * Mach Operating System
 #ifndef        _M68K_DB_MACHDEP_H_
 #define        _M68K_DB_MACHDEP_H_
 
-#include <vm/vm_prot.h>
+#include <sys/types.h>
+
+/*
+ * XXX - Would rather not pull in vm headers, but need boolean_t,
+ * at least until boolean_t moves to <sys/types.h> or someplace.
+ */
 #include <vm/vm_param.h>
-#include <vm/vm_inherit.h>
-#include <vm/lock.h>
+
+#include <machine/frame.h>
 #include <machine/psl.h>
 #include <machine/trap.h>
 
 typedef        vm_offset_t     db_addr_t;      /* address - unsigned */
-typedef        int             db_expr_t;      /* expression - signed */
-struct mc68020_saved_state {
-       int             d0;             /* data registers */
-       int             d1;
-       int             d2;
-       int             d3;
-       int             d4;
-       int             d5;
-       int             d6;
-       int             d7;
-       int             a0;             /* address registers */
-       int             a1;
-       int             a2;
-       int             a3;
-       int             a4;
-       int             a5;
-       int             a6;
-       int             sp;             /* stack pointer */
-       short           empty;
-       short           stackadj;
-       unsigned short  sr;             /* status register */
-       unsigned int    pc;             /* program counter - UNALIGNED!!! */
-       unsigned short  stkfmt  : 4;    /* rte stack frame format */
-       unsigned short  vector  : 12;   /* vector number */
-};
-typedef struct mc68020_saved_state db_regs_t;
-db_regs_t      ddb_regs;               /* register state */
+typedef        long            db_expr_t;      /* expression - signed */
+typedef struct trapframe db_regs_t;
+
+extern db_regs_t       ddb_regs;       /* register state */
 #define DDB_REGS       (&ddb_regs)
 
-#define        PC_REGS(regs)   ((db_addr_t)(regs)->pc)
+#define        PC_REGS(regs)   ((db_addr_t)(regs)->tf_pc)
 
 #define        BKPT_INST       0x4e4f          /* breakpoint instruction */
 #define        BKPT_SIZE       (2)             /* size of breakpoint inst */
 #define        BKPT_SET(inst)  (BKPT_INST)
 
-#define        FIXUP_PC_AFTER_BREAK    ddb_regs.pc -= 2;
+#define        FIXUP_PC_AFTER_BREAK(regs)      ((regs)->tf_pc -= BKPT_SIZE)
 
-#define SR_T1 0x8000
-#define        db_clear_single_step(regs)      ((regs)->sr &= ~SR_T1)
-#define        db_set_single_step(regs)        ((regs)->sr |=  SR_T1)
+#define        db_clear_single_step(regs)      ((regs)->tf_sr &= ~PSL_T)
+#define        db_set_single_step(regs)        ((regs)->tf_sr |=  PSL_T)
 
 #define        IS_BREAKPOINT_TRAP(type, code)  ((type) == T_BREAKPOINT)
 #ifdef T_WATCHPOINT
@@ -105,10 +86,19 @@ db_regs_t  ddb_regs;               /* register state */
 #define inst_load(ins)         0
 #define inst_store(ins)                0
 
+/*
+ * Things needed by kgdb:
+ */
+typedef long kgdb_reg_t;
+#define KGDB_NUMREGS   (16+2)
+#define KGDB_BUFLEN    512
+
+
 #ifdef _KERNEL
 
+void   Debugger __P((void));   /* XXX */
 void   kdb_kintr __P((db_regs_t *));
-int    kdb_trap __P((int, db_regs_t *));
+int    kdb_trap __P((int, db_regs_t *));
 
 #endif /* _KERNEL */
 
index 56c652b..95d3a1e 100644 (file)
@@ -1,5 +1,5 @@
-/*     $OpenBSD: frame.h,v 1.3 1996/05/29 11:31:24 niklas Exp $        */
-/*     $NetBSD: frame.h,v 1.12 1996/05/16 16:51:30 is Exp $    */
+/*     $OpenBSD: frame.h,v 1.4 1997/03/21 00:36:37 niklas Exp $        */
+/*     $NetBSD: frame.h,v 1.13 1997/01/27 22:58:45 gwr Exp $   */
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -43,6 +43,9 @@
  *     @(#)frame.h     8.1 (Berkeley) 6/10/93
  */
 
+#ifndef        _M68K_FRAME_H_
+#define        _M68K_FRAME_H_
+
 struct frame {
        struct trapframe {
                int     tf_regs[16];
@@ -306,3 +309,5 @@ struct fpframe060 {
 
        u_long  fpf6_upper, fpf6_lower;
 };
+
+#endif /* _M68K_FRAME_H_ */
index d60392b..cb6cf6b 100644 (file)
@@ -1,5 +1,5 @@
-/*     $OpenBSD: db_interface.c,v 1.8 1997/01/19 13:53:11 niklas Exp $ */
-/*     $NetBSD: db_interface.c,v 1.23 1997/01/15 23:11:47 gwr Exp $    */
+/*     $OpenBSD: db_interface.c,v 1.9 1997/03/21 00:36:39 niklas Exp $ */
+/*     $NetBSD: db_interface.c,v 1.24 1997/02/18 22:27:32 gwr Exp $    */
 
 /* 
  * Mach Operating System
@@ -50,6 +50,7 @@
 extern label_t *db_recover;
 
 int    db_active = 0;
+db_regs_t      ddb_regs;
 
 static void kdbprinttrap __P((int, int));
 
index 7ede327..75f1e50 100644 (file)
@@ -1,5 +1,5 @@
-/*     $OpenBSD: db_trace.c,v 1.7 1997/01/19 13:53:11 niklas Exp $     */
-/*     $NetBSD: db_trace.c,v 1.17 1997/01/15 23:11:48 gwr Exp $        */
+/*     $OpenBSD: db_trace.c,v 1.8 1997/03/21 00:36:40 niklas Exp $     */
+/*     $NetBSD: db_trace.c,v 1.20 1997/02/05 05:10:25 scottr Exp $     */
 
 /* 
  * Mach Operating System
@@ -47,24 +47,27 @@ extern label_t      *db_recover;
 static int db_var_short __P((struct db_variable *, db_expr_t *, int));
 
 struct db_variable db_regs[] = {
-       { "d0", (int *)&ddb_regs.d0,    FCN_NULL },
-       { "d1", (int *)&ddb_regs.d1,    FCN_NULL },
-       { "d2", (int *)&ddb_regs.d2,    FCN_NULL },
-       { "d3", (int *)&ddb_regs.d3,    FCN_NULL },
-       { "d4", (int *)&ddb_regs.d4,    FCN_NULL },
-       { "d5", (int *)&ddb_regs.d5,    FCN_NULL },
-       { "d6", (int *)&ddb_regs.d6,    FCN_NULL },
-       { "d7", (int *)&ddb_regs.d7,    FCN_NULL },
-       { "a0", (int *)&ddb_regs.a0,    FCN_NULL },
-       { "a1", (int *)&ddb_regs.a1,    FCN_NULL },
-       { "a2", (int *)&ddb_regs.a2,    FCN_NULL },
-       { "a3", (int *)&ddb_regs.a3,    FCN_NULL },
-       { "a4", (int *)&ddb_regs.a4,    FCN_NULL },
-       { "a5", (int *)&ddb_regs.a5,    FCN_NULL },
-       { "a6", (int *)&ddb_regs.a6,    FCN_NULL },
-       { "sp", (int *)&ddb_regs.sp,    FCN_NULL },
-       { "pc", (int *)&ddb_regs.pc,    FCN_NULL },
-       { "sr", (int *)&ddb_regs.sr,    db_var_short }
+       /* D0-D7 */
+       { "d0", (long *)&ddb_regs.tf_regs[0],   FCN_NULL },
+       { "d1", (long *)&ddb_regs.tf_regs[1],   FCN_NULL },
+       { "d2", (long *)&ddb_regs.tf_regs[2],   FCN_NULL },
+       { "d3", (long *)&ddb_regs.tf_regs[3],   FCN_NULL },
+       { "d4", (long *)&ddb_regs.tf_regs[4],   FCN_NULL },
+       { "d5", (long *)&ddb_regs.tf_regs[5],   FCN_NULL },
+       { "d6", (long *)&ddb_regs.tf_regs[6],   FCN_NULL },
+       { "d7", (long *)&ddb_regs.tf_regs[7],   FCN_NULL },
+       /* A0-A7 */
+       { "a0", (long *)&ddb_regs.tf_regs[8+0], FCN_NULL },
+       { "a1", (long *)&ddb_regs.tf_regs[8+1], FCN_NULL },
+       { "a2", (long *)&ddb_regs.tf_regs[8+2], FCN_NULL },
+       { "a3", (long *)&ddb_regs.tf_regs[8+3], FCN_NULL },
+       { "a4", (long *)&ddb_regs.tf_regs[8+4], FCN_NULL },
+       { "a5", (long *)&ddb_regs.tf_regs[8+5], FCN_NULL },
+       { "a6", (long *)&ddb_regs.tf_regs[8+6], FCN_NULL },
+       { "sp", (long *)&ddb_regs.tf_regs[8+7], FCN_NULL },
+       /* misc. */
+       { "pc", (long *)&ddb_regs.tf_pc,        FCN_NULL },
+       { "sr", (long *)&ddb_regs.tf_sr,        db_var_short }
 };
 struct db_variable *db_eregs = db_regs + sizeof(db_regs)/sizeof(db_regs[0]);
 
@@ -125,23 +128,16 @@ stacktop(regs, sp)
        register db_regs_t *regs;
        register struct stackpos *sp;
 {
-       sp->k_regloc[0]  = (int) &regs->d0;
-       sp->k_regloc[1]  = (int) &regs->d1;
-       sp->k_regloc[2]  = (int) &regs->d2;
-       sp->k_regloc[3]  = (int) &regs->d3;
-       sp->k_regloc[4]  = (int) &regs->d4;
-       sp->k_regloc[5]  = (int) &regs->d5;
-       sp->k_regloc[6]  = (int) &regs->d6;
-       sp->k_regloc[7]  = (int) &regs->d7;
-       sp->k_regloc[8]  = (int) &regs->a0;
-       sp->k_regloc[9]  = (int) &regs->a1;
-       sp->k_regloc[10] = (int) &regs->a2;
-       sp->k_regloc[11] = (int) &regs->a3;
-       sp->k_regloc[12] = (int) &regs->a4;
-       sp->k_regloc[13] = (int) &regs->a5;
-
-       sp->k_fp = get(&regs->a6, 0);
-       sp->k_pc = get(&regs->pc, 0);
+       int i;
+
+       /* Note: leave out a6, a7 */
+       for (i = 0; i < (8+6); i++) {
+               sp->k_regloc[i] = (int) &regs->tf_regs[i];
+       }
+
+       sp->k_fp = get(&regs->tf_regs[8+6], 0);
+       /* skip sp (a7) */
+       sp->k_pc = get(&regs->tf_pc, 0);
        sp->k_flags = 0;
 
        findentry(sp);
@@ -478,7 +474,8 @@ db_stack_trace_cmd(addr, have_addr, count, modif)
        db_expr_t       count;
        char            *modif;
 {
-       int i, val, nargs;
+       int i, nargs;
+       long val;
        db_addr_t       regp;
        char *          name;
        struct stackpos pos;
@@ -509,7 +506,7 @@ db_stack_trace_cmd(addr, have_addr, count, modif)
                
                t_pcb = (pcb_t) get(&th->pcb, 0);
                user_regs = (db_regs_t *)
-               get(&t_pcb->user_regs, 0);
+                       get(&t_pcb->user_regs, 0);
                
                stacktop(user_regs, &pos);
 
@@ -544,7 +541,7 @@ db_stack_trace_cmd(addr, have_addr, count, modif)
                db_printf("%s", name);
                if (pos.k_entry != MAXINT && name) {
                        char *  entry_name;
-                       int     e_val;
+                       long    e_val;
 
                        db_find_sym_and_offset(pos.k_entry, &entry_name,
                            &e_val);
@@ -557,7 +554,7 @@ db_stack_trace_cmd(addr, have_addr, count, modif)
                regp = pos.k_fp + FR_SAVFP + 4;
                if ((nargs = pos.k_nargs)) {
                        while (nargs--) {
-                               db_printf("%x", get(regp += 4, DSP));
+                               db_printf("%lx", get(regp += 4, DSP));
                                if (nargs)
                                        db_printf(",");
                        }
@@ -565,7 +562,7 @@ db_stack_trace_cmd(addr, have_addr, count, modif)
                if (val == MAXINT)
                        db_printf(") at %x\n", pos.k_pc);
                else
-                       db_printf(") + %x\n", val);
+                       db_printf(") + %lx\n", val);
 
                /*
                 * Stop tracing if frame ptr no longer points into kernel
diff --git a/sys/arch/m68k/m68k/kgdb_m68k.c b/sys/arch/m68k/m68k/kgdb_m68k.c
new file mode 100644 (file)
index 0000000..9862baf
--- /dev/null
@@ -0,0 +1,154 @@
+/*     $OpenBSD: kgdb_m68k.c,v 1.1 1997/03/21 00:36:41 niklas Exp $    */
+/*     $NetBSD: kgdb_m68k.c,v 1.1 1997/02/12 00:58:01 gwr Exp $        */
+
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Lawrence Berkeley Laboratories.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)kgdb_stub.c 8.4 (Berkeley) 1/12/94
+ */
+
+/*
+ * Machine-dependent (m68k) part of the KGDB remote "stub"
+ */
+
+#include <sys/param.h>
+#include <sys/kgdb.h>
+
+#include <machine/frame.h>
+#include <machine/trap.h>
+
+/*
+ * Translate a trap number into a unix compatible signal value.
+ * (gdb only understands unix signal numbers).
+ */
+int 
+kgdb_signal(type)
+       int type;
+{
+       int sigval;
+
+       switch (type) {
+
+       case T_ASTFLT:
+       case T_SSIR:
+               sigval = SIGINT;
+               break;
+
+       case T_ILLINST:
+       case T_PRIVINST:
+       case T_FMTERR:
+               sigval = SIGILL;
+               break;
+
+       case T_TRACE:
+       case T_TRAP15:
+               sigval = SIGTRAP;
+               break;
+
+       case T_ZERODIV:
+       case T_CHKINST:
+       case T_TRAPVINST:
+       case T_FPERR:
+       case T_COPERR:
+               sigval = SIGFPE;
+               break;
+
+       case T_BUSERR:
+       case T_ADDRERR:
+               sigval = SIGBUS;
+               break;
+
+       case T_MMUFLT:
+               sigval = SIGSEGV;
+               break;
+
+       default:
+               sigval = SIGEMT;
+               break;
+       }
+       return (sigval);
+}
+
+/*
+ * Definitions exported from gdb.
+ */
+/* KGDB_NUMREGS == 18 */
+
+#define GDB_SR 16
+#define GDB_PC 17
+
+
+/*
+ * Translate the values stored in the kernel regs struct to/from
+ * the format understood by gdb.
+ *
+ * There is a short pad word between SP (A7) and SR which keeps the
+ * kernel stack long word aligned (note that this is in addition to
+ * the stack adjust short that we treat as the upper half of the SR
+ * (always zero).  We must skip this when copying to/from gdb regs.
+ */
+
+void
+kgdb_getregs(regs, gdb_regs)
+       db_regs_t *regs;
+       kgdb_reg_t *gdb_regs;
+{
+       int i;
+
+       for (i = 0; i < 16; i++)
+           gdb_regs[i]  = regs->tf_regs[i];
+       gdb_regs[GDB_SR] = regs->tf_sr;
+       gdb_regs[GDB_PC] = regs->tf_pc;
+}
+
+void
+kgdb_setregs(regs, gdb_regs)
+       db_regs_t *regs;
+       kgdb_reg_t *gdb_regs;
+{
+       int i;
+
+       for (i = 0; i < 16; i++)
+               regs->tf_regs[i] = gdb_regs[i];
+       regs->tf_sr = gdb_regs[GDB_SR] |
+               (regs->tf_sr & PSL_T);
+       regs->tf_pc = gdb_regs[GDB_PC];
+}