This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[COMMIT] Add FreeBSD/i386 user-level threads support


This makes FreeBSD/i386 use the code I just committed.  Hopefully I
can do the other FreeBSD and OpenBSD systems soon.

Mark


Index: ChangeLog
from  Mark Kettenis  <kettenis@gnu.org>
 
	* i386fbsd-tdep.c: Update copyright year.  Include "gdbcore.h",
	"regcache.h", "gdb_assert.h" and "bsd-uthread.h".
	(i386fbsd_jmp_buf_reg_offset): New variable.
	(i386fbsd_supply_uthread, i386fbsd_collect_uthread): New
	functions.
	(i386fbsdaout_init_abi): Set supply_uthread and collect_uthread.
	* Makefile.in (i386fbsd-tdep.o): Update dependency.
	* config/i386/fbsd.mt (TDEPFILES): Add bsd-uthread.o.

Index: i386fbsd-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386fbsd-tdep.c,v
retrieving revision 1.4
diff -u -p -r1.4 i386fbsd-tdep.c
--- i386fbsd-tdep.c 31 Oct 2004 19:43:30 -0000 1.4
+++ i386fbsd-tdep.c 12 Jan 2005 21:51:34 -0000
@@ -1,6 +1,6 @@
 /* Target-dependent code for FreeBSD/i386.
 
-   Copyright 2003, 2004 Free Software Foundation, Inc.
+   Copyright 2003, 2004, 2005 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -21,10 +21,15 @@
 
 #include "defs.h"
 #include "arch-utils.h"
+#include "gdbcore.h"
 #include "osabi.h"
+#include "regcache.h"
+
+#include "gdb_assert.h"
 
 #include "i386-tdep.h"
 #include "i387-tdep.h"
+#include "bsd-uthread.h"
 #include "solib-svr4.h"
 
 /* FreeBSD 3.0-RELEASE or later.  */
@@ -65,6 +70,60 @@ static int i386fbsd_sc_reg_offset[] =
   8 + 16 * 4			/* %gs */
 };
 
+/* From /usr/src/lib/libc/i386/_setjmp.S.  */
+static int i386fbsd_jmp_buf_reg_offset[] =
+{
+  -1,				/* %eax */
+  -1,				/* %ecx */
+  -1,				/* %edx */
+  1 * 4,			/* %ebx */
+  2 * 4,			/* %esp */
+  3 * 4,			/* %ebp */
+  4 * 4,			/* %esi */
+  5 * 4,			/* %edi */
+  0 * 4				/* %eip */
+};
+
+static void
+i386fbsd_supply_uthread (struct regcache *regcache,
+			 int regnum, CORE_ADDR addr)
+{
+  char buf[4];
+  int i;
+
+  gdb_assert (regnum >= -1);
+
+  for (i = 0; i < ARRAY_SIZE (i386fbsd_jmp_buf_reg_offset); i++)
+    {
+      if (i386fbsd_jmp_buf_reg_offset[i] != -1
+	  && (regnum == -1 || regnum == i))
+	{
+	  read_memory (addr + i386fbsd_jmp_buf_reg_offset[i], buf, 4);
+	  regcache_raw_supply (regcache, i, buf);
+	}
+    }
+}
+
+static void
+i386fbsd_collect_uthread (const struct regcache *regcache,
+			  int regnum, CORE_ADDR addr)
+{
+  char buf[4];
+  int i;
+
+  gdb_assert (regnum >= -1);
+
+  for (i = 0; i < ARRAY_SIZE (i386fbsd_jmp_buf_reg_offset); i++)
+    {
+      if (i386fbsd_jmp_buf_reg_offset[i] != -1
+	  && (regnum == -1 || regnum == i))
+	{
+	  regcache_raw_collect (regcache, i, buf);
+	  write_memory (addr + i386fbsd_jmp_buf_reg_offset[i], buf, 4);
+	}
+    }
+}
+
 static void
 i386fbsdaout_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
