diff options
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 12 | ||||
-rw-r--r-- | gdb/Makefile.in | 4 | ||||
-rw-r--r-- | gdb/amd64fbsd-tdep.c | 70 | ||||
-rw-r--r-- | gdb/config/i386/fbsd64.mt | 2 | ||||
-rw-r--r-- | gdb/i386fbsd-tdep.c | 2 |
5 files changed, 85 insertions, 5 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a9d35b1..521d0f8 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2005-01-16 Mark Kettenis <kettenis@gnu.org> + + * amd64fbsd-tdep.c: Update copyright year. Include "gdb_assert.h" + and "bsd-uthread.h". + (amd64fbsd_jmp_buf_reg_offset): New variable. + (amd64fbsd_supply_uthread, amd64fbsd_collect_uthread): New + functions. + (amd64fbsd_init_abi): Set supply_uthread and collect_uthread. + * i386fbsd-tdep.c: Fix typo. + * Makefile.in (amd64fbsd-tdep.o): Update dependencies. + * config/i386/fbsd64.mt (TDEPFILES): Add bsd-uthread.o. + 2005-01-16 Andrew Cagney <cagney@gnu.org> * cli/cli-script.c: Include "exceptions.h". diff --git a/gdb/Makefile.in b/gdb/Makefile.in index d80091b..2fdfa08 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -1676,8 +1676,8 @@ amd64fbsd-nat.o: amd64fbsd-nat.c $(defs_h) $(inferior_h) $(regcache_h) \ $(target_h) $(gdb_assert_h) $(fbsd_nat_h) $(amd64_tdep_h) \ $(amd64_nat_h) $(bsd_kvm_h) amd64fbsd-tdep.o: amd64fbsd-tdep.c $(defs_h) $(arch_utils_h) $(frame_h) \ - $(gdbcore_h) $(regcache_h) $(osabi_h) $(gdb_string_h) \ - $(amd64_tdep_h) $(solib_svr4_h) + $(gdbcore_h) $(regcache_h) $(osabi_h) $(gdb_assert_h) \ + $(gdb_string_h) $(amd64_tdep_h) $(bsd_uthread_h) $(solib_svr4_h) amd64-linux-nat.o: amd64-linux-nat.c $(defs_h) $(inferior_h) $(gdbcore_h) \ $(regcache_h) $(linux_nat_h) $(gdb_assert_h) $(gdb_string_h) \ $(gdb_proc_service_h) $(gregset_h) $(amd64_tdep_h) \ diff --git a/gdb/amd64fbsd-tdep.c b/gdb/amd64fbsd-tdep.c index e4e02ab..7d32894 100644 --- a/gdb/amd64fbsd-tdep.c +++ b/gdb/amd64fbsd-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for FreeBSD/amd64. - Copyright 2003, 2004 Free Software Foundation, Inc. + Copyright 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of GDB. @@ -26,9 +26,11 @@ #include "regcache.h" #include "osabi.h" +#include "gdb_assert.h" #include "gdb_string.h" #include "amd64-tdep.h" +#include "bsd-uthread.h" #include "solib-svr4.h" /* Support for signal handlers. */ @@ -118,6 +120,68 @@ int amd64fbsd_sc_reg_offset[] = -1 /* %gs */ }; +/* From /usr/src/lib/libc/amd64/gen/_setjmp.S. */ +static int amd64fbsd_jmp_buf_reg_offset[] = +{ + -1, /* %rax */ + 1 * 8, /* %rbx */ + -1, /* %rcx */ + -1, /* %rdx */ + -1, /* %rsi */ + -1, /* %rdi */ + 3 * 8, /* %rbp */ + 2 * 8, /* %rsp */ + -1, /* %r8 ... */ + -1, + -1, + -1, /* ... %r11 */ + 4 * 8, /* %r12 ... */ + 5 * 8, + 6 * 8, + 7 * 8, /* ... %r15 */ + 0 * 8 /* %rip */ +}; + +static void +amd64fbsd_supply_uthread (struct regcache *regcache, + int regnum, CORE_ADDR addr) +{ + char buf[8]; + int i; + + gdb_assert (regnum >= -1); + + for (i = 0; i < ARRAY_SIZE (amd64fbsd_jmp_buf_reg_offset); i++) + { + if (amd64fbsd_jmp_buf_reg_offset[i] != -1 + && (regnum == -1 || regnum == i)) + { + read_memory (addr + amd64fbsd_jmp_buf_reg_offset[i], buf, 8); + regcache_raw_supply (regcache, i, buf); + } + } +} + +static void +amd64fbsd_collect_uthread (const struct regcache *regcache, + int regnum, CORE_ADDR addr) +{ + char buf[8]; + int i; + + gdb_assert (regnum >= -1); + + for (i = 0; i < ARRAY_SIZE (amd64fbsd_jmp_buf_reg_offset); i++) + { + if (amd64fbsd_jmp_buf_reg_offset[i] != -1 + && (regnum == -1 || regnum == i)) + { + regcache_raw_collect (regcache, i, buf); + write_memory (addr + amd64fbsd_jmp_buf_reg_offset[i], buf, 8); + } + } +} + void amd64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { @@ -138,6 +202,10 @@ amd64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) tdep->sc_reg_offset = amd64fbsd_sc_reg_offset; tdep->sc_num_regs = ARRAY_SIZE (amd64fbsd_sc_reg_offset); + /* FreeBSD provides a user-level threads implementation. */ + bsd_uthread_set_supply_uthread (gdbarch, amd64fbsd_supply_uthread); + bsd_uthread_set_collect_uthread (gdbarch, amd64fbsd_collect_uthread); + /* FreeBSD uses SVR4-style shared libraries. */ set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); diff --git a/gdb/config/i386/fbsd64.mt b/gdb/config/i386/fbsd64.mt index 07fbf5a..430befa 100644 --- a/gdb/config/i386/fbsd64.mt +++ b/gdb/config/i386/fbsd64.mt @@ -1,6 +1,6 @@ # Target: FreeBSD/amd64 TDEPFILES= amd64-tdep.o amd64fbsd-tdep.o \ 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 6b42abb..b2b6c73 100644 --- a/gdb/i386fbsd-tdep.c +++ b/gdb/i386fbsd-tdep.c @@ -70,7 +70,7 @@ static int i386fbsd_sc_reg_offset[] = 8 + 16 * 4 /* %gs */ }; -/* From /usr/src/lib/libc/i386/_setjmp.S. */ +/* From /usr/src/lib/libc/i386/gen/_setjmp.S. */ static int i386fbsd_jmp_buf_reg_offset[] = { -1, /* %eax */ |