Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH] Add libkvm interface support for NetBSD/i386 and OpenBSD/i386
@ 2004-06-27 16:23 Mark Kettenis
  2004-06-27 16:34 ` Marcel Moolenaar
  0 siblings, 1 reply; 6+ messages in thread
From: Mark Kettenis @ 2004-06-27 16:23 UTC (permalink / raw)
  To: gdb-patches

Committed,

Mark

Index: ChangeLog
from  Mark Kettenis  <kettenis@gnu.org>
 
	* i386nbsd-nat.c: New file.
	* Makefile.in (ALLDEPFILES): Add i386nbsd-nat.c, i386nbsd-tdep.c,
	i386obsd-nat.c and i386obsd-tdep.c.
	(i386nbsd-nat.o): New dependency.
	* config/i386/obsd.mh (NATDEPFILES): Add i386nbsd-nat.o and
	bsd-kvm.o.
	(LOADLIBES): New variable.
	* config/i386/nbsdelf.mh (NATDEPFILES): Add i386nbsd-nat.o and
	bsd-kvm.o.
	(LOADLIBES): New variable.

 
Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.590
diff -u -p -r1.590 Makefile.in
--- Makefile.in 26 Jun 2004 11:47:53 -0000 1.590
+++ Makefile.in 27 Jun 2004 16:21:45 -0000
@@ -1364,6 +1364,7 @@ ALLDEPFILES = \
 	i386-tdep.c i386v-nat.c i386-linux-nat.c \
 	i386v4-nat.c i386ly-tdep.c i386-cygwin-tdep.c \
 	i386bsd-nat.c i386bsd-tdep.c i386fbsd-nat.c i386fbsd-tdep.c \
+	i386nbsd-nat.c i386nbsd-tdep.c i386obsd-nat.c i386obsd-tdep.c \
 	i387-tdep.c \
 	i386-linux-tdep.c i386-nat.c \
 	i386gnu-nat.c i386gnu-tdep.c \
@@ -1913,6 +1914,8 @@ i386-linux-tdep.o: i386-linux-tdep.c $(d
 i386ly-tdep.o: i386ly-tdep.c $(defs_h) $(gdbcore_h) $(inferior_h) \
 	$(regcache_h) $(target_h) $(osabi_h) $(i386_tdep_h)
 i386-nat.o: i386-nat.c $(defs_h) $(breakpoint_h) $(command_h) $(gdbcmd_h)
+i386nbsd-nat.o: i386nbsd-nat.c $(defs_h) $(gdbcore_h) $(regcache_h) \
+	$(i386_tdep_h) $(bsd_kvm_h)
 i386nbsd-tdep.o: i386nbsd-tdep.c $(defs_h) $(arch_utils_h) $(frame_h) \
 	$(gdbcore_h) $(regcache_h) $(regset_h) $(osabi_h) $(symtab_h) \
 	$(gdb_assert_h) $(gdb_string_h) $(i386_tdep_h) $(i387_tdep_h) \
Index: i386nbsd-nat.c
===================================================================
RCS file: i386nbsd-nat.c
diff -N i386nbsd-nat.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ i386nbsd-nat.c 27 Jun 2004 16:21:45 -0000
@@ -0,0 +1,82 @@
+/* Native-dependent code for NetBSD/i386.
+
+   Copyright 2004 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 "defs.h"
+#include "gdbcore.h"
+#include "regcache.h"
+
+#include "i386-tdep.h"
+
+/* Support for debugging kernel virtual memory images.  */
+
+#include <sys/types.h>
+#include <machine/frame.h>
+#include <machine/pcb.h>
+
+#include "bsd-kvm.h"
+
+static int
+i386nbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
+{
+  struct switchframe sf;
+
+  /* The following is true for NetBSD 1.6.2:
+
+     The pcb contains %esp and %ebp at the point of the context switch
+     in cpu_switch().  At that point we have a stack frame as
+     described by `struct switchframe', which for NetBSD 1.6.2 has the
+     following layout:
+
+     interrupt level
+     %edi
+     %esi
+     %ebx
+     %eip
+
+     we reconstruct the register state as it would look when we just
+     returned from cpu_switch().  */
+
+  /* The stack pointer shouldn't be zero.  */
+  if (pcb->pcb_esp == 0)
+    return 0;
+
+  read_memory (pcb->pcb_esp, (char *) &sf, sizeof sf);
+  pcb->pcb_esp += sizeof (struct switchframe);
+  regcache_raw_supply (regcache, I386_EDI_REGNUM, &sf.sf_edi);
+  regcache_raw_supply (regcache, I386_ESI_REGNUM, &sf.sf_esi);
+  regcache_raw_supply (regcache, I386_EBP_REGNUM, &pcb->pcb_ebp);
+  regcache_raw_supply (regcache, I386_ESP_REGNUM, &pcb->pcb_esp);
+  regcache_raw_supply (regcache, I386_EBX_REGNUM, &sf.sf_ebx);
+  regcache_raw_supply (regcache, I386_EIP_REGNUM, &sf.sf_eip);
+
+  return 1;
+}
+\f
+
+/* Provide a prototype to silence -Wmissing-prototypes.  */
+void _initialize_i386nbsd_nat (void);
+
+void
+_initialize_i386nbsd_nat (void)
+{
+  /* Support debugging kernel virtual memory images.  */
+  bsd_kvm_add_target (i386nbsd_supply_pcb);
+}
Index: config/i386/nbsdelf.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/nbsdelf.mh,v
retrieving revision 1.15
diff -u -p -r1.15 nbsdelf.mh
--- config/i386/nbsdelf.mh 22 Feb 2004 16:20:22 -0000 1.15
+++ config/i386/nbsdelf.mh 27 Jun 2004 16:21:45 -0000
@@ -1,4 +1,7 @@
 # Host: NetBSD/i386 ELF
-NATDEPFILES= fork-child.o infptrace.o inftarg.o i386bsd-nat.o
+NATDEPFILES= fork-child.o infptrace.o inftarg.o \
+	i386bsd-nat.o i386nbsd-nat.o bsd-kvm.o
 NAT_FILE= nm-nbsd.h
 XM_FILE= xm-nbsd.h
+
+LOADLIBES= -lkvm
Index: config/i386/obsd.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/obsd.mh,v
retrieving revision 1.8
diff -u -p -r1.8 obsd.mh
--- config/i386/obsd.mh 22 Feb 2004 16:20:22 -0000 1.8
+++ config/i386/obsd.mh 27 Jun 2004 16:21:45 -0000
@@ -1,4 +1,8 @@
 # Host: OpenBSD/i386 ELF
-NATDEPFILES= fork-child.o infptrace.o inftarg.o i386bsd-nat.o i386obsd-nat.o
+NATDEPFILES= fork-child.o infptrace.o inftarg.o \
+	i386bsd-nat.o i386obsd-nat.o i386nbsd-nat.o bsd-kvm.o
 NAT_FILE= nm-obsd.h
 XM_FILE= xm-i386.h
+
+LOADLIBES= -lkvm
+


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] Add libkvm interface support for NetBSD/i386 and OpenBSD/i386
  2004-06-27 16:23 [PATCH] Add libkvm interface support for NetBSD/i386 and OpenBSD/i386 Mark Kettenis
@ 2004-06-27 16:34 ` Marcel Moolenaar
  2004-06-27 17:02   ` Mark Kettenis
  0 siblings, 1 reply; 6+ messages in thread
From: Marcel Moolenaar @ 2004-06-27 16:34 UTC (permalink / raw)
  To: Mark Kettenis; +Cc: gdb-patches

On Sun, Jun 27, 2004 at 06:23:04PM +0200, Mark Kettenis wrote:
> +
> +     we reconstruct the register state as it would look when we just
> +     returned from cpu_switch().  */
> +

Question: since this will do backtraces in the kernel, are there
plans to improve the frame sniffers (or frame sniffer framework)
to allow this code to add a sniffer for trapframes so that it's
possible to trace across them (if applicable) and also to improve
the termination of traces in the context of non-standard frames?

-- 
 Marcel Moolenaar	  USPA: A-39004		 marcel@xcllnt.net


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] Add libkvm interface support for NetBSD/i386 and OpenBSD/i386
  2004-06-27 16:34 ` Marcel Moolenaar
@ 2004-06-27 17:02   ` Mark Kettenis
  2004-06-27 17:39     ` Marcel Moolenaar
  0 siblings, 1 reply; 6+ messages in thread
From: Mark Kettenis @ 2004-06-27 17:02 UTC (permalink / raw)
  To: marcel; +Cc: gdb-patches

   Date: Sun, 27 Jun 2004 09:34:14 -0700
   From: Marcel Moolenaar <marcel@xcllnt.net>

   On Sun, Jun 27, 2004 at 06:23:04PM +0200, Mark Kettenis wrote:
   > +
   > +     we reconstruct the register state as it would look when we just
   > +     returned from cpu_switch().  */
   > +

   Question: since this will do backtraces in the kernel, are there
   plans to improve the frame sniffers (or frame sniffer framework)
   to allow this code to add a sniffer for trapframes so that it's
   possible to trace across them (if applicable) and also to improve
   the termination of traces in the context of non-standard frames?

Defenitely.  It should be pretty easy to add unwinders for trap and
interrupt frames.

Termination of traces is a bit of an issue.  If there is a fool-proof
way to detect the end of a frame-chain, then we should defenitely use
it.  When debugging the kernel you'd probably want to terminate on
frames that cross the protection boundary between user-space and
kernel-space.

Mark


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] Add libkvm interface support for NetBSD/i386 and OpenBSD/i386
  2004-06-27 17:02   ` Mark Kettenis
@ 2004-06-27 17:39     ` Marcel Moolenaar
  2004-06-27 19:02       ` Daniel Jacobowitz
  2004-06-27 20:25       ` Mark Kettenis
  0 siblings, 2 replies; 6+ messages in thread
From: Marcel Moolenaar @ 2004-06-27 17:39 UTC (permalink / raw)
  To: Mark Kettenis; +Cc: gdb-patches

On Sun, Jun 27, 2004 at 07:01:58PM +0200, Mark Kettenis wrote:
> 
>    Question: since this will do backtraces in the kernel, are there
>    plans to improve the frame sniffers (or frame sniffer framework)
>    to allow this code to add a sniffer for trapframes so that it's
>    possible to trace across them (if applicable) and also to improve
>    the termination of traces in the context of non-standard frames?
> 
> Defenitely.  It should be pretty easy to add unwinders for trap and
> interrupt frames.

In a sense, yes. I needed to add a sniffer in some other context, but
had to tweak the framework a bit to allow me to add the sniffer before
the last sniffer (i.e. the default sniffer). Without that tweak the
default sniffer was tried before mine and since the default sniffer
always takes the frame, mine ended up not being used at all. Not a
big issue, but something that requires a bit of thought and rewrite
to work well in a more dynamic context. In my case the following
hack sufficed:

/* Insert a predicate before the last in the table.  */
static void
penultimate_predicate (struct frame_unwind_table *table,
                  frame_unwind_sniffer_ftype *sniffer)
{
  if (table->nr > 0)
    {
      table->sniffer = xrealloc (table->sniffer, (table->nr + 1)
                                 * sizeof (frame_unwind_sniffer_ftype *));
      table->sniffer[table->nr] = table->sniffer[table->nr - 1];
      table->sniffer[table->nr - 1] = sniffer;
      table->nr++;
    }
  else
    append_predicate(table, sniffer);
}

:)

> Termination of traces is a bit of an issue.  If there is a fool-proof
> way to detect the end of a frame-chain, then we should defenitely use
> it.  When debugging the kernel you'd probably want to terminate on
> frames that cross the protection boundary between user-space and
> kernel-space.

I think the frame sniffers can help here. However, I don't think GDB
should have all the various and weird sniffers embedded, because they
tend to be highly volatile. For example: some frames are known only
by the bounds of the function and thus can be detected only by the PC.
This can be different for every recompilation of the system to which
it applies (in theory).
In general it requires knowledge that goes beyond the ABI and runtime
specs. and it might be a good idea to off-load this to MI or CLI
clients or provide hooks so that one can easily "plug" these in.

The same would apply to the unwind library on ia64. It's easy enough
to label a frame with unwind information, but knowing what to do with
such a frame may require more knowledge than what you like the unwind
library to have. Hooks to allow some "external" code to deal with it
would probably be the most flexible solution.

-- 
 Marcel Moolenaar	  USPA: A-39004		 marcel@xcllnt.net


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] Add libkvm interface support for NetBSD/i386 and OpenBSD/i386
  2004-06-27 17:39     ` Marcel Moolenaar
@ 2004-06-27 19:02       ` Daniel Jacobowitz
  2004-06-27 20:25       ` Mark Kettenis
  1 sibling, 0 replies; 6+ messages in thread
From: Daniel Jacobowitz @ 2004-06-27 19:02 UTC (permalink / raw)
  To: Marcel Moolenaar; +Cc: Mark Kettenis, gdb-patches

On Sun, Jun 27, 2004 at 10:38:54AM -0700, Marcel Moolenaar wrote:
> The same would apply to the unwind library on ia64. It's easy enough
> to label a frame with unwind information, but knowing what to do with
> such a frame may require more knowledge than what you like the unwind
> library to have. Hooks to allow some "external" code to deal with it
> would probably be the most flexible solution.

I think the best thing to do is to allow these to be written in some
sort of scripting language - that wouldn't elegantly allow moving
libunwind support out of GDB unless we used a scripting language that
supported dlopen, but it would be good for other things.

-- 
Daniel Jacobowitz


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] Add libkvm interface support for NetBSD/i386 and OpenBSD/i386
  2004-06-27 17:39     ` Marcel Moolenaar
  2004-06-27 19:02       ` Daniel Jacobowitz
@ 2004-06-27 20:25       ` Mark Kettenis
  1 sibling, 0 replies; 6+ messages in thread
From: Mark Kettenis @ 2004-06-27 20:25 UTC (permalink / raw)
  To: marcel; +Cc: gdb-patches

   Date: Sun, 27 Jun 2004 10:38:54 -0700
   From: Marcel Moolenaar <marcel@xcllnt.net>

   > Defenitely.  It should be pretty easy to add unwinders for trap and
   > interrupt frames.

   In a sense, yes. I needed to add a sniffer in some other context, but
   had to tweak the framework a bit to allow me to add the sniffer before
   the last sniffer (i.e. the default sniffer). Without that tweak the
   default sniffer was tried before mine and since the default sniffer
   always takes the frame, mine ended up not being used at all. Not a
   big issue, but something that requires a bit of thought and rewrite
   to work well in a more dynamic context. In my case the following
   hack sufficed:

   /* Insert a predicate before the last in the table.  */
   static void
   penultimate_predicate (struct frame_unwind_table *table,
		     frame_unwind_sniffer_ftype *sniffer)
   {
     if (table->nr > 0)
       {
	 table->sniffer = xrealloc (table->sniffer, (table->nr + 1)
				    * sizeof (frame_unwind_sniffer_ftype *));
	 table->sniffer[table->nr] = table->sniffer[table->nr - 1];
	 table->sniffer[table->nr - 1] = sniffer;
	 table->nr++;
       }
     else
       append_predicate(table, sniffer);
   }

   :)

Hmm.  Such a hack shouldn't be necessary.  You might need to
re-arrange some of the code a bit though.  Take a look at how the
unwinders are handled on i386/amd64.

   > Termination of traces is a bit of an issue.  If there is a fool-proof
   > way to detect the end of a frame-chain, then we should defenitely use
   > it.  When debugging the kernel you'd probably want to terminate on
   > frames that cross the protection boundary between user-space and
   > kernel-space.

   I think the frame sniffers can help here. However, I don't think GDB
   should have all the various and weird sniffers embedded, because they
   tend to be highly volatile. For example: some frames are known only
   by the bounds of the function and thus can be detected only by the PC.
   This can be different for every recompilation of the system to which
   it applies (in theory).
   In general it requires knowledge that goes beyond the ABI and runtime
   specs. and it might be a good idea to off-load this to MI or CLI
   clients or provide hooks so that one can easily "plug" these in.

Many of these special cases can be handled by adding unwind
information to the code.  The latest gas has directives to make
generating CFI for assembler code much easier.

   The same would apply to the unwind library on ia64. It's easy enough
   to label a frame with unwind information, but knowing what to do with
   such a frame may require more knowledge than what you like the unwind
   library to have. Hooks to allow some "external" code to deal with it
   would probably be the most flexible solution.

This only makes sense if it is possible to define a sane interface
between GDB and the "external" code.  Otherwise keeping things
synchronized becomes a *really big* problem.

Mark


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2004-06-27 20:25 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-06-27 16:23 [PATCH] Add libkvm interface support for NetBSD/i386 and OpenBSD/i386 Mark Kettenis
2004-06-27 16:34 ` Marcel Moolenaar
2004-06-27 17:02   ` Mark Kettenis
2004-06-27 17:39     ` Marcel Moolenaar
2004-06-27 19:02       ` Daniel Jacobowitz
2004-06-27 20:25       ` Mark Kettenis

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox