Switch to building a libgdb and both gdb and kgdb.
authorSimon Schubert <corecode@dragonflybsd.org>
Tue, 7 Mar 2006 15:48:11 +0000 (15:48 +0000)
committerSimon Schubert <corecode@dragonflybsd.org>
Tue, 7 Mar 2006 15:48:11 +0000 (15:48 +0000)
Gdb -k doesn't work anymore and was replaced by kgdb, which was imported in
large parts from FreeBSD.

Add a kernel variable indicating with thread is dumping.

26 files changed:
gnu/usr.bin/gdb/Makefile
gnu/usr.bin/gdb/Makefile.inc
gnu/usr.bin/gdb/gdb/Makefile
gnu/usr.bin/gdb/gdb/kvm-fbsd-i386.h [deleted file]
gnu/usr.bin/gdb/gdb/kvm-fbsd.c [deleted file]
gnu/usr.bin/gdb/kgdb/Makefile [new file with mode: 0644]
gnu/usr.bin/gdb/kgdb/kgdb.1 [new file with mode: 0644]
gnu/usr.bin/gdb/kgdb/kgdb.c [new file with mode: 0644]
gnu/usr.bin/gdb/kgdb/kgdb.h [new file with mode: 0644]
gnu/usr.bin/gdb/kgdb/kthr.c [new file with mode: 0644]
gnu/usr.bin/gdb/kgdb/trgt.c [new file with mode: 0644]
gnu/usr.bin/gdb/kgdb/trgt_i386.c [new file with mode: 0644]
gnu/usr.bin/gdb/libgdb/Makefile [copied from gnu/usr.bin/gdb/gdb/Makefile with 94% similarity]
gnu/usr.bin/gdb/libgdb/Makefile.amd64 [moved from gnu/usr.bin/gdb/gdb/Makefile.amd64 with 78% similarity]
gnu/usr.bin/gdb/libgdb/Makefile.i386 [moved from gnu/usr.bin/gdb/gdb/Makefile.i386 with 63% similarity]
gnu/usr.bin/gdb/libgdb/config.h [moved from gnu/usr.bin/gdb/gdb/config.h with 99% similarity]
gnu/usr.bin/gdb/libgdb/freebsd-uthread.c [moved from gnu/usr.bin/gdb/gdb/freebsd-uthread.c with 99% similarity]
gnu/usr.bin/gdb/libgdb/nm-fbsd.h [moved from gnu/usr.bin/gdb/gdb/nm-fbsd.h with 81% similarity]
gnu/usr.bin/gdb/libgdb/patches/i386bsd-nat.c.patch [moved from gnu/usr.bin/gdb/gdb/patches/i386bsd-nat.c.patch with 86% similarity]
gnu/usr.bin/gdb/libgdb/patches/i386fbsd-nat.c.patch [moved from gnu/usr.bin/gdb/gdb/patches/i386fbsd-nat.c.patch with 80% similarity]
gnu/usr.bin/gdb/libgdb/patches/i386fbsd-tdep.c.patch [moved from gnu/usr.bin/gdb/gdb/patches/i386fbsd-tdep.c.patch with 82% similarity]
gnu/usr.bin/gdb/libgdb/patches/main.c.patch [moved from gnu/usr.bin/gdb/gdb/patches/main.c.patch with 93% similarity]
gnu/usr.bin/gdb/libgdb/patches/target.c.patch [moved from gnu/usr.bin/gdb/gdb/patches/target.c.patch with 76% similarity]
gnu/usr.bin/gdb/libgdb/patches/target.h.patch [moved from gnu/usr.bin/gdb/gdb/patches/target.h.patch with 79% similarity]
gnu/usr.bin/gdb/libgdb/version.c [moved from gnu/usr.bin/gdb/gdb/version.c with 59% similarity]
sys/kern/kern_shutdown.c

index fcde9a0..741478a 100644 (file)
@@ -1,5 +1,5 @@
-# $DragonFly: src/gnu/usr.bin/gdb/Makefile,v 1.1 2004/10/23 17:02:38 joerg Exp $
+# $DragonFly: src/gnu/usr.bin/gdb/Makefile,v 1.2 2006/03/07 15:48:11 corecode Exp $
 
-SUBDIR=        libbfd libiberty libopcodes gdb
+SUBDIR=        libbfd libiberty libopcodes libgdb gdb kgdb
 
-.include <bsd.subdir.mk>
\ No newline at end of file
+.include <bsd.subdir.mk>
index 3125b41..2fee67e 100644 (file)
@@ -1,5 +1,10 @@
-# $DragonFly: src/gnu/usr.bin/gdb/Makefile.inc,v 1.2 2004/10/24 19:17:21 joerg Exp $
+# $DragonFly: src/gnu/usr.bin/gdb/Makefile.inc,v 1.3 2006/03/07 15:48:11 corecode Exp $
 
 BASEDIR=       ${.CURDIR}/${RELATIVE}../../../../contrib/gdb-6.2.1
 
+GDBLIBS+=      ${.OBJDIR}/../libopcodes/libopcodes.a
+GDBLIBS+=      ${.OBJDIR}/../libgdb/libgdb.a
+GDBLIBS+=      ${.OBJDIR}/../libbfd/libbfd.a
+GDBLIBS+=      ${.OBJDIR}/../libiberty/libiberty.a
+
 .include "../Makefile.inc"
index 1740a84..8b26c07 100644 (file)
@@ -1,98 +1,17 @@
-# $DragonFly: src/gnu/usr.bin/gdb/gdb/Makefile,v 1.7 2005/05/07 19:55:31 corecode Exp $
-
-.include "../Makefile.inc"
+# $DragonFly: src/gnu/usr.bin/gdb/gdb/Makefile,v 1.8 2006/03/07 15:48:11 corecode Exp $
 
 PROG=  gdb
-
-SUBDIR=        doc
-
-CONTRIBDIR=    ${BASEDIR}/gdb
-.PATH: ${CONTRIBDIR} ${CONTRIBDIR}/cli ${CONTRIBDIR}/mi ${CONTRIBDIR}/signals
-.PATH: ${CONTRIBDIR}/tui
-
-CFLAGS+= -I${.OBJDIR} -I${.CURDIR} -I${BASEDIR}/include -I${BASEDIR}/bfd
-CFLAGS+= -I${CONTRIBDIR} -I${CONTRIBDIR}/config -I${.CURDIR}/../libbfd
-CFLAGS+= -I${BASEDIR} 
-
-.if defined(GDB_TUI)
-CFLAGS+= -DTUI=1
-SRCS=  tui-main.c
-.else
 SRCS=  gdb.c
-.endif
-
-CLEANFILES+=   nm.h observer.h observer.inc tm.h xm.h
-
-SRCS+= nm.h observer.h tm.h xm.h
 
-# libgdb
-SRCS+= annotate.c arch-utils.c auxv.c ax-gdb.c ax-general.c bcache.c
-SRCS+= bfd-target.c block.c blockframe.c breakpoint.c buildsym.c
-SRCS+= c-exp.y c-lang.c c-typeprint.c c-valprint.c charset.c cli-cmds.c
-SRCS+= cli-decode.c cli-dump.c cli-interp.c cli-logging.c cli-out.c
-SRCS+= cli-script.c cli-setshow.c cli-utils.c coff-pe-read.c coffread.c
-SRCS+= complaints.c completer.c copying.c corefile.c corelow.c cp-abi.c
-SRCS+= cp-namespace.c cp-support.c cp-valprint.c dbxread.c dcache.c demangle.c
-SRCS+= dictionary.c disasm.c doublest.c dummy-frame.c dwarf2-frame.c
-SRCS+= dwarf2expr.c dwarf2loc.c dwarf2read.c dwarfread.c elfread.c environ.c
-SRCS+= eval.c event-loop.c event-top.c exec.c expprint.c f-exp.y f-lang.c
-SRCS+= f-typeprint.c f-valprint.c fbsd-proc.c findvar.c fork-child.c
-SRCS+= frame-base.c frame-unwind.c frame.c gcore.c gdb-events.c gdbarch.c
-SRCS+= gdbtypes.c gnu-v2-abi.c gnu-v3-abi.c hpacc-abi.c inf-loop.c infcall.c
-SRCS+= infcmd.c inflow.c infptrace.c infrun.c inftarg.c init.c interps.c
-SRCS+= jv-exp.y jv-lang.c jv-typeprint.c jv-valprint.c kod-cisco.c kod.c
-SRCS+= language.c linespec.c m2-exp.y m2-lang.c m2-typeprint.c m2-valprint.c
-SRCS+= macrocmd.c macroexp.c macroscope.c macrotab.c main.c maint.c
-SRCS+= mdebugread.c mem-break.c memattr.c mi-cmd-break.c mi-cmd-disas.c
-SRCS+= mi-cmd-env.c mi-cmd-file.c mi-cmd-stack.c mi-cmd-var.c mi-cmds.c
-SRCS+= mi-console.c mi-getopt.c mi-interp.c mi-main.c mi-out.c
-SRCS+= mi-parse.c mi-symbol-cmds.c minsyms.c mipsread.c nlmread.c objc-exp.y
-SRCS+= objc-lang.c objfiles.c observer.c osabi.c p-exp.y p-lang.c
-SRCS+= p-typeprint.c p-valprint.c parse.c printcmd.c regcache.c reggroups.c
-SRCS+= regset.c remote-fileio.c remote-utils.c remote.c scm-exp.c scm-lang.c
-SRCS+= scm-valprint.c sentinel-frame.c ser-pipe.c ser-tcp.c ser-unix.c
-SRCS+= serial.c signals.c solib-legacy.c solib-svr4.c solib.c source.c
-SRCS+= stabsread.c
-SRCS+= stack.c std-regs.c symfile.c symmisc.c symtab.c target.c thread.c
-SRCS+= top.c tracepoint.c trad-frame.c tramp-frame.c typeprint.c
-SRCS+= ui-file.c ui-out.c user-regs.c utils.c valarith.c valops.c valprint.c
-SRCS+= values.c varobj.c version.c wrapper.c
-# tui specific
-.if defined(GDB_TUI)
-SRCS+= tui.c tui-command.c tui-data.c tui-disasm.c tui-file.c tui-hooks.c
-SRCS+= tui-interp.c tui-io.c tui-layout.c tui-out.c tui-regs.c tui-source.c
-SRCS+= tui-stack.c tui-win.c tui-windata.c tui-wingeneral.c tui-winsource.c
-.endif
-# kernel-debugger
-PATCHES!=      echo ${.CURDIR}/patches/*.patch
-SRCS+= freebsd-uthread.c kvm-fbsd.c kvm-fbsd.h ${PATCHES}
+CFLAGS+= -I${.OBJDIR}/../libgdb -I${.CURDIR}/../libgdb -I${BASEDIR}/include
+CFLAGS+= -I${BASEDIR}/bfd -I${BASEDIR}/gdb -I${BASEDIR}/gdb/config -I${.CURDIR}/../libbfd
+CLFAGS+= -I${BASEDIR}
 
 DPADD= ${LIBREADLINE} ${LIBKVM} ${LIBTERMCAP} ${LIBM}
-DPADD+=        ../libbfd/libbfd.a ../libopcodes/libopcodes.a ../libiberty/libiberty.a
+DPADD+=        ${GDBLIBS}
 LDADD= -lreadline -lkvm -ltermcap -lm
-LDADD+=        -L../libbfd -lbfd -L../libopcodes -lopcodes -L../libiberty -liberty
-
-.include "Makefile.${MACHINE_ARCH}"
-
-init.c: ${SRCS:Ninit.c} Makefile
-       echo '#include "defs.h"' > ${.TARGET}
-       echo '#include "call-cmds.h"' >> ${.TARGET}
-       sed -n -e 's/^_initialize_\([a-z_0-9A-Z]*\).*/extern initialize_file_ftype _initialize_\1;/p' ${.ALLSRC:M*.c} >> ${.TARGET}
-       echo 'void' >> ${.TARGET}
-       echo 'initialize_all_files(void)' >> ${.TARGET}
-       echo '{' >> ${.TARGET}
-       sed -n -e 's/^_initialize_\([a-z_0-9A-Z]*\).*/  _initialize_\1 ();/p' ${.ALLSRC:M*.c} >> ${.TARGET}
-       echo '}' >> ${.TARGET}
-
-CLEANFILES+=   init.c
-
-# observer.inc can't be included in SRCS, it would duplicate the entry in OBJS
-observer.h: observer.sh observer.inc doc/observer.texi
-       sh ${CONTRIBDIR}/observer.sh h ${CONTRIBDIR}/doc/observer.texi ${.TARGET}
-observer.inc: observer.sh doc/observer.texi
-       sh ${CONTRIBDIR}/observer.sh inc ${CONTRIBDIR}/doc/observer.texi ${.TARGET}
-
-nm.h: nm-fbsd.h
-       cp ${.ALLSRC} ${.TARGET}
+LDADD+=        -L../libgdb -lgdb -L../libbfd -lbfd -L../libopcodes -lopcodes -L../libiberty -liberty
 
 .include <bsd.prog.mk>
