diff --git gdb/Makefile.in gdb/Makefile.in index 7937801..6122f16 100644 --- gdb/Makefile.in +++ gdb/Makefile.in @@ -691,6 +691,7 @@ ALL_TARGET_OBS = \ xtensa-config.o xtensa-tdep.o xtensa-linux-tdep.o \ glibc-tdep.o \ bsd-uthread.o \ + fbsd-threads.o \ nbsd-tdep.o obsd-tdep.o \ sol2-tdep.o \ solib-frv.o solib-svr4.o \ @@ -1366,7 +1367,7 @@ libgdb.a: $(LIBGDB_OBS) # Removing the old gdb first works better if it is running, at least on SunOS. gdb$(EXEEXT): gdb.o $(LIBGDB_OBS) $(ADD_DEPS) $(CDEPS) $(TDEPLIBS) rm -f gdb$(EXEEXT) - $(CC_LD) $(INTERNAL_LDFLAGS) $(WIN32LDAPP) \ + $(CC_LD) $(INTERNAL_LDFLAGS) $(WIN32LDAPP) -Wl,-E \ -o gdb$(EXEEXT) gdb.o $(LIBGDB_OBS) \ $(TDEPLIBS) $(TUI_LIBRARY) $(CLIBS) $(LOADLIBES) @@ -1639,7 +1640,7 @@ ALLDEPFILES = \ armnbsd-nat.c armbsd-tdep.c armnbsd-tdep.c armobsd-tdep.c \ avr-tdep.c \ bfin-linux-tdep.c bfin-tdep.c \ - bsd-uthread.c bsd-kvm.c \ + bsd-uthread.c fbsd-threads.c bsd-kvm.c \ core-regset.c \ dcache.c dicos-tdep.c darwin-nat.c \ exec.c \ diff --git gdb/amd64bsd-nat.c gdb/amd64bsd-nat.c index b1d4a0e..7f189f6 100644 --- gdb/amd64bsd-nat.c +++ gdb/amd64bsd-nat.c @@ -40,6 +40,19 @@ size_t amd64bsd_xsave_len; #endif +static pid_t +ptrace_pid (ptid_t ptid) +{ + pid_t pid; + +#ifdef __FreeBSD__ + pid = ptid_get_lwp (ptid); + if (pid == 0) +#endif + pid = ptid_get_pid (ptid); + return pid; +} + /* Fetch register REGNUM from the inferior. If REGNUM is -1, do this for all registers (including the floating-point registers). */ @@ -53,7 +66,7 @@ amd64bsd_fetch_inferior_registers (struct target_ops *ops, { struct reg regs; - if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); @@ -71,7 +84,7 @@ amd64bsd_fetch_inferior_registers (struct target_ops *ops, if (amd64bsd_xsave_len != 0) { xstateregs = alloca (amd64bsd_xsave_len); - if (ptrace (PT_GETXSTATE, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETXSTATE, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xstateregs, 0) == -1) perror_with_name (_("Couldn't get extended state status")); @@ -80,7 +93,7 @@ amd64bsd_fetch_inferior_registers (struct target_ops *ops, } #endif - if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETFPREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get floating point status")); @@ -103,11 +116,11 @@ amd64bsd_store_inferior_registers (struct target_ops *ops, memset( ®s, 0, sizeof(struct reg)); memset( &oldregs, 0, sizeof(struct reg)); - if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); - ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + ptrace (PT_GETREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &oldregs, 0); amd64_collect_native_gregset (regcache, ®s, regnum); @@ -117,7 +130,7 @@ amd64bsd_store_inferior_registers (struct target_ops *ops, regs.r_rflags ^= (regs.r_rflags ^ oldregs.r_rflags ) & ~PSL_USERCHANGE; //printf(" allowed regs.r_rflags = 0x%8.8X\n", regs.r_rflags ); } - if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't write registers")); @@ -134,26 +147,26 @@ amd64bsd_store_inferior_registers (struct target_ops *ops, if (amd64bsd_xsave_len != 0) { xstateregs = alloca (amd64bsd_xsave_len); - if (ptrace (PT_GETXSTATE, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETXSTATE, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xstateregs, 0) == -1) perror_with_name (_("Couldn't get extended state status")); amd64_collect_xsave (regcache, regnum, xstateregs, 0); - if (ptrace (PT_SETXSTATE, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETXSTATE, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xstateregs, amd64bsd_xsave_len) == -1) perror_with_name (_("Couldn't write extended state status")); return; } #endif - if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETFPREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get floating point status")); amd64_collect_fxsave (regcache, regnum, &fpregs); - if (ptrace (PT_SETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETFPREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't write floating point status")); } @@ -183,7 +196,7 @@ amd64bsd_dr_get (ptid_t ptid, int regnum) { struct dbreg dbregs; - if (ptrace (PT_GETDBREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETDBREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) perror_with_name (_("Couldn't read debug registers")); @@ -195,7 +208,7 @@ amd64bsd_dr_set (int regnum, unsigned long value) { struct dbreg dbregs; - if (ptrace (PT_GETDBREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETDBREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) perror_with_name (_("Couldn't get debug registers")); @@ -206,7 +219,7 @@ amd64bsd_dr_set (int regnum, unsigned long value) DBREG_DRX ((&dbregs), regnum) = value; - if (ptrace (PT_SETDBREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETDBREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) perror_with_name (_("Couldn't write debug registers")); } diff --git gdb/amd64fbsd-nat.c gdb/amd64fbsd-nat.c index a721f48..2534360 100644 --- gdb/amd64fbsd-nat.c +++ gdb/amd64fbsd-nat.c @@ -18,6 +18,7 @@ along with this program. If not, see . */ #include "defs.h" +#include "gregset.h" #include "inferior.h" #include "regcache.h" #include "target.h" @@ -92,6 +93,46 @@ static int amd64fbsd32_r_reg_offset[I386_NUM_GREGS] = }; +/* Transfering the registers between GDB, inferiors and core files. */ + +/* Fill GDB's register array with the general-purpose register values + in *GREGSETP. */ + +void +supply_gregset (struct regcache *regcache, const gregset_t *gregsetp) +{ + amd64_supply_native_gregset (regcache, gregsetp, -1); +} + +/* Fill register REGNUM (if it is a general-purpose register) in + *GREGSETPS with the value in GDB's register array. If REGNUM is -1, + do this for all registers. */ + +void +fill_gregset (const struct regcache *regcache, gdb_gregset_t *gregsetp, int regnum) +{ + amd64_collect_native_gregset (regcache, gregsetp, regnum); +} + +/* Fill GDB's register array with the floating-point register values + in *FPREGSETP. */ + +void +supply_fpregset (struct regcache *regcache, const fpregset_t *fpregsetp) +{ + amd64_supply_fxsave (regcache, -1, fpregsetp); +} + +/* Fill register REGNUM (if it is a floating-point register) in + *FPREGSETP with the value in GDB's register array. If REGNUM is -1, + do this for all registers. */ + +void +fill_fpregset (const struct regcache *regcache, gdb_fpregset_t *fpregsetp, int regnum) +{ + amd64_collect_fxsave (regcache, regnum, fpregsetp); +} + /* Support for debugging kernel virtual memory images. */ #include diff --git gdb/amd64fbsd-tdep.c gdb/amd64fbsd-tdep.c index 52705d9..6d48d8f 100644 --- gdb/amd64fbsd-tdep.c +++ gdb/amd64fbsd-tdep.c @@ -28,7 +28,6 @@ #include "x86-xstate.h" #include "amd64-tdep.h" -#include "bsd-uthread.h" #include "fbsd-tdep.h" #include "solib-svr4.h" @@ -226,46 +225,6 @@ amd64fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch, } static void -amd64fbsd_supply_uthread (struct regcache *regcache, - int regnum, CORE_ADDR addr) -{ - gdb_byte 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) -{ - gdb_byte 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); - } - } -} - -static void amd64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); @@ -298,10 +257,6 @@ amd64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_gdbarch_core_read_description (gdbarch, amd64fbsd_core_read_description); - /* 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 gdb/configure.tgt gdb/configure.tgt index 7fdd34e..64afacf 100644 --- gdb/configure.tgt +++ gdb/configure.tgt @@ -187,7 +187,7 @@ i[34567]86-*-dicos*) i[34567]86-*-freebsd* | i[34567]86-*-kfreebsd*-gnu) # Target: FreeBSD/i386 gdb_target_obs="i386-tdep.o i387-tdep.o i386bsd-tdep.o i386fbsd-tdep.o \ - bsd-uthread.o fbsd-tdep.o solib-svr4.o" + fbsd-threads.o fbsd-tdep.o solib-svr4.o" ;; i[34567]86-*-netbsd* | i[34567]86-*-knetbsd*-gnu) # Target: NetBSD/i386 @@ -410,7 +410,7 @@ nios2*-*-*) powerpc*-*-freebsd*) # Target: FreeBSD/powerpc gdb_target_obs="rs6000-tdep.o ppc-sysv-tdep.o ppc64-tdep.o \ - ppcfbsd-tdep.o fbsd-tdep.o solib-svr4.o \ + ppcfbsd-tdep.o fbsd-threads.o fbsd-tdep.o solib-svr4.o \ ravenscar-thread.o ppc-ravenscar-thread.o" ;; @@ -663,7 +663,7 @@ x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu) # Target: FreeBSD/amd64 gdb_target_obs="amd64-tdep.o amd64fbsd-tdep.o i386-tdep.o \ i387-tdep.o i386bsd-tdep.o i386fbsd-tdep.o \ - bsd-uthread.o fbsd-tdep.o solib-svr4.o" + fbsd-threads.o fbsd-tdep.o solib-svr4.o" ;; x86_64-*-mingw* | x86_64-*-cygwin*) # Target: MingW/amd64 diff --git gdb/i386bsd-nat.c gdb/i386bsd-nat.c index ac8a19b..cb2d50e 100644 --- gdb/i386bsd-nat.c +++ gdb/i386bsd-nat.c @@ -87,9 +87,22 @@ size_t i386bsd_xsave_len; #endif +static pid_t +ptrace_pid (ptid_t ptid) +{ + pid_t pid; + +#ifdef __FreeBSD__ + pid = ptid_get_lwp (ptid); + if (pid == 0) +#endif + pid = ptid_get_pid (ptid); + return pid; +} + /* Supply the general-purpose registers in GREGS, to REGCACHE. */ -static void +void i386bsd_supply_gregset (struct regcache *regcache, const void *gregs) { const char *regs = gregs; @@ -108,7 +121,7 @@ i386bsd_supply_gregset (struct regcache *regcache, const void *gregs) GREGS. If REGNUM is -1, collect and store all appropriate registers. */ -static void +void i386bsd_collect_gregset (const struct regcache *regcache, void *gregs, int regnum) { @@ -138,7 +151,7 @@ i386bsd_fetch_inferior_registers (struct target_ops *ops, { struct reg regs; - if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); @@ -160,7 +173,7 @@ i386bsd_fetch_inferior_registers (struct target_ops *ops, char *xstateregs; xstateregs = alloca (i386bsd_xsave_len); - if (ptrace (PT_GETXSTATE, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETXSTATE, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xstateregs, 0) == -1) perror_with_name (_("Couldn't get extended state status")); @@ -171,7 +184,7 @@ i386bsd_fetch_inferior_registers (struct target_ops *ops, #ifdef HAVE_PT_GETXMMREGS if (have_ptrace_xmmregs != 0 - && ptrace(PT_GETXMMREGS, ptid_get_pid (inferior_ptid), + && ptrace(PT_GETXMMREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xmmregs, 0) == 0) { have_ptrace_xmmregs = 1; @@ -181,7 +194,7 @@ i386bsd_fetch_inferior_registers (struct target_ops *ops, { have_ptrace_xmmregs = 0; #endif - if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETFPREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get floating point status")); @@ -203,13 +216,13 @@ i386bsd_store_inferior_registers (struct target_ops *ops, { struct reg regs; - if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); i386bsd_collect_gregset (regcache, ®s, regnum); - if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't write registers")); @@ -230,13 +243,13 @@ i386bsd_store_inferior_registers (struct target_ops *ops, char *xstateregs; xstateregs = alloca (i386bsd_xsave_len); - if (ptrace (PT_GETXSTATE, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETXSTATE, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xstateregs, 0) == -1) perror_with_name (_("Couldn't get extended state status")); i387_collect_xsave (regcache, -1, xstateregs, 0); - if (ptrace (PT_SETXSTATE, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETXSTATE, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xstateregs, i386bsd_xsave_len) == -1) perror_with_name (_("Couldn't write extended state status")); return; @@ -245,14 +258,14 @@ i386bsd_store_inferior_registers (struct target_ops *ops, #ifdef HAVE_PT_GETXMMREGS if (have_ptrace_xmmregs != 0 - && ptrace(PT_GETXMMREGS, ptid_get_pid (inferior_ptid), + && ptrace(PT_GETXMMREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xmmregs, 0) == 0) { have_ptrace_xmmregs = 1; i387_collect_fxsave (regcache, regnum, xmmregs); - if (ptrace (PT_SETXMMREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETXMMREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xmmregs, 0) == -1) perror_with_name (_("Couldn't write XMM registers")); } @@ -260,13 +273,13 @@ i386bsd_store_inferior_registers (struct target_ops *ops, { have_ptrace_xmmregs = 0; #endif - if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETFPREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get floating point status")); i387_collect_fsave (regcache, regnum, &fpregs); - if (ptrace (PT_SETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETFPREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't write floating point status")); #ifdef HAVE_PT_GETXMMREGS @@ -305,7 +318,7 @@ i386bsd_dr_get (ptid_t ptid, int regnum) { struct dbreg dbregs; - if (ptrace (PT_GETDBREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETDBREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) perror_with_name (_("Couldn't read debug registers")); @@ -317,7 +330,7 @@ i386bsd_dr_set (int regnum, unsigned int value) { struct dbreg dbregs; - if (ptrace (PT_GETDBREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETDBREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) perror_with_name (_("Couldn't get debug registers")); @@ -328,7 +341,7 @@ i386bsd_dr_set (int regnum, unsigned int value) DBREG_DRX ((&dbregs), regnum) = value; - if (ptrace (PT_SETDBREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETDBREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) perror_with_name (_("Couldn't write debug registers")); } diff --git gdb/i386bsd-nat.h gdb/i386bsd-nat.h index 2f50c32..bf7f2ff 100644 --- gdb/i386bsd-nat.h +++ gdb/i386bsd-nat.h @@ -38,6 +38,14 @@ extern CORE_ADDR i386bsd_dr_get_addr (int regnum); extern unsigned long i386bsd_dr_get_status (void); +/* low level i386 register functions used in i386fbsd-nat.c. */ + +extern void i386bsd_supply_gregset (struct regcache *regcache, + const void *gregs); + +extern void i386bsd_collect_gregset (const struct regcache *regcache, + void *gregs, int regnum); + extern unsigned long i386bsd_dr_get_control (void); #endif /* i386bsd-nat.h */ diff --git gdb/i386fbsd-nat.c gdb/i386fbsd-nat.c index a205a26..29b9444 100644 --- gdb/i386fbsd-nat.c +++ gdb/i386fbsd-nat.c @@ -21,6 +21,7 @@ #include "inferior.h" #include "regcache.h" #include "target.h" +#include "gregset.h" #include #include @@ -81,6 +82,49 @@ i386fbsd_resume (struct target_ops *ops, } +/* Transfering the registers between GDB, inferiors and core files. */ + +/* Fill GDB's register array with the general-purpose register values + in *GREGSETP. */ + +void +supply_gregset (struct regcache *regcache, const gregset_t *gregsetp) +{ + i386bsd_supply_gregset (regcache, gregsetp); +} + +/* Fill register REGNUM (if it is a general-purpose register) in + *GREGSETPS with the value in GDB's register array. If REGNUM is -1, + do this for all registers. */ + +void +fill_gregset (const struct regcache *regcache, gdb_gregset_t *gregsetp, int regnum) +{ + i386bsd_collect_gregset (regcache, gregsetp, regnum); +} + +#include "i387-tdep.h" + +/* Fill GDB's register array with the floating-point register values + in *FPREGSETP. */ + +void +supply_fpregset (struct regcache *regcache, const fpregset_t *fpregsetp) +{ + i387_supply_fsave (regcache, -1, fpregsetp); +} + +/* Fill register REGNUM (if it is a floating-point register) in + *FPREGSETP with the value in GDB's register array. If REGNUM is -1, + do this for all registers. */ + +void +fill_fpregset (const struct regcache *regcache, gdb_fpregset_t *fpregsetp, int regnum) +{ + i387_collect_fsave (regcache, regnum, fpregsetp); +} + + /* Support for debugging kernel virtual memory images. */ #include diff --git gdb/i386fbsd-tdep.c gdb/i386fbsd-tdep.c index 99e08cb..5bb15f6 100644 --- gdb/i386fbsd-tdep.c +++ gdb/i386fbsd-tdep.c @@ -28,7 +28,6 @@ #include "i386-tdep.h" #include "i387-tdep.h" -#include "bsd-uthread.h" #include "fbsd-tdep.h" #include "solib-svr4.h" @@ -333,46 +332,6 @@ i386fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch, } static void -i386fbsd_supply_uthread (struct regcache *regcache, - int regnum, CORE_ADDR addr) -{ - gdb_byte 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) -{ - gdb_byte 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) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); @@ -399,10 +358,6 @@ 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 diff --git gdb/ppcfbsd-nat.c gdb/ppcfbsd-nat.c index 778b4bb..fa9285f 100644 --- gdb/ppcfbsd-nat.c +++ gdb/ppcfbsd-nat.c @@ -37,6 +37,19 @@ #include "inf-ptrace.h" #include "bsd-kvm.h" +static pid_t +ptrace_pid (ptid_t ptid) +{ + pid_t pid; + +#ifdef __FreeBSD__ + pid = ptid_get_lwp (ptid); + if (pid == 0) +#endif + pid = ptid_get_pid (ptid); + return pid; +} + /* Fill GDB's register array with the general-purpose register values in *GREGSETP. */ @@ -121,7 +134,7 @@ ppcfbsd_fetch_inferior_registers (struct target_ops *ops, { gdb_gregset_t regs; - if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); @@ -132,7 +145,7 @@ ppcfbsd_fetch_inferior_registers (struct target_ops *ops, const struct regset *fpregset = ppc_fbsd_fpregset (); gdb_fpregset_t fpregs; - if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETFPREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get FP registers")); @@ -149,13 +162,13 @@ ppcfbsd_store_inferior_registers (struct target_ops *ops, { gdb_gregset_t regs; - if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); fill_gregset (regcache, ®s, regno); - if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't write registers")); @@ -163,13 +176,13 @@ ppcfbsd_store_inferior_registers (struct target_ops *ops, { gdb_fpregset_t fpregs; - if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETFPREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get FP registers")); fill_fpregset (regcache, &fpregs, regno); - if (ptrace (PT_SETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETFPREGS, ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't set FP registers")); }