diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 067d49ef80..cb86d9c4cc 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,14 @@ 2005-01-12 Mark Kettenis + * 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. + * bsd-uthread.h: New file. * bsd-uthread.c: New file. * Makefile.in (bsd_uthread_h): New variable. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 71ffbc5ae2..66f189a7c7 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -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) $(symtab_h) $(frame_h) $(breakpoint_h) \ $(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 $(defs_h) $(osabi_h) $(gdb_string_h) \ 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) diff --git a/gdb/config/i386/fbsd.mt b/gdb/config/i386/fbsd.mt index 1a69e7fcd1..c837340507 100644 --- a/gdb/config/i386/fbsd.mt +++ b/gdb/config/i386/fbsd.mt @@ -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 diff --git a/gdb/i386fbsd-tdep.c b/gdb/i386fbsd-tdep.c index 50243bea8d..6b42abbd08 100644 --- a/gdb/i386fbsd-tdep.c +++ b/gdb/i386fbsd-tdep.c @@ -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_info info, struct gdbarch *gdbarch) /* 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