+
+.PATH: ${BASEDIR}/gdb
diff --git a/gnu/usr.bin/gdb/gdb/kvm-fbsd-i386.h b/gnu/usr.bin/gdb/gdb/kvm-fbsd-i386.h
deleted file mode 100644 (file)
index fb93291..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-/* $FreeBSD: ports/devel/gdb6/files/kvm-fbsd-i386.h,v 1.1 2004/06/20 22:22:02 obrien Exp $ */
-/* $DragonFly: src/gnu/usr.bin/gdb/gdb/Attic/kvm-fbsd-i386.h,v 1.3 2005/01/12 11:24:24 joerg Exp $ */
-
-/* Kernel core dump functions below target vector, for GDB on FreeBSD/i386.
-   Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995
-   Free Software Foundation, Inc.
-
-This file is part of GDB.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-
-#include <machine/frame.h>
-#include "i386-tdep.h"
-
-static CORE_ADDR
-ksym_maxuseraddr (void)
-{
-  static CORE_ADDR maxuseraddr;
-  struct minimal_symbol *sym;
-
-  if (maxuseraddr == 0)
-    {
-      sym = lookup_minimal_symbol ("PTmap", NULL, NULL);
-      if (sym == NULL) {
-       maxuseraddr = VM_MAXUSER_ADDRESS;
-      } else {
-       maxuseraddr = SYMBOL_VALUE_ADDRESS (sym);
-      }
-    }
-  return maxuseraddr;
-}
-
-
-/* Symbol names of kernel entry points.  Use special frames.  */
-#define        KSYM_TRAP       "calltrap"
-#define        KSYM_INTR       "Xintr"
-#define        KSYM_FASTINTR   "Xfastintr"
-#define        KSYM_OLDSYSCALL "Xlcall_syscall"
-#define        KSYM_SYSCALL    "Xint0x80_syscall"
-
-/* The following is FreeBSD-specific hackery to decode special frames
-   and elide the assembly-language stub.  This could be made faster by
-   defining a frame_type field in the machine-dependent frame information,
-   but we don't think that's too important right now.  */
-enum frametype { tf_normal, tf_trap, tf_interrupt, tf_syscall };
-
-CORE_ADDR
-fbsd_kern_frame_saved_pc (struct frame_info *fi)
-{
-  struct minimal_symbol *sym;
-  CORE_ADDR this_saved_pc;
-  enum frametype frametype;
-
-  this_saved_pc = read_memory_integer (get_frame_base (fi) + 4, 4);
-  sym = lookup_minimal_symbol_by_pc (this_saved_pc);
-  frametype = tf_normal;
-  if (sym != NULL)
-    {
-      if (strcmp (DEPRECATED_SYMBOL_NAME (sym), KSYM_TRAP) == 0)
-       frametype = tf_trap;
-      else
-       if (strncmp (DEPRECATED_SYMBOL_NAME (sym), KSYM_INTR,
-           strlen (KSYM_INTR)) == 0 || strncmp (DEPRECATED_SYMBOL_NAME(sym),
-           KSYM_FASTINTR, strlen (KSYM_FASTINTR)) == 0)
-         frametype = tf_interrupt;
-      else
-       if (strcmp (DEPRECATED_SYMBOL_NAME (sym), KSYM_SYSCALL) == 0 ||
-           strcmp (DEPRECATED_SYMBOL_NAME (sym), KSYM_OLDSYSCALL) == 0)
-         frametype = tf_syscall;
-    }
-
-  switch (frametype)
-    {
-      default:
-      case tf_normal:
-        return (this_saved_pc);
-#define oEIP   offsetof (struct trapframe, tf_eip)
-
-      case tf_trap:
-       return (read_memory_integer (get_frame_base (fi) + 8 + oEIP, 4));
-
-      case tf_interrupt:
-       return (read_memory_integer (get_frame_base (fi) + 12 + oEIP, 4));
-
-      case tf_syscall:
-       return (read_memory_integer (get_frame_base (fi) + 8 + oEIP, 4));
-#undef oEIP
-    }
-}
-
-static void
-kgdb_fetch_registers (struct pcb *pcb)
-{
-  int i;
-  int noreg;
-
-  /* Get the register values out of the sys pcb and store them where
-     `read_register' will find them.  */
-  /*
-   * XXX many registers aren't available.
-   * XXX for the non-core case, the registers are stale - they are for
-   *     the last context switch to the debugger.
-   * XXX gcc's register numbers aren't all #defined in tm-i386.h.
-   */
-  noreg = 0;
-  for (i = 0; i < 3; ++i)              /* eax,ecx,edx */
-    supply_register (i, (char *)&noreg);
-
-  /* DEO:XXX use SP_REGNUM and PC_REGNUM -- this is GDB_MULTI_ARCH */
-  supply_register (3, (char *) &pcb->pcb_ebx);
-  supply_register (SP_REGNUM, (char *) &pcb->pcb_esp);
-  supply_register (I386_EBP_REGNUM, (char *) &pcb->pcb_ebp);
-  supply_register (6, (char *) &pcb->pcb_esi);
-  supply_register (7, (char *) &pcb->pcb_edi);
-  supply_register (PC_REGNUM, (char *) &pcb->pcb_eip);
-
-  for (i = 9; i < 14; ++i)             /* eflags, cs, ss, ds, es, fs */
-    supply_register (i, (char *) &noreg);
-  supply_register (15, (char *) &pcb->pcb_gs);
-
-  /* XXX 80387 registers?  */
-}
diff --git a/gnu/usr.bin/gdb/gdb/kvm-fbsd.c b/gnu/usr.bin/gdb/gdb/kvm-fbsd.c
deleted file mode 100644 (file)
index 606f784..0000000
+++ /dev/null
@@ -1,516 +0,0 @@
-/* $FreeBSD: ports/devel/gdb6/files/kvm-fbsd.c,v 1.2 2004/06/20 22:22:02 obrien Exp $ */
-/* $DragonFly: src/gnu/usr.bin/gdb/gdb/Attic/kvm-fbsd.c,v 1.5 2005/02/07 21:33:36 dillon Exp $ */
-
-/* Kernel core dump functions below target vector, for GDB.
-   Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995
-   Free Software Foundation, Inc.
-
-This file is part of GDB.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-/*
- * This works like "remote" but, you use it like this:
- *     target kcore /dev/mem
- * or
- *     target kcore /var/crash/host/core.0
- *
- * This way makes it easy to short-circut the whole bfd monster,
- * and direct the inferior stuff to our libkvm implementation.
- *
- */
-
-#include <sys/param.h>
-#include <sys/user.h>
-#include <machine/frame.h>
-
-#include <ctype.h>
-#include <fcntl.h>
-#include <kvm.h>
-#include <sys/sysctl.h>
-#include <paths.h>
-
-#include "defs.h"
-#include "target.h"
-#include "gdb_string.h"
-#include "frame.h"  /* required by inferior.h */
-#include "inferior.h"
-#include "symfile.h"
-#include "objfiles.h"
-#include "command.h"
-#include "bfd.h"
-#include "gdbcore.h"
-#include "solist.h"
-#include "regcache.h"
-#include <readline/tilde.h>
-
-#include "kvm-fbsd.h"
-
-static void
-kcore_files_info (struct target_ops *);
-
-static void
-kgdb_close (int);
-
-static void
-kgdb_get_registers (int);
-
-static void
-set_proc_cmd (char *, int);
-
-
-       /*
-static int
-xfer_mem (CORE_ADDR, char *, int, int, struct mem_attrib *,
-          struct target_ops *);
-       */
-
-static int
-xfer_umem (CORE_ADDR, char *, int, int);
-
-static char            *core_file;
-static kvm_t           *core_kd;
-static struct pcb      cur_pcb;
-static struct kinfo_proc *cur_proc;
-
-static struct target_ops kgdb_ops;
-
-int kernel_debugging;
-int kernel_writablecore;
-
-/* Read the "thing" at kernel address 'addr' into the space pointed to
-   by point.  The length of the "thing" is determined by the type of p.
-   Result is non-zero if transfer fails.  */
-
-#define kvread(addr, p) \
-  (target_read_memory ((CORE_ADDR) (addr), (char *) (p), sizeof (*(p))))
-
-static CORE_ADDR
-ksym_kernbase (void)
-{
-  static CORE_ADDR kernbase;
-  struct minimal_symbol *sym;
-
-  if (kernbase == 0)
-    {
-      sym = lookup_minimal_symbol ("kernbase", NULL, NULL);
-      if (sym == NULL) {
-       kernbase = KERNBASE;
-      } else {
-       kernbase = SYMBOL_VALUE_ADDRESS (sym);
-      }
-    }
-  return kernbase;
-}
-
-#define        KERNOFF         (ksym_kernbase ())
-#define        INKERNEL(x)     ((x) >= KERNOFF)
-
-CORE_ADDR
-ksym_lookup(const char *name)
-{
-  struct minimal_symbol *sym;
-
-  sym = lookup_minimal_symbol (name, NULL, NULL);
-  if (sym == NULL)
-    error ("kernel symbol `%s' not found.", name);
-
-  return SYMBOL_VALUE_ADDRESS (sym);
-}
-
-/* Provide the address of an initial PCB to use.
-   If this is a crash dump, try for "dumppcb".
-   If no "dumppcb" or it's /dev/mem, use proc0.
-   Return the core address of the PCB we found.  */
-
-static CORE_ADDR
-initial_pcb (void)
-{
-  struct minimal_symbol *sym;
-  CORE_ADDR addr;
-  void *val;
-
-  /* Make sure things are open...  */
-  if (!core_kd || !core_file)
-    return (0);
-
-  /* If this is NOT /dev/mem try for dumppcb.  */
-  if (strncmp (core_file, _PATH_DEV, sizeof _PATH_DEV - 1))
-    {
-      sym = lookup_minimal_symbol ("dumppcb", NULL, NULL);
-      if (sym != NULL)
-       {
-         addr = SYMBOL_VALUE_ADDRESS (sym);
-         return (addr);
-       }
-  }
-
-  /* OK, just use thread0's pcb.  Note that curproc might
-     not exist, and if it does, it will point to gdb.
-     Therefore, just use proc0 and let the user set
-     some other context if they care about it.  */
-
-  addr = ksym_lookup ("thread0");
-  if (kvread (addr, &val))
-    {
-      error ("cannot read thread0 pointer at %lx\n", addr);
-      val = 0;
-    }
-  else
-    {
-      /* Read the PCB address in thread structure.  */
-      addr += offsetof (struct thread, td_pcb);
-      if (kvread (addr, &val))
-       {
-         error ("cannot read thread0->td_pcb pointer at %lx\n", addr);
-         val = 0;
-       }
-    }
-
-  /* thread0 is wholly in the kernel and cur_proc is only used for
-     reading user mem, so no point in setting this up.  */
-  cur_proc = 0;
-
-  return ((CORE_ADDR)val);
-}
-
-/*
- * Set the current context to that of the PCB struct at the system address
- * passed.  If a (local copy of the) thread is passed and the thread does not
- * represent a process, we have to fake up a pcb because pure kernel threads
- * do not use pcb's.  Note however that in the case of a crash dump the 
- * kernel core will have a pcb structure that works whether or not it was
- * a process or a pure thread that crashed, and thr will be NULL in that case.
- */
-static int
-set_context (CORE_ADDR addr, struct thread *thr)
-{
-  CORE_ADDR procaddr = 0;
-  int rval;
-
-  if (thr && thr->td_proc == NULL) {
-     /*
-      * Pure threads do not have PCBs (unless this is the crash point in
-      * which case the kernel saves the crash point state as a pcb).
-      *
-      * on thread stack: [low_level_restore_eip][eflags][edi][esi][ebx][ebp]
-      *                         [switch_restore_eip]
-      */
-     rval = kvread(thr->td_sp + 2*4, &cur_pcb.pcb_edi);
-     rval += kvread(thr->td_sp + 3*4, &cur_pcb.pcb_esi);
-     rval += kvread(thr->td_sp + 4*4, &cur_pcb.pcb_ebx);
-     rval += kvread(thr->td_sp + 5*4, &cur_pcb.pcb_ebp);
-     rval += kvread(thr->td_sp + 6*4, &cur_pcb.pcb_eip);
-     cur_pcb.pcb_esp = (register_t)thr->td_sp + 7*4;
-     if (rval)
-           error ("cannot figure out fake pcb for pure thread");
-  } else {
-      if (kvread (addr, &cur_pcb))
-           error ("cannot read pcb at %#lx", addr);
-  }
-
-  /* Fetch all registers from core file.  */
-  target_fetch_registers (-1);
-
-  /* Now, set up the frame cache, and print the top of stack.  */
-  flush_cached_frames ();
-/*DEO XXX
-  set_current_frame (create_new_frame (read_fp (), read_pc ()));
-  set_current_frame (create_new_frame (deprecated_read_fp (), read_pc ()));
-  select_frame (get_current_frame ());
-*/
-  print_stack_frame (get_selected_frame (), -1, 1);
-  return (0);
-}
-
-/* Discard all vestiges of any previous core file and mark data and stack
-   spaces as empty.  */
-
-/* ARGSUSED */
-static void
-kgdb_close (int quitting)
-{
-
-  inferior_ptid = null_ptid;   /* Avoid confusion from thread stuff.  */
-
-  if (core_kd)
-    {
-      kvm_close (core_kd);
-      free (core_file);
-      core_file = NULL;
-      core_kd = NULL;
-    }
-}
-
-/* This routine opens and sets up the core file bfd.  */
-
-static void
-kgdb_open (char *filename /* the core file */, int from_tty)
-{
-  kvm_t *kd;
-  const char *p;
-  struct cleanup *old_chain;
-  char buf[256], *cp;
-  int ontop;
-  CORE_ADDR addr;
-
-  target_preopen (from_tty);
-
-  /* The exec file is required for symbols.  */
-  if (exec_bfd == NULL)
-    error ("No kernel exec file specified");
-
-  if (core_kd)
-    {
-      error ("No core file specified."
-            "  (Use `detach' to stop debugging a core file.)");
-      return;
-    }
-
-  if (!filename)
-    {
-      error ("No core file specified.");
-      return;
-    }
-
-  filename = tilde_expand (filename);
-  if (filename[0] != '/')
-    {
-      cp = concat (current_directory, "/", filename, NULL);
-      free (filename);
-      filename = cp;
-    }
-
-  old_chain = make_cleanup (free, filename);
-
-  kd = kvm_open (bfd_get_filename(exec_bfd), filename, NULL,
-                kernel_writablecore ? O_RDWR: O_RDONLY, 0);
-  if (kd == NULL)
-    {
-      perror_with_name (filename);
-      return;
-    }
-
-  /* Looks semi-reasonable.  Toss the old core file and work on the new.  */
-
-  discard_cleanups (old_chain);                /* Don't free filename any more.  */
-  core_file = filename;
-  unpush_target (&kgdb_ops);
-  ontop = !push_target (&kgdb_ops);
-
-  /* Note unpush_target (above) calls kgdb_close.  */
-  core_kd = kd;
-
-  /* Print out the panic string if there is one.  */
-  if (kvread (ksym_lookup ("panicstr"), &addr) == 0 &&
-      addr != 0 &&
-      target_read_memory (addr, buf, sizeof(buf)) == 0)
-    {
-
-      for (cp = buf; cp < &buf[sizeof(buf)] && *cp; cp++)
-       if (!isascii (*cp) || (!isprint (*cp) && !isspace (*cp)))
-         *cp = '?';
-      *cp = '\0';
-      if (buf[0] != '\0')
-       printf_filtered ("panic: %s\n", buf);
-    }
-
-  /* Print all the panic messages if possible.  */
-  if (symfile_objfile != NULL)
-    {
-      printf ("panic messages:\n---\n");
-      snprintf (buf, sizeof buf,
-                "/sbin/dmesg -N %s -M %s | \
-                 /usr/bin/awk '/^(panic:|Fatal trap) / { printing = 1 } \
-                               { if (printing) print $0 }'",
-                symfile_objfile->name, filename);
-      fflush (stdout);
-      system (buf);
-      printf ("---\n");
-    }
-
-  if (!ontop)
-    {
-      warning ("you won't be able to access this core file until you terminate\n"
-               "your %s; do ``info files''", target_longname);
-      return;
-    }
-
-  /* Now, set up process context, and print the top of stack.  */
-  (void)set_context (initial_pcb(), NULL);
-  print_stack_frame (get_selected_frame (),
-                    frame_relative_level (get_selected_frame ()), 1);
-}
-
-static void
-kgdb_detach (char *args, int from_tty)
-{
-  if (args)
-    error ("Too many arguments");
-  unpush_target (&kgdb_ops);
-  reinit_frame_cache ();
-  if (from_tty)
-    printf_filtered ("No kernel core file now.\n");
-}
-
-/* Get the registers out of a core file.  This is the machine-
-   independent part.  Fetch_core_registers is the machine-dependent
-   part, typically implemented in the xm-file for each architecture.  */
-
-/* We just get all the registers, so we don't use regno.  */
-
-/* ARGSUSED */
-static void
-kgdb_gdb_registers (int regno)
-{
-
-  /* XXX - Only read the pcb when set_context() is called.
-     When looking at a live kernel this may be a problem,
-     but the user can do another "proc" or "pcb" command to
-     grab a new copy of the pcb...  */
-
-  /* Zero out register set then fill in the ones we know about.  */
-  kgdb_fetch_registers (&cur_pcb);
-}
-
-static void
-kgdb_files_info (t)
-  struct target_ops *t;
-{
-  printf_filtered ("\t`%s'\n", core_file);
-}
-\f
-/* If mourn is being called in all the right places, this could be say
-   `gdb internal error' (since generic_mourn calls breakpoint_init_inferior). */
-
-       /*
-static int
-ignore (CORE_ADDR addr, char *contents)
-{
-  return 0;
-}
-       */
-
-static int
-xfer_kmem (CORE_ADDR memaddr, char *myaddr, int len, int write,
-          struct mem_attrib *attrib, struct target_ops *target)
-{
-  int n;
-
-
-  if (!INKERNEL (memaddr))
-    return xfer_umem (memaddr, myaddr, len, write);
-
-  if (core_kd == NULL)
-    return 0;
-
-  if (write)
-    n = kvm_write (core_kd, memaddr, myaddr, len);
-  else
-    n = kvm_read (core_kd, memaddr, myaddr, len) ;
-  if (n < 0) {
-    fprintf_unfiltered (gdb_stderr, "can not access 0x%lx, %s\n",
-                       memaddr, kvm_geterr (core_kd));
-    n = 0;
-  }
-
-  return n;
-}
-
-
-static int
-xfer_umem (CORE_ADDR memaddr, char *myaddr, int len, int write /* ignored */)
-{
-  int n = 0;
-
-  if (cur_proc == 0)
-    {
-      error ("---Can't read userspace from dump, or kernel process---\n");
-      return 0;
-    }
-
-  if (write)
-    error ("kvm_uwrite unimplemented\n");
-  else
-    n = kvm_uread (core_kd, &cur_proc->kp_proc, memaddr, myaddr, len) ;
-
-  if (n < 0)
-    return 0;
-
-  return n;
-}
-
-void
-_initialize_kgdblow (void)
-{
-  kgdb_ops.to_shortname = "kgdb";
-  kgdb_ops.to_longname = "Kernel core dump file";
-  kgdb_ops.to_doc =
-    "Use a core file as a target.  Specify the filename of the core file.";
-  kgdb_ops.to_open = kgdb_open;
-  kgdb_ops.to_close = kgdb_close;
-  kgdb_ops.to_attach = find_default_attach;
-  kgdb_ops.to_detach = kgdb_detach;
-  kgdb_ops.to_fetch_registers = kgdb_gdb_registers;
-  kgdb_ops.to_xfer_memory = xfer_kmem;
-  kgdb_ops.to_files_info = kgdb_files_info;
-  kgdb_ops.to_create_inferior = find_default_create_inferior;
-  kgdb_ops.to_stratum = kgdb_stratum;
-  kgdb_ops.to_has_memory = 1;
-  kgdb_ops.to_has_stack = 1;
-  kgdb_ops.to_has_registers = 1;
-  kgdb_ops.to_magic = OPS_MAGIC;
-
-  add_target (&kgdb_ops);
-  add_com ("proc", class_obscure, set_proc_cmd, "Set current process context");
-}
-
-static void
-set_proc_cmd (char *arg, int from_tty)
-{
-    CORE_ADDR paddr, val;
-    struct kinfo_proc *kp;
-    struct thread thr;
-    int cnt = 0;
-
-    if (!arg)
-       error_no_arg ("proc address for new current process");
-    if (!kernel_debugging)
-       error ("not debugging kernel");
-
-    paddr = (CORE_ADDR)parse_and_eval_address (arg);
-    /* assume it's a thread pointer if it's in the kernel */
-    if (INKERNEL(paddr)) {
-       if (kvread(paddr, &thr)) {
-           error("invalid thread address");
-           val = 0;
-       }
-        paddr += offsetof (struct thread, td_pcb);
-        if (kvread (paddr, &val)) {
-           error("invalid thread address");
-           val = 0;
-       }
-    } else {
-       kp = kvm_getprocs(core_kd, KERN_PROC_PID, paddr, &cnt);
-       if (!cnt)
-           error("invalid pid");
-       thr = kp->kp_thread;
-       val = (CORE_ADDR)kp->kp_thread.td_pcb;
-    }
-       
-    if (set_context(val, &thr))
-       error("invalid proc address");
-}
diff --git a/gnu/usr.bin/gdb/kgdb/Makefile b/gnu/usr.bin/gdb/kgdb/Makefile
new file mode 100644 (file)
index 0000000..0105b24
--- /dev/null
@@ -0,0 +1,17 @@
+# $DragonFly: src/gnu/usr.bin/gdb/kgdb/Makefile,v 1.1 2006/03/07 15:48:11 corecode Exp $
+
+PROG=  kgdb
+SRCS=  kgdb.c kthr.c trgt.c trgt_${MACHINE_ARCH}.c
+
+CFLAGS+= -I${.OBJDIR}/../libgdb -I${.CURDIR}/../libgdb -I${BASEDIR}/include
+CFLAGS+= -I${BASEDIR}/bfd -I${BASEDIR}/gdb -I${BASEDIR}/gdb/config -I${.CURDIR}/../libbfd
+CLFAGS+= -I${BASEDIR}
+
+DPADD= ${LIBREADLINE} ${LIBKVM} ${LIBTERMCAP} ${LIBM}
+DPADD+=        ${GDBLIBS}
+LDADD= -lreadline -lkvm -ltermcap -lm
+LDADD+=        -L../libgdb -lgdb -L../libbfd -lbfd -L../libopcodes -lopcodes -L../libiberty -liberty
+
+.include <bsd.prog.mk>
+
+.PATH: ${BASEDIR}/gdb
diff --git a/gnu/usr.bin/gdb/kgdb/kgdb.1 b/gnu/usr.bin/gdb/kgdb/kgdb.1
new file mode 100644 (file)
index 0000000..db824ce
--- /dev/null
@@ -0,0 +1,130 @@
+.\" Copyright (c) 2004 Marcel Moolenaar
+.\" All rights reserved.
+.\"
+.\" 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.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+.\"
+.\" $FreeBSD: src/gnu/usr.bin/gdb/kgdb/kgdb.1,v 1.8 2005/07/28 15:59:52 keramida Exp $
+.\" $DragonFly: src/gnu/usr.bin/gdb/kgdb/kgdb.1,v 1.1 2006/03/07 15:48:11 corecode Exp $
+.Dd March 2, 2005
+.Os
+.Dt KGDB 1
+.Sh NAME
+.Nm kgdb
+.Nd "kernel debugger"
+.Sh SYNOPSIS
+.Nm
+.Op Fl a | Fl f | Fl fullname
+.Op Fl q | Fl quiet
+.Op Fl v
+.Op Fl d Ar crashdir
+.Op Fl c Ar core | Fl n Ar dumpnr | Fl r Ar device
+.Op Ar kernel Op Ar core
+.Sh DESCRIPTION
+The
+.Nm
+utility is a debugger based on
+.Xr gdb 1
+that allows debugging of kernel core files.
+.Pp
+The options are as follows:
+.Bl -tag -width ".Fl d Ar crashdir"
+.It Fl a
+Increase the annotation level.
+An annotation level of 1 features the historical
+.Fl fullname
+option of
+.Xr gdb 1 .
+This is useful when running
+.Nm
+in Emacs.
+The
+.Fl f
+or
+.Fl fullname
+options are supported for backward compatibility as well.
+.It Fl q
+Suppress printing of the banner when the debugger starts.
+The
+.Fl quiet
+form is supported for compatibility as well.
+.It Fl v
+Increase verbosity.
+.It Fl d Ar crashdir
+Use
+.Ar crashdir
+instead of the default,
+.Pa /var/crash
+to locate kernel core dump files in.
+The name
+.Pa vmcore.
+plus the dump number will be appended to determine
+the actual dump file name.
+.It Fl c Ar core
+Explicitly use
+.Ar core
+as the core dump file.
+.It Fl n Ar dumpnr
+Use the kernel core dump file numbered
+.Ar dumpnr
+for debugging.
+.It Fl r Ar device
+Use
+.Ar device
+to connect
+.Nm
+to for a remote debugging session.
+.El
+.Pp
+The
+.Fl c , n ,
+and
+.Fl r
+options are mutually exclusive.
+.Pp
+Optionally, the name of the kernel symbol file and
+the name of the core dump file can be supplied on the
+command-line as positional arguments.
+If no kernel symbol file name has been given, the
+symbol file of the currently running kernel will be
+used.
+If no core dump file has been specified through either
+of the options or the last command-line argument,
+.Pa /dev/mem
+will be opened to allow debugging the currently running
+kernel.
+.Sh FILES
+.Bl -tag -width ".Pa /var/crash"
+.It Pa /dev/mem
+Default memory image to open if no core dump file
+has been specified.
+.It Pa /var/crash
+Default directory to locate kernel core dump files.
+.El
+.Sh SEE ALSO
+.Xr gdb 1
+.Sh HISTORY
+The
+.Nm
+utility first appeared in its current form in
+.Fx 5.3
+and was later ported to
+.Dx 1.5.0 .
diff --git a/gnu/usr.bin/gdb/kgdb/kgdb.c b/gnu/usr.bin/gdb/kgdb/kgdb.c
new file mode 100644 (file)
index 0000000..5ba11af
--- /dev/null
@@ -0,0 +1,478 @@
+/*
+ * Copyright (c) 2004 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ *
+ * $FreeBSD: src/gnu/usr.bin/gdb/kgdb/main.c,v 1.11 2006/01/04 23:17:52 kan Exp $
+ * $DragonFly: src/gnu/usr.bin/gdb/kgdb/kgdb.c,v 1.1 2006/03/07 15:48:11 corecode Exp $
+ */
+
+#include <sys/cdefs.h>
+
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/resource.h>
+#include <sys/select.h>
+#include <sys/time.h>
+#include <sys/wait.h>
+#include <errno.h>
+#include <err.h>
+#include <fcntl.h>
+#include <inttypes.h>
+#include <kvm.h>
+#include <limits.h>
+#include <paths.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <linker_set.h>
+
+/* libgdb stuff. */
+#include <defs.h>
+#include <frame.h>
+#include <frame-unwind.h>
+#include <inferior.h>
+#include <interps.h>
+#include <cli-out.h>
+#include <main.h>
+#include <target.h>
+#include <top.h>
+#include <bfd.h>
+#include <gdbcore.h>
+#include <target.h>
+
+extern void symbol_file_add_main (char *args, int from_tty);
+
+#include "kgdb.h"
+
+kvm_t *kvm;
+static char kvm_err[_POSIX2_LINE_MAX];
+
+static int dumpnr;
+static int verbose;
+
+static char crashdir[PATH_MAX];
+static char *kernel;
+static char *remote;
+static char *vmcore;
+
+static void (*kgdb_new_objfile_chain)(struct objfile * objfile);
+
+static void
+kgdb_atexit(void)
+{
+       if (kvm != NULL)
+               kvm_close(kvm);
+}
+
+static void
+usage(void)
+{
+
+       fprintf(stderr,
+           "usage: %s [-afqv] [-d crashdir] [-c core | -n dumpnr | -r device]\n"
+           "\t[kernel [core]]\n", getprogname());
+       exit(1);
+}
+
+static void
+kernel_from_dumpnr(int nr)
+{
+       char path[PATH_MAX];
+       FILE *info;
+       char *s;
+       struct stat st;
+       int l;
+
+       /*
+        * If there's a kernel image right here in the crash directory, then
+        * use it.  The kernel image is either called kernel.<nr> or is in a
+        * subdirectory kernel.<nr> and called kernel.  The latter allows us
+        * to collect the modules in the same place.
+        */
+       snprintf(path, sizeof(path), "%s/kernel.%d", crashdir, nr);
+       if (stat(path, &st) == 0) {
+               if (S_ISREG(st.st_mode)) {
+                       kernel = strdup(path);
+                       return;
+               }
+               if (S_ISDIR(st.st_mode)) {
+                       snprintf(path, sizeof(path), "%s/kernel.%d/kernel",
+                           crashdir, nr);
+                       if (stat(path, &st) == 0 && S_ISREG(st.st_mode)) {
+                               kernel = strdup(path);
+                               return;
+                       }
+               }
+       }
+
+       /*
+        * No kernel image here.  Parse the dump header.  The kernel object
+        * directory can be found there and we probably have the kernel
+        * image still in it.  The object directory may also have a kernel
+        * with debugging info (called kernel.debug).  If we have a debug
+        * kernel, use it.
+        */
+       snprintf(path, sizeof(path), "%s/info.%d", crashdir, nr);
+       info = fopen(path, "r");
+       if (info == NULL) {
+               warn(path);
+               return;
+       }
+       while (fgets(path, sizeof(path), info) != NULL) {
+               l = strlen(path);
+               if (l > 0 && path[l - 1] == '\n')
+                       path[--l] = '\0';
+               if (strncmp(path, "    ", 4) == 0) {
+                       s = strchr(path, ':');
+                       s = (s == NULL) ? path + 4 : s + 1;
+                       l = snprintf(path, sizeof(path), "%s/kernel.debug", s);
+                       if (stat(path, &st) == -1 || !S_ISREG(st.st_mode)) {
+                               path[l - 6] = '\0';
+                               if (stat(path, &st) == -1 ||
+                                   !S_ISREG(st.st_mode))
+                                       break;
+                       }
+                       kernel = strdup(path);
+                       break;
+               }
+       }
+       fclose(info);
+}
+
+static void
+kgdb_new_objfile(struct objfile *objfile)
+{
+#if 0
+       printf("XXX: %s(%p)\n", __func__, objfile);
+       if (objfile != NULL) {
+               goto out;
+       }
+
+out:
+#endif
+       if (kgdb_new_objfile_chain != NULL)
+               kgdb_new_objfile_chain(objfile);
+}
+
+static CORE_ADDR
+kgdb_parse(const char *exp)
+{
+       struct cleanup *old_chain;
+       struct expression *expr;
+       struct value *val;
+       char *s;
+       CORE_ADDR n;
+
+       s = strdup(exp);
+       old_chain = make_cleanup(free_current_contents, &expr);
+       expr = parse_expression(s);
+       val = (expr != NULL) ? evaluate_expression(expr) : NULL;
+       n = (val != NULL) ? value_as_address(val) : 0;
+       do_cleanups(old_chain);
+       free(s);
+       return (n);
+}
+
+#define        MSGBUF_SEQ_TO_POS(size, seq)    ((seq) % (size))
+
+static void
+kgdb_init_target(void)
+{
+       bfd *kern_bfd;
+       int kern_desc;
+
+       kern_desc = open(kernel, O_RDONLY);
+       if (kern_desc == -1)
+               errx(1, "couldn't open a kernel image");
+
+       kern_bfd = bfd_fdopenr(kernel, gnutarget, kern_desc);
+       if (kern_bfd == NULL) {
+               close(kern_desc);
+               errx(1, "\"%s\": can't open to probe ABI: %s.", kernel,
+                       bfd_errmsg (bfd_get_error ()));
+       }
+       bfd_set_cacheable(kern_bfd, 1);
+
+       if (!bfd_check_format (kern_bfd, bfd_object)) {
+               bfd_close(kern_bfd);
+               errx(1, "\"%s\": not in executable format: %s", kernel,
+                       bfd_errmsg(bfd_get_error()));
+        }
+
+       set_gdbarch_from_file (kern_bfd);
+       bfd_close(kern_bfd);
+
+       frame_unwind_prepend_unwinder(current_gdbarch, &kgdb_trgt_trapframe_unwind);
+
+       symbol_file_add_main (kernel, 0);
+       if (remote)
+               push_remote_target (remote, 0);
+       else
+               kgdb_target();
+}
+
+static void
+kgdb_display_msgbuf(void)
+{
+       CORE_ADDR bufp;
+       int size, rseq, wseq;
+       char c;
+
+       /*
+        * Display the unread portion of the message buffer. This gives the
+        * user a some initial data to work from.
+        */
+       bufp = kgdb_parse("msgbufp->msg_ptr");
+       size = (int)kgdb_parse("msgbufp->msg_size");
+       rseq = (int)kgdb_parse("msgbufp->msg_bufr");
+       wseq = (int)kgdb_parse("msgbufp->msg_bufx");
+       rseq = MSGBUF_SEQ_TO_POS(size, rseq);
+       wseq = MSGBUF_SEQ_TO_POS(size, wseq);
+       if (bufp == 0 || size == 0 || rseq == wseq)
+               return;
+
+       printf("\nUnread portion of the kernel message buffer:\n");
+       while (rseq < wseq) {
+               read_memory(bufp + rseq, &c, 1);
+               putchar(c);
+               rseq++;
+               if (rseq == size)
+                       rseq = 0;
+       }
+       if (c != '\n')
+               putchar('\n');
+       putchar('\n');
+}
+
+static void
+kgdb_init(char *argv0 __unused)
+{
+       kgdb_init_target();
+
+       set_prompt("(kgdb) ");
+       kgdb_display_msgbuf();
+       print_stack_frame(get_selected_frame(),
+           frame_relative_level(get_selected_frame()), 1);
+}
+
+int
+main(int argc, char *argv[])
+{
+       char path[PATH_MAX];
+       struct stat st;
+       struct captured_main_args args;
+       char *s;
+       int a, ch, quiet, writecore;
+
+       dumpnr = -1;
+
+       strlcpy(crashdir, "/var/crash", sizeof(crashdir));
+       s = getenv("KGDB_CRASH_DIR");
+       if (s != NULL)
+               strlcpy(crashdir, s, sizeof(crashdir));
+
+       /* Convert long options into short options. */
+       for (a = 1; a < argc; a++) {
+               s = argv[a];
+               if (s[0] == '-') {
+                       s++;
+                       /* Long options take either 1 or 2 dashes. */
+                       if (s[0] == '-')
+                               s++;
+                       if (strcmp(s, "quiet") == 0)
+                               argv[a] = "-q";
+                       else if (strcmp(s, "fullname") == 0)
+                               argv[a] = "-f";
+               }
+       }
+
+       quiet = 0;
+       writecore = 0;
+
+       while ((ch = getopt(argc, argv, "ac:d:fn:qr:vw")) != -1) {
+               switch (ch) {
+               case 'a':
+                       annotation_level++;
+                       break;
+               case 'c':       /* use given core file. */
+                       if (vmcore != NULL) {
+                               warnx("option %c: can only be specified once",
+                                   optopt);
+                               usage();
+                               /* NOTREACHED */
+                       }
+                       vmcore = strdup(optarg);
+                       break;
+               case 'd':       /* lookup dumps in given directory. */
+                       strlcpy(crashdir, optarg, sizeof(crashdir));
+                       break;
+               case 'f':
+                       annotation_level = 1;
+                       break;
+               case 'n':       /* use dump with given number. */
+                       dumpnr = strtol(optarg, &s, 0);
+                       if (dumpnr < 0 || *s != '\0') {
+                               warnx("option %c: invalid kernel dump number",
+                                   optopt);
+                               usage();
+                               /* NOTREACHED */
+                       }
+                       break;
+               case 'q':
+                       quiet = 1;
+                       break;
+               case 'r':       /* use given device for remote session. */
+                       if (remote != NULL) {
+                               warnx("option %c: can only be specified once",
+                                   optopt);
+                               usage();
+                               /* NOTREACHED */
+                       }
+                       remote = strdup(optarg);
+                       break;
+               case 'v':       /* increase verbosity. */
+                       verbose++;
+                       break;
+               case 'w':       /* core file is writeable. */
+                       writecore = 1;
+                       break;
+               case '?':
+               default:
+                       usage();
+               }
+       }
+
+       if (((vmcore != NULL) ? 1 : 0) + ((dumpnr >= 0) ? 1 : 0) +
+           ((remote != NULL) ? 1 : 0) > 1) {
+               warnx("options -c, -n and -r are mutually exclusive");
+               usage();
+               /* NOTREACHED */
+       }
+
+       if (verbose > 1)
+               warnx("using %s as the crash directory", crashdir);
+
+       if (argc > optind)
+               kernel = strdup(argv[optind++]);
+
+       if (argc > optind && (dumpnr >= 0 || remote != NULL)) {
+               warnx("options -n and -r do not take a core file. Ignored");
+               optind = argc;
+       }
+
+       if (dumpnr >= 0) {
+               snprintf(path, sizeof(path), "%s/vmcore.%d", crashdir, dumpnr);
+               if (stat(path, &st) == -1)
+                       err(1, path);
+               if (!S_ISREG(st.st_mode))
+                       errx(1, "%s: not a regular file", path);
+               vmcore = strdup(path);
+       } else if (remote != NULL && remote[0] != ':' && remote[0] != '|') {
+               if (stat(remote, &st) != 0) {
+                       snprintf(path, sizeof(path), "/dev/%s", remote);
+                       if (stat(path, &st) != 0) {
+                               err(1, "%s", remote);
+                               /* NOTREACHED */
+                       }
+                       free(remote);
+                       remote = strdup(path);
+               }
+               if (!S_ISCHR(st.st_mode) && !S_ISFIFO(st.st_mode)) {
+                       errx(1, "%s: not a special file, FIFO or socket",
+                           remote);
+                       /* NOTREACHED */
+               }
+       } else if (argc > optind) {
+               if (vmcore == NULL)
+                       vmcore = strdup(argv[optind++]);
+               if (argc > optind)
+                       warnx("multiple core files specified. Ignored");
+       } else if (vmcore == NULL && kernel == NULL) {
+               vmcore = strdup(_PATH_MEM);
+               kernel = strdup(getbootfile());
+       }
+
+       if (verbose) {
+               if (vmcore != NULL)
+                       warnx("core file: %s", vmcore);
+               if (remote != NULL)
+                       warnx("device file: %s", remote);
+               if (kernel != NULL)
+                       warnx("kernel image: %s", kernel);
+       }
+
+       /*
+        * At this point we must either have a core file or have a kernel
+        * with a remote target.
+        */
+       if (remote != NULL && kernel == NULL) {
+               warnx("remote debugging requires a kernel");
+               usage();
+               /* NOTREACHED */
+       }
+       if (vmcore == NULL && remote == NULL) {
+               warnx("need a core file or a device for remote debugging");
+               usage();
+               /* NOTREACHED */
+       }
+
+       /* If we don't have a kernel image yet, try to find one. */
+       if (kernel == NULL) {
+               if (dumpnr >= 0)
+                       kernel_from_dumpnr(dumpnr);
+
+               if (kernel == NULL)
+                       errx(1, "couldn't find a suitable kernel image");
+               if (verbose)
+                       warnx("kernel image: %s", kernel);
+       }
+
+       if (remote == NULL) {
+               kvm = kvm_openfiles(kernel, vmcore, NULL,
+                   writecore ? O_RDWR : O_RDONLY, kvm_err);
+               if (kvm == NULL)
+                       errx(1, kvm_err);
+               atexit(kgdb_atexit);
+               kgdb_thr_init();
+       }
+
+       /* The libgdb code uses optind too. Reset it... */
+       optind = 0;
+
+       memset (&args, 0, sizeof args);
+       args.argv = argv;
+       args.argc = 1 + quiet;
+       if (quiet)
+               argv[1] = "-q";
+       argv[args.argc] = NULL;
+       args.use_windows = 0;
+       args.interpreter_p = INTERP_CONSOLE;
+
+       deprecated_init_ui_hook = kgdb_init;
+
+       return (gdb_main(&args));
+}
diff --git a/gnu/usr.bin/gdb/kgdb/kgdb.h b/gnu/usr.bin/gdb/kgdb/kgdb.h
new file mode 100644 (file)
index 0000000..52c56d2
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2004 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ *
+ * $FreeBSD: src/gnu/usr.bin/gdb/kgdb/kgdb.h,v 1.3 2005/09/10 18:25:53 marcel Exp $
+ * $DragonFly: src/gnu/usr.bin/gdb/kgdb/kgdb.h,v 1.1 2006/03/07 15:48:11 corecode Exp $
+ */
+
+#ifndef _KGDB_H_
+#define        _KGDB_H_
+
+struct thread_info;
+
+extern kvm_t *kvm;
+extern int verbose;
+
+struct kthr {
+       struct kthr     *next;
+       uintptr_t       paddr;
+       uintptr_t       kaddr;
+       uintptr_t       kstack;
+       uintptr_t       pcb;
+       int             tid;
+       int             pid;
+};
+
+extern struct kthr *curkthr;
+
+void kgdb_target(void);
+void kgdb_trgt_fetch_registers(int);
+void kgdb_trgt_store_registers(int);
+
+extern const struct frame_unwind kgdb_trgt_trapframe_unwind;
+
+struct kthr *kgdb_thr_first(void);
+struct kthr *kgdb_thr_init(void);
+struct kthr *kgdb_thr_lookup_tid(int);
+struct kthr *kgdb_thr_lookup_pid(int);
+struct kthr *kgdb_thr_lookup_paddr(uintptr_t);
+struct kthr *kgdb_thr_lookup_taddr(uintptr_t);
+struct kthr *kgdb_thr_next(struct kthr *);
+struct kthr *kgdb_thr_select(struct kthr *);
+char        *kgdb_thr_extra_thread_info(int);
+
+#endif /* _KGDB_H_ */
diff --git a/gnu/usr.bin/gdb/kgdb/kthr.c b/gnu/usr.bin/gdb/kgdb/kthr.c
new file mode 100644 (file)
index 0000000..d68a1a9
--- /dev/null
@@ -0,0 +1,245 @@
+/*
+ * Copyright (c) 2004 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHORS 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.
+ *
+ * $FreeBSD: src/gnu/usr.bin/gdb/kgdb/kthr.c,v 1.3 2005/09/10 18:25:53 marcel Exp $
+ * $DragonFly: src/gnu/usr.bin/gdb/kgdb/kthr.c,v 1.1 2006/03/07 15:48:11 corecode Exp $
+ */
+
+#define _KERNEL_STRUCTURES
+
+#include <sys/cdefs.h>
+
+#include <sys/param.h>
+#include <machine/globaldata.h>
+#include <sys/user.h>
+#include <sys/types.h>
+#include <sys/signal.h>
+#include <err.h>
+#include <inttypes.h>
+#include <kvm.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <defs.h>
+#include <frame-unwind.h>
+
+#include "kgdb.h"
+
+static uintptr_t dumppcb;
+static int dumptid;
+
+static struct kthr *first;
+struct kthr *curkthr;
+
+static uintptr_t
+lookup(const char *sym)
+{
+       struct nlist nl[2];
+
+       nl[0].n_name = (char *)(uintptr_t)sym;
+       nl[1].n_name = NULL;
+       if (kvm_nlist(kvm, nl) != 0) {
+               warnx("kvm_nlist(%s): %s", sym, kvm_geterr(kvm));
+               return (0);
+       }
+       return (nl[0].n_value);
+}
+
+struct kthr *
+kgdb_thr_first(void)
+{
+       return (first);
+}
+
+struct kthr *
+kgdb_thr_init(void)
+{
+       struct proc p;
+       struct lwp lwp;
+       struct thread td;
+       struct mdglobaldata gd;
+       struct kthr *kt;
+       uintptr_t addr, paddr, prvspace;
+       int cpu, ncpus;
+
+       addr = lookup("_ncpus");
+       if (addr == 0)
+               return (NULL);
+       kvm_read(kvm, addr, &ncpus, sizeof(ncpus));
+
+       dumppcb = lookup("_dumppcb");
+       if (dumppcb == 0)
+               return (NULL);
+
+       prvspace = lookup("CPU_prvspace");
+       if (prvspace == 0)
+               return (NULL);
+
+       addr = lookup("_dumpthread");
+       if (addr != 0) {
+               kvm_read(kvm, addr, &dumptid, sizeof(dumptid));
+       } else {
+               /*
+                * XXX Well then.  We don't know who dumped us.
+                * We could do some fancy stack matching, but
+                * I doubt this will work.  For now just use
+                * cpu0's curthread.
+                *
+                * Actually we don't even know if we were dumped
+                * or if we are life.  Find out by querying "dumping".
+                */
+               int dumping = 0;
+
+               addr = lookup("_dumping");
+               kvm_read(kvm, addr, &dumping, sizeof(dumping));
+               if (dumping) {
+                       kvm_read(kvm, prvspace +
+                                offsetof(struct privatespace, mdglobaldata),
+                                &gd, sizeof(struct mdglobaldata));
+                       dumptid = gd.mi.gd_curthread;
+               } else {
+                       /* We must be a live system */
+                       dumptid = -1;
+               }
+       }
+
+       for (cpu = 0; cpu < ncpus; cpu++) {
+               kvm_read(kvm, prvspace +
+                        cpu * sizeof(struct privatespace) +
+                        offsetof(struct privatespace, mdglobaldata),
+                        &gd, sizeof(struct mdglobaldata));
+
+               addr = (uintptr_t)TAILQ_FIRST(&gd.mi.gd_tdallq);
+               while (addr != 0) {
+                       if (kvm_read(kvm, addr, &td, sizeof(td)) != sizeof(td))
+                               warnx("kvm_read: %s", kvm_geterr(kvm));
+                       kt = malloc(sizeof(*kt));
+                       kt->next = first;
+                       kt->kaddr = addr;
+                       kt->tid = addr;         /* XXX do we have tids? */
+                       kt->pcb = (kt->tid == dumptid) ? dumppcb :
+                           (uintptr_t)td.td_pcb;
+                       kt->kstack = (uintptr_t)td.td_kstack;
+                       if (td.td_proc != NULL) {
+                               paddr = (uintptr_t)td.td_proc;
+                               if (kvm_read(kvm, paddr, &p, sizeof(p)) != sizeof(p))
+                                       warnx("kvm_read: %s", kvm_geterr(kvm));
+                               kt->pid = p.p_pid;
+                               kt->paddr = paddr;
+                       } else {
+                               /*
+                                * XXX for some stupid reason, gdb uses pid == -1
+                                * as a marker for "dead" threads, so we have to
+                                * hook all kernel threads on a different pid :/
+                                */
+                               kt->pid = -2;
+                               kt->paddr = 0;
+                       }
+                       first = kt;
+                       addr = (uintptr_t)TAILQ_NEXT(&td, td_allq);
+               }
+       }
+
+       curkthr = kgdb_thr_lookup_tid(dumptid);
+       if (curkthr == NULL)
+               curkthr = first;
+       return (first);
+}
+
+struct kthr *
+kgdb_thr_lookup_tid(int tid)
+{
+       struct kthr *kt;
+
+       kt = first;
+       while (kt != NULL && kt->tid != tid)
+               kt = kt->next;
+       return (kt);
+}
+
+struct kthr *
+kgdb_thr_lookup_taddr(uintptr_t taddr)
+{
+       struct kthr *kt;
+
+       kt = first;
+       while (kt != NULL && kt->kaddr != taddr)
+               kt = kt->next;
+       return (kt);
+}
+
+struct kthr *
+kgdb_thr_lookup_pid(int pid)
+{
+       struct kthr *kt;
+
+       kt = first;
+       while (kt != NULL && kt->pid != pid)
+               kt = kt->next;
+       return (kt);
+}
+
+struct kthr *
+kgdb_thr_lookup_paddr(uintptr_t paddr)
+{
+       struct kthr *kt;
+
+       kt = first;
+       while (kt != NULL && kt->paddr != paddr)
+               kt = kt->next;
+       return (kt);
+}
+
+struct kthr *
+kgdb_thr_next(struct kthr *kt)
+{
+       return (kt->next);
+}
+
+struct kthr *
+kgdb_thr_select(struct kthr *kt)
+{
+       struct kthr *pcur;
+
+       pcur = curkthr;
+       curkthr = kt;
+       return (pcur);
+}
+
+char *
+kgdb_thr_extra_thread_info(int tid)
+{
+       struct kthr *kt;
+       static char comm[MAXCOMLEN + 1];
+
+       kt = kgdb_thr_lookup_tid(tid);
+       if (kt == NULL)
+               return (NULL);
+       if (kvm_read(kvm, kt->kaddr + offsetof(struct thread, td_comm), &comm,
+           sizeof(comm)) != sizeof(comm))
+               return (NULL);
+
+       return (comm);
+}
diff --git a/gnu/usr.bin/gdb/kgdb/trgt.c b/gnu/usr.bin/gdb/kgdb/trgt.c
new file mode 100644 (file)
index 0000000..4b22e0d
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 2004 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ *
+ * $FreeBSD: src/gnu/usr.bin/gdb/kgdb/trgt.c,v 1.4 2005/09/10 18:25:53 marcel Exp $
+ * $DragonFly: src/gnu/usr.bin/gdb/kgdb/trgt.c,v 1.1 2006/03/07 15:48:11 corecode Exp $
+ */
+
+#include <sys/cdefs.h>
+
+#include <sys/param.h>
+/*#include <sys/proc.h>*/
+#include <sys/sysctl.h>
+#include <sys/user.h>
+#include <kvm.h>
+
+#include <defs.h>
+#include <command.h>
+#include <frame-unwind.h>
+#include <gdbthread.h>
+#include <inferior.h>
+#include <regcache.h>
+#include <target.h>
+
+#include "kgdb.h"
+
+static struct target_ops kgdb_trgt_ops;
+
+static char *
+kgdb_trgt_extra_thread_info(struct thread_info *ti)
+{
+       static char buf[64];
+       char *p, *s;
+
+       p = buf + snprintf(buf, sizeof(buf), "PID=%d", ptid_get_pid(ti->ptid));
+       s = kgdb_thr_extra_thread_info(ptid_get_tid(ti->ptid));
+       if (s != NULL)
+               snprintf(p, sizeof(buf) - (p - buf), ": %s", s);
+       return (buf);
+}
+
+static void
+kgdb_trgt_files_info(struct target_ops *target)
+{
+       struct target_ops *tb;
+
+       tb = find_target_beneath(target);
+       if (tb->to_files_info != NULL)
+               tb->to_files_info(tb);
+}
+
+static void
+kgdb_trgt_find_new_threads(void)
+{
+       struct target_ops *tb;
+
+       if (kvm != NULL)
+               return;
+
+       tb = find_target_beneath(&kgdb_trgt_ops);
+       if (tb->to_find_new_threads != NULL)
+               tb->to_find_new_threads();
+}
+
+static char *
+kgdb_trgt_pid_to_str(ptid_t ptid)
+{
+       static char buf[33];
+
+       snprintf(buf, sizeof(buf), "Thread %#lx", ptid_get_tid(ptid));
+       return (buf);
+}
+
+static int
+kgdb_trgt_thread_alive(ptid_t ptid)
+{
+       return (kgdb_thr_lookup_tid(ptid_get_tid(ptid)) != NULL);
+}
+
+static int
+kgdb_trgt_xfer_memory(CORE_ADDR memaddr, char *myaddr, int len, int write,
+    struct mem_attrib *attrib, struct target_ops *target)
+{
+       struct target_ops *tb;
+
+       if (kvm != NULL) {
+               if (len == 0)
+                       return (0);
+               if (!write)
+                       return (kvm_read(kvm, memaddr, myaddr, len));
+               else
+                       return (kvm_write(kvm, memaddr, myaddr, len));
+       }
+       tb = find_target_beneath(target);
+       return (tb->to_xfer_memory(memaddr, myaddr, len, write, attrib, tb));
+}
+
+void
+kgdb_target(void)
+{
+       struct kthr *kt;
+       struct thread_info *ti;
+
+       kgdb_trgt_ops.to_magic = OPS_MAGIC;
+       kgdb_trgt_ops.to_shortname = "kernel";
+       kgdb_trgt_ops.to_longname = "kernel core files.";
+       kgdb_trgt_ops.to_doc = "Kernel core files.";
+       kgdb_trgt_ops.to_stratum = thread_stratum;
+       kgdb_trgt_ops.to_has_memory = 1;
+       kgdb_trgt_ops.to_has_registers = 1;
+       kgdb_trgt_ops.to_has_stack = 1;
+
+       kgdb_trgt_ops.to_extra_thread_info = kgdb_trgt_extra_thread_info;
+       kgdb_trgt_ops.to_fetch_registers = kgdb_trgt_fetch_registers;
+       kgdb_trgt_ops.to_files_info = kgdb_trgt_files_info;
+       kgdb_trgt_ops.to_find_new_threads = kgdb_trgt_find_new_threads;
+       kgdb_trgt_ops.to_pid_to_str = kgdb_trgt_pid_to_str;
+       kgdb_trgt_ops.to_store_registers = kgdb_trgt_store_registers;
+       kgdb_trgt_ops.to_thread_alive = kgdb_trgt_thread_alive;
+       kgdb_trgt_ops.to_xfer_memory = kgdb_trgt_xfer_memory;
+       add_target(&kgdb_trgt_ops);
+       push_target(&kgdb_trgt_ops);
+
+       kt = kgdb_thr_first();
+       while (kt != NULL) {
+               ti = add_thread(ptid_build(kt->pid, 0, kt->tid));
+               kt = kgdb_thr_next(kt);
+       }
+       if (curkthr != 0)
+               inferior_ptid = ptid_build(curkthr->pid, 0, curkthr->tid);
+}
diff --git a/gnu/usr.bin/gdb/kgdb/trgt_i386.c b/gnu/usr.bin/gdb/kgdb/trgt_i386.c
new file mode 100644 (file)
index 0000000..26e0e27
--- /dev/null
@@ -0,0 +1,239 @@
+/*
+ * Copyright (c) 2004 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHORS 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.
+ *
+ * $FreeBSD: src/gnu/usr.bin/gdb/kgdb/trgt_i386.c,v 1.5 2005/09/11 05:36:30 marcel Exp $
+ * $DragonFly: src/gnu/usr.bin/gdb/kgdb/trgt_i386.c,v 1.1 2006/03/07 15:48:11 corecode Exp $
+ */
+
+#include <sys/cdefs.h>
+
+#include <sys/types.h>
+#include <machine/thread.h>
+#include <sys/thread.h>
+#include <machine/pcb.h>
+#include <machine/frame.h>
+#include <err.h>
+#include <kvm.h>
+#include <string.h>
+
+#include <defs.h>
+#include <target.h>
+#include <gdbthread.h>
+#include <inferior.h>
+#include <regcache.h>
+#include <frame-unwind.h>
+#include <i386-tdep.h>
+
+#include "kgdb.h"
+
+void
+kgdb_trgt_fetch_registers(int regno __unused)
+{
+       struct kthr *kt;
+       struct pcb pcb;
+
+       kt = kgdb_thr_lookup_tid(ptid_get_tid(inferior_ptid));
+       if (kt == NULL)
+               return;
+
+       /*
+        * XXX Detect pure thread
+        * XXX handle pure thread dumping
+        */
+       if (kt->paddr == 0) {
+               uintptr_t regs[5];
+               uintptr_t addr;
+               uintptr_t sp;
+
+               addr = kt->kaddr + offsetof(struct thread, td_sp);
+               kvm_read(kvm, addr, &sp, sizeof(sp));
+               /*
+                * Stack is:
+                * -2 ret
+                * -1 popfl
+                * 0 popl %edi
+                * 1 popl %esi
+                * 2 popl %ebx
+                * 3 popl %ebp
+                * 4 ret
+                */
+               if (kvm_read(kvm, sp + 2 * sizeof(regs[0]), regs, sizeof(regs)) != sizeof(regs)) {
+                       warnx("kvm_read: %s", kvm_geterr(kvm));
+                       memset(regs, 0, sizeof(regs));
+               }
+               supply_register(I386_EDI_REGNUM, &regs[0]);
+               supply_register(I386_ESI_REGNUM, &regs[1]);
+               supply_register(I386_EBX_REGNUM, &regs[2]);
+               supply_register(I386_EBP_REGNUM, &regs[3]);
+               supply_register(I386_EIP_REGNUM, &regs[4]);
+               return;
+       }
+
+       if (kvm_read(kvm, kt->pcb, &pcb, sizeof(pcb)) != sizeof(pcb)) {
+               warnx("kvm_read: %s", kvm_geterr(kvm));
+               memset(&pcb, 0, sizeof(pcb));
+       }
+       supply_register(I386_EBX_REGNUM, (char *)&pcb.pcb_ebx);
+       supply_register(I386_ESP_REGNUM, (char *)&pcb.pcb_esp);
+       supply_register(I386_EBP_REGNUM, (char *)&pcb.pcb_ebp);
+       supply_register(I386_ESI_REGNUM, (char *)&pcb.pcb_esi);
+       supply_register(I386_EDI_REGNUM, (char *)&pcb.pcb_edi);
+       supply_register(I386_EIP_REGNUM, (char *)&pcb.pcb_eip);
+}
+
+void
+kgdb_trgt_store_registers(int regno __unused)
+{
+       fprintf_unfiltered(gdb_stderr, "XXX: %s\n", __func__);
+}
+
+struct kgdb_frame_cache {
+       int             intrframe;
+       CORE_ADDR       pc;
+       CORE_ADDR       sp;
+};
+
+static int kgdb_trgt_frame_offset[15] = {
+       offsetof(struct trapframe, tf_eax),
+       offsetof(struct trapframe, tf_ecx),
+       offsetof(struct trapframe, tf_edx),
+       offsetof(struct trapframe, tf_ebx),
+       offsetof(struct trapframe, tf_esp),
+       offsetof(struct trapframe, tf_ebp),
+       offsetof(struct trapframe, tf_esi),
+       offsetof(struct trapframe, tf_edi),
+       offsetof(struct trapframe, tf_eip),
+       offsetof(struct trapframe, tf_eflags),
+       offsetof(struct trapframe, tf_cs),
+       offsetof(struct trapframe, tf_ss),
+       offsetof(struct trapframe, tf_ds),
+       offsetof(struct trapframe, tf_es),
+       offsetof(struct trapframe, tf_fs)
+};
+
+static struct kgdb_frame_cache *
+kgdb_trgt_frame_cache(struct frame_info *next_frame, void **this_cache)
+{
+       char buf[MAX_REGISTER_SIZE];
+       struct kgdb_frame_cache *cache;
+       char *pname;
+
+       cache = *this_cache;
+       if (cache == NULL) {
+               cache = FRAME_OBSTACK_ZALLOC(struct kgdb_frame_cache);
+               *this_cache = cache;
+               cache->pc = frame_func_unwind(next_frame);
+               find_pc_partial_function(cache->pc, &pname, NULL, NULL);
+               cache->intrframe = (pname[0] == 'X') ? 1 : 0;
+               frame_unwind_register(next_frame, SP_REGNUM, buf);
+               cache->sp = extract_unsigned_integer(buf,
+                   register_size(current_gdbarch, SP_REGNUM));
+       }
+       return (cache);
+}
+
+static void
+kgdb_trgt_trapframe_this_id(struct frame_info *next_frame, void **this_cache,
+    struct frame_id *this_id)
+{
+       struct kgdb_frame_cache *cache;
+
+       cache = kgdb_trgt_frame_cache(next_frame, this_cache);
+       *this_id = frame_id_build(cache->sp, cache->pc);
+}
+
+static void
+kgdb_trgt_trapframe_prev_register(struct frame_info *next_frame,
+    void **this_cache, int regnum, int *optimizedp, enum lval_type *lvalp,
+    CORE_ADDR *addrp, int *realnump, void *valuep)
+{
+       char dummy_valuep[MAX_REGISTER_SIZE];
+       struct kgdb_frame_cache *cache;
+       int ofs, regsz;
+
+       regsz = register_size(current_gdbarch, regnum);
+
+       if (valuep == NULL)
+               valuep = dummy_valuep;
+       memset(valuep, 0, regsz);
+       *optimizedp = 0;
+       *addrp = 0;
+       *lvalp = not_lval;
+       *realnump = -1;
+
+       if (regnum < I386_EAX_REGNUM || regnum > I386_FS_REGNUM)
+               return;
+
+       cache = kgdb_trgt_frame_cache(next_frame, this_cache);
+
+       ofs = kgdb_trgt_frame_offset[regnum];
+       *addrp = cache->sp + ofs + (cache->intrframe ? 4 : 0);
+
+       /*
+        * If we are in the kernel, we don't have esp stored in the
+        * trapframe, but we can calculate it simply by subtracting
+        * the size of the frame.
+        */
+       if (regnum == I386_ESP_REGNUM) {
+               char buf[4];
+
+               frame_unwind_register(next_frame, I386_CS_REGNUM, buf);
+               if (extract_unsigned_integer(buf, 4) != SEL_UPL) {
+                       store_unsigned_integer(valuep, regsz, *addrp);
+                       return;
+               }
+               /* FALLTHROUGH */
+       }
+       *lvalp = lval_memory;
+       target_read_memory(*addrp, valuep, regsz);
+}
+
+static int
+kgdb_trgt_trapframe_sniffer(const struct frame_unwind *self,
+                           struct frame_info *next_frame,
+                           void **this_prologue_cache)
+{
+       char *pname;
+       CORE_ADDR pc;
+
+       pc = frame_unwind_address_in_block(next_frame);
+       pname = NULL;
+       find_pc_partial_function(pc, &pname, NULL, NULL);
+       if (pname == NULL)
+               return (NULL);
+       if (strcmp(pname, "calltrap") == 0 ||
+           strcmp(pname, "dblfault_handler") == 0 ||
+           (pname[0] == 'X' && pname[1] != '_'))
+               return 1;
+       /* printf("%s: %llx =%s\n", __func__, pc, pname); */
+       return 0;
+}
+
+const struct frame_unwind kgdb_trgt_trapframe_unwind = {
+        UNKNOWN_FRAME,
+        &kgdb_trgt_trapframe_this_id,
+        &kgdb_trgt_trapframe_prev_register,
+       .sniffer = kgdb_trgt_trapframe_sniffer
+};
similarity index 94%
copy from gnu/usr.bin/gdb/gdb/Makefile
copy to gnu/usr.bin/gdb/libgdb/Makefile
index 1740a84..b0a6046 100644 (file)
@@ -1,10 +1,12 @@
-# $DragonFly: src/gnu/usr.bin/gdb/gdb/Makefile,v 1.7 2005/05/07 19:55:31 corecode Exp $
+# $DragonFly: src/gnu/usr.bin/gdb/libgdb/Makefile,v 1.1 2006/03/07 15:48:11 corecode Exp $
 
 .include "../Makefile.inc"
 