@@ -90,6 +149,10 @@ i386fbsdaout_init_abi (struct gdbarch_in
   /* FreeBSD has a more complete `struct sigcontext'.  */
   tdep->sc_reg_offset = i386fbsd_sc_reg_offset;
   tdep->sc_num_regs = ARRAY_SIZE (i386fbsd_sc_reg_offset);
+
+  /* FreeBSD provides a user-level threads implementation.  */
+  bsd_uthread_set_supply_uthread (gdbarch, i386fbsd_supply_uthread);
+  bsd_uthread_set_collect_uthread (gdbarch, i386fbsd_collect_uthread);
 }
 
 static void
Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.686
diff -u -p -r1.686 Makefile.in
--- Makefile.in 12 Jan 2005 18:31:28 -0000 1.686
+++ Makefile.in 12 Jan 2005 21:51:37 -0000
@@ -641,6 +641,7 @@ bfd_target_h = bfd-target.h
 block_h = block.h
 breakpoint_h = breakpoint.h $(frame_h) $(value_h) $(gdb_events_h)
 bsd_kvm_h = bsd-kvm.h
+bsd_uthread_h = bsd-uthread.h
 buildsym_h = buildsym.h
 call_cmds_h = call-cmds.h
 charset_h = charset.h
@@ -1367,7 +1368,7 @@ ALLDEPFILES = \
 	arm-linux-nat.c arm-linux-tdep.c arm-tdep.c \
 	armnbsd-nat.c armnbsd-tdep.c \
 	avr-tdep.c \
-	bsd-kvm.c \
+	bsd-uthread.c bsd-kvm.c \
 	coff-solib.c \
 	core-regset.c core-aout.c corelow.c \
 	dcache.c exec.c \
@@ -1757,6 +1758,10 @@ breakpoint.o: breakpoint.c $(defs_h) $(s
 	$(objfiles_h) $(source_h) $(linespec_h) $(completer_h) $(gdb_h) \
 	$(ui_out_h) $(cli_script_h) $(gdb_assert_h) $(block_h) $(solist_h) \
 	$(observer_h) $(exceptions_h) $(gdb_events_h)
+bsd-uthread.o: bsd-uthread.c $(defs_h) $(gdb_core_h) $(gdbthread_h) \
+	$(inferior_h) $(objfiles_h) $(observer_h) $(regcache_h)	\
+	$(solist_h) $(symfile_h) $(target_h) $(gdb_assert_h) \
+	$(gdb_obstack_h) $(bsd_uthread_h)
 bsd-kvm.o: bsd-kvm.c $(defs_h) $(cli_cmds_h) $(command_h) $(frame_h) \
 	$(regcache_h) $(target_h) $(value_h) $(gdbcore_h) $(gdb_assert_h) \
 	$(readline_h) $(bsd_kvm_h)
@@ -2008,8 +2013,9 @@ i386-cygwin-tdep.o: i386-cygwin-tdep.c $
 i386fbsd-nat.o: i386fbsd-nat.c $(defs_h) $(inferior_h) $(regcache_h) \
 	$(target_h) $(fbsd_nat_h) $(i386_tdep_h) $(i386bsd_nat_h) \
 	$(bsd_kvm_h)
-i386fbsd-tdep.o: i386fbsd-tdep.c $(defs_h) $(arch_utils_h) $(osabi_h) \
-	$(i386_tdep_h) $(i387_tdep_h) $(solib_svr4_h)
+i386fbsd-tdep.o: i386fbsd-tdep.c $(defs_h) $(arch_utils_h) $(gdbcore_h) \
+	$(osabi_h) $(regcache_h) $(gdb_assert_h) $(i386_tdep_h) \
+	$(i387_tdep_h) $(bsd_uthread_h) $(solib_svr4_h)
 i386gnu-nat.o: i386gnu-nat.c $(defs_h) $(inferior_h) $(floatformat_h) \
 	$(regcache_h) $(gdb_assert_h) $(gdb_string_h) $(i386_tdep_h) \
 	$(gnu_nat_h) $(i387_tdep_h) $(gregset_h)
Index: config/i386/fbsd.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/fbsd.mt,v
retrieving revision 1.8
diff -u -p -r1.8 fbsd.mt
--- config/i386/fbsd.mt 13 Sep 2004 20:55:39 -0000 1.8
+++ config/i386/fbsd.mt 12 Jan 2005 21:51:37 -0000
@@ -1,4 +1,4 @@
 # Target: FreeBSD/i386
 TDEPFILES= i386-tdep.o i387-tdep.o i386bsd-tdep.o i386fbsd-tdep.o \
-	corelow.o solib.o solib-svr4.o
+	bsd-uthread.o corelow.o solib.o solib-svr4.o
 DEPRECATED_TM_FILE= solib.h


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]