-PROG=  gdb
+#PROG= gdb
+LIB=   gdb
+INTERNALLIB=   # yes
 
-SUBDIR=        doc
+#SUBDIR=       doc
 
 CONTRIBDIR=    ${BASEDIR}/gdb
 .PATH: ${CONTRIBDIR} ${CONTRIBDIR}/cli ${CONTRIBDIR}/mi ${CONTRIBDIR}/signals
@@ -18,7 +20,7 @@ CFLAGS+= -I${BASEDIR}
 CFLAGS+= -DTUI=1
 SRCS=  tui-main.c
 .else
-SRCS=  gdb.c
+#SRCS= gdb.c
 .endif
 
 CLEANFILES+=   nm.h observer.h observer.inc tm.h xm.h
@@ -65,7 +67,8 @@ SRCS+=        tui-stack.c tui-win.c tui-windata.c tui-wingeneral.c tui-winsource.c
 .endif
 # kernel-debugger
 PATCHES!=      echo ${.CURDIR}/patches/*.patch
-SRCS+= freebsd-uthread.c kvm-fbsd.c kvm-fbsd.h ${PATCHES}
+SRCS+= freebsd-uthread.c ${PATCHES}
+#SRCS+=        kthr.c trgt.c trgt_${MACHINE_ARCH}.c
 
 DPADD= ${LIBREADLINE} ${LIBKVM} ${LIBTERMCAP} ${LIBM}
 DPADD+=        ../libbfd/libbfd.a ../libopcodes/libopcodes.a ../libiberty/libiberty.a
@@ -95,4 +98,4 @@ observer.inc: observer.sh doc/observer.texi
 nm.h: nm-fbsd.h
        cp ${.ALLSRC} ${.TARGET}
 
-.include <bsd.prog.mk>
+.include <bsd.lib.mk>
similarity index 78%
rename from gnu/usr.bin/gdb/gdb/Makefile.amd64
rename to gnu/usr.bin/gdb/libgdb/Makefile.amd64
index 9b3685a..cb19fe7 100644 (file)
@@ -1,4 +1,4 @@
-# $DragonFly: src/gnu/usr.bin/gdb/gdb/Attic/Makefile.amd64,v 1.1 2005/10/01 12:40:33 corecode Exp $
+# $DragonFly: src/gnu/usr.bin/gdb/libgdb/Makefile.amd64,v 1.1 2006/03/07 15:48:11 corecode Exp $
 
 SRCS+= amd64-nat.c amd64-tdep.c amd64bsd-nat.c amd64fbsd-nat.c
 SRCS+= amd64fbsd-tdep.c i386-tdep.c i386bsd-tdep.c i386fbsd-tdep.c
similarity index 63%
rename from gnu/usr.bin/gdb/gdb/Makefile.i386
rename to gnu/usr.bin/gdb/libgdb/Makefile.i386
index 2b02d95..f5feb82 100644 (file)
@@ -1,4 +1,4 @@
-# $DragonFly: src/gnu/usr.bin/gdb/gdb/Attic/Makefile.i386,v 1.2 2005/05/07 19:55:31 corecode Exp $
+# $DragonFly: src/gnu/usr.bin/gdb/libgdb/Makefile.i386,v 1.1 2006/03/07 15:48:11 corecode Exp $
 
 SRCS+= i386-nat.c i386-tdep.c i386bsd-nat.c i386bsd-tdep.c i386fbsd-nat.c
 SRCS+= i386fbsd-tdep.c i387-tdep.c
@@ -9,7 +9,4 @@ tm.h: ${CONTRIBDIR}/config/i386/tm-fbsd.h
 xm.h: ${CONTRIBDIR}/config/i386/xm-i386.h
        cp ${.ALLSRC} ${.TARGET}
 
-kvm-fbsd.h:
-       echo '#include "kvm-fbsd-i386.h"' > ${.TARGET}
-
 CLEANFILES+=   kvm-fbsd.h
similarity index 99%
rename from gnu/usr.bin/gdb/gdb/config.h
rename to gnu/usr.bin/gdb/libgdb/config.h
index 65c4d44..2ad7956 100644 (file)
@@ -1,4 +1,4 @@
-/* $DragonFly: src/gnu/usr.bin/gdb/gdb/Attic/config.h,v 1.1 2004/10/23 17:02:38 joerg Exp $ */
+/* $DragonFly: src/gnu/usr.bin/gdb/libgdb/config.h,v 1.1 2006/03/07 15:48:11 corecode Exp $ */
 /* config.h.  Generated automatically by configure.  */
 /* config.in.  Generated automatically from configure.in by autoheader.  */
 
similarity index 99%
rename from gnu/usr.bin/gdb/gdb/freebsd-uthread.c
rename to gnu/usr.bin/gdb/libgdb/freebsd-uthread.c
index 99ff583..a0c8fc8 100644 (file)
@@ -18,7 +18,7 @@ along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 /* $FreeBSD: ports/devel/gdb6/files/freebsd-uthread.c,v 1.2 2004/06/20 18:45:36 obrien Exp $ */
-/* $DragonFly: src/gnu/usr.bin/gdb/gdb/Attic/freebsd-uthread.c,v 1.2 2004/10/24 18:05:10 joerg Exp $ */
+/* $DragonFly: src/gnu/usr.bin/gdb/libgdb/freebsd-uthread.c,v 1.1 2006/03/07 15:48:11 corecode Exp $ */
 
 /* This module implements a sort of half target that sits between the
    machine-independent parts of GDB and the ptrace interface (infptrace.c) to
similarity index 81%
rename from gnu/usr.bin/gdb/gdb/nm-fbsd.h
rename to gnu/usr.bin/gdb/libgdb/nm-fbsd.h
index e2fdb27..7ce0b24 100644 (file)
@@ -1,4 +1,4 @@
-/* $DragonFly: src/gnu/usr.bin/gdb/gdb/Attic/nm-fbsd.h,v 1.1 2004/10/23 17:02:38 joerg Exp $ */
+/* $DragonFly: src/gnu/usr.bin/gdb/libgdb/Attic/nm-fbsd.h,v 1.1 2006/03/07 15:48:11 corecode Exp $ */
 /* Native-dependent definitions for FreeBSD/i386.
 
    Copyright 1986, 1987, 1989, 1992, 1994, 1996, 1997, 2000, 2001, 2004
@@ -143,28 +143,6 @@ extern CORE_ADDR register_u_addr (CORE_ADDR blockend, int regno);
 #define ld_un          d_un
 #define ld_2           d_sdt
 
-/* kgdb hooks */
-#define KGDB 1
-#define ADDITIONAL_OPTIONS \
-       {"kernel", no_argument, &kernel_debugging, 1}, \
-       {"k", no_argument, &kernel_debugging, 1}, \
-       {"wcore", no_argument, &kernel_writablecore, 1}, \
-       {"w", no_argument, &kernel_writablecore, 1},
-
-#define ADDITIONAL_OPTION_HELP \
-       "\
-  --kernel           Enable kernel debugging.\n\
-  --wcore            Make core file writable (only works for /dev/mem).\n\
-                     This option only works while debugging a kernel !!\n\
-"
-
-#define DEFAULT_PROMPT kernel_debugging?"(kgdb) ":"(gdb) "
-
-/* misuse START_PROGRESS to test whether we're running as kgdb */   
-/* START_PROGRESS is called at the top of main */
-#undef START_PROGRESS
-#define START_PROGRESS(STR,N) \
-  if (!strcmp (STR, "kgdb")) \
-     kernel_debugging = 1;
+#define KGDB
 
 #endif /* nm-fbsd.h */
@@ -1,4 +1,4 @@
-$DragonFly: src/gnu/usr.bin/gdb/gdb/patches/Attic/i386bsd-nat.c.patch,v 1.1 2004/10/26 10:22:11 joerg Exp $
+$DragonFly: src/gnu/usr.bin/gdb/libgdb/patches/Attic/i386bsd-nat.c.patch,v 1.1 2006/03/07 15:48:11 corecode Exp $
 
 Index: i386bsd-nat.c
 ===================================================================
@@ -1,4 +1,4 @@
-$DragonFly: src/gnu/usr.bin/gdb/gdb/patches/Attic/i386fbsd-nat.c.patch,v 1.1 2005/01/12 11:24:24 joerg Exp $
+$DragonFly: src/gnu/usr.bin/gdb/libgdb/patches/Attic/i386fbsd-nat.c.patch,v 1.1 2006/03/07 15:48:11 corecode Exp $
 
 Index: i386fbsd-nat.c
 ===================================================================
@@ -1,4 +1,4 @@
-$DragonFly: src/gnu/usr.bin/gdb/gdb/patches/Attic/i386fbsd-tdep.c.patch,v 1.1 2005/05/07 19:48:16 corecode Exp $
+$DragonFly: src/gnu/usr.bin/gdb/libgdb/patches/Attic/i386fbsd-tdep.c.patch,v 1.1 2006/03/07 15:48:11 corecode Exp $
 Index: i386fbsd-tdep.c
 ===================================================================
 RCS file: /space/cvs/dragonfly/src/contrib/gdb-6.2.1/gdb/i386fbsd-tdep.c,v
similarity index 93%
rename from gnu/usr.bin/gdb/gdb/patches/main.c.patch
rename to gnu/usr.bin/gdb/libgdb/patches/main.c.patch
index baba875..5a71f06 100644 (file)
@@ -1,4 +1,4 @@
-$DragonFly: src/gnu/usr.bin/gdb/gdb/patches/Attic/main.c.patch,v 1.2 2004/10/24 18:05:10 joerg Exp $
+$DragonFly: src/gnu/usr.bin/gdb/libgdb/patches/Attic/main.c.patch,v 1.1 2006/03/07 15:48:11 corecode Exp $
 
 --- main.c.orig        Thu Apr 15 22:40:39 2004
 +++ main.c     Thu Apr 15 22:47:51 2004
similarity index 76%
rename from gnu/usr.bin/gdb/gdb/patches/target.c.patch
rename to gnu/usr.bin/gdb/libgdb/patches/target.c.patch
index e2a02c6..49e5283 100644 (file)
@@ -1,4 +1,4 @@
-$DragonFly: src/gnu/usr.bin/gdb/gdb/patches/Attic/target.c.patch,v 1.3 2005/01/12 11:24:24 joerg Exp $
+$DragonFly: src/gnu/usr.bin/gdb/libgdb/patches/Attic/target.c.patch,v 1.1 2006/03/07 15:48:11 corecode Exp $
 
 --- target.c   Mon Aug 26 12:18:33 2002
 +++ target.c   Sun Oct 13 10:51:32 2002
similarity index 79%
rename from gnu/usr.bin/gdb/gdb/patches/target.h.patch
rename to gnu/usr.bin/gdb/libgdb/patches/target.h.patch
index d58aeed..66fa8f2 100644 (file)
@@ -1,4 +1,4 @@
-$DragonFly: src/gnu/usr.bin/gdb/gdb/patches/Attic/target.h.patch,v 1.3 2005/01/12 11:24:24 joerg Exp $
+$DragonFly: src/gnu/usr.bin/gdb/libgdb/patches/Attic/target.h.patch,v 1.1 2006/03/07 15:48:11 corecode Exp $
 
 --- target.h   Sat Feb  9 20:08:42 2002
 +++ target.h   Fri May 24 08:38:31 2002
similarity index 59%
rename from gnu/usr.bin/gdb/gdb/version.c
rename to gnu/usr.bin/gdb/libgdb/version.c
index d63974e..e354a44 100644 (file)
@@ -1,4 +1,4 @@
-/* $DragonFly: src/gnu/usr.bin/gdb/gdb/Attic/version.c,v 1.1 2004/10/23 17:02:38 joerg Exp $ */
+/* $DragonFly: src/gnu/usr.bin/gdb/libgdb/version.c,v 1.1 2006/03/07 15:48:11 corecode Exp $ */
 #include "version.h"
 const char version[] = "6.2.1";
 const char host_name[] = "i386-dragonfly";
index 3c3f213..1f8b307 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_shutdown.c     8.3 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/kern_shutdown.c,v 1.72.2.12 2002/02/21 19:15:10 dillon Exp $
- * $DragonFly: src/sys/kern/kern_shutdown.c,v 1.25 2006/02/21 17:36:38 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_shutdown.c,v 1.26 2006/03/07 15:48:11 corecode Exp $
  */
 
 #include "opt_ddb.h"
@@ -193,6 +193,7 @@ shutdown_nice(int howto)
        return;
 }
 static int     waittime = -1;
+static struct thread *dumpthread;
 static struct pcb dumppcb;
 
 static void
@@ -528,6 +529,7 @@ dumpsys(void)
        int     error;
 
        savectx(&dumppcb);
+       dumpthread = curthread;
        if (dumping++) {
                printf("Dump already in progress, bailing...\n");
                return;