svn commit: r379311 - in head/devel/gdb: . files
John Baldwin
jhb at FreeBSD.org
Wed Feb 18 19:24:17 UTC 2015
Author: jhb (src,doc committer)
Date: Wed Feb 18 19:24:15 2015
New Revision: 379311
URL: https://svnweb.freebsd.org/changeset/ports/379311
QAT: https://qat.redports.org/buildarchive/r379311/
Log:
- Add support for XSAVE on amd64 and i386 using the recently added
PT_GETXSTATE_INFO and XSTATE core dump sections.
- Use kern.proc.sigtramp on i386 to fix unwinding across signal
frames.
- Change the amd64 FreeBSD ABI to return an i386 target description
when debugging a 32-bit process. This allows XSAVE debugging to
work for an i386 binary on amd64.
- Rework thread patches to pull all threads-related patches out of
the main port patches and into a single optional patch.
- Adjust the thread patches so that fbsd-threads.c passes register
requests for LWPs down to the native target instead of calling
ptrace directly. This allows XSAVE to work with threads without
any other changes. The x86 nat.c files now pass LWP IDs to
ptrace register operations (other platforms already did this).
The supply/collect regset stubs are now only needed to support
userland threads for libkse.
PR: 197501
Approved by: maintainer, bdrewery
Added:
head/devel/gdb/files/extrapatch-threads (contents, props changed)
head/devel/gdb/files/patch-xsave (contents, props changed)
Deleted:
head/devel/gdb/files/extrapatch-gdb-Makefile.in
head/devel/gdb/files/extrapatch-gdb-configure.tgt
head/devel/gdb/files/patch-gdb-i386bsd-nat.c
head/devel/gdb/files/patch-gdb-i386bsd-nat.h
head/devel/gdb/files/patch-gdb-i386fbsd-tdep.c
Modified:
head/devel/gdb/Makefile
head/devel/gdb/files/fbsd-threads.c
head/devel/gdb/files/patch-gdb-amd64fbsd-nat.c
head/devel/gdb/files/patch-gdb-amd64fbsd-tdep.c
head/devel/gdb/files/patch-gdb-i386fbsd-nat.c
Modified: head/devel/gdb/Makefile
==============================================================================
--- head/devel/gdb/Makefile Wed Feb 18 19:17:14 2015 (r379310)
+++ head/devel/gdb/Makefile Wed Feb 18 19:24:15 2015 (r379311)
@@ -3,6 +3,7 @@
PORTNAME= gdb
PORTVERSION= 7.8.2
+PORTREVISION= 1
CATEGORIES= devel
MASTER_SITES= GNU
@@ -69,11 +70,6 @@ TUI_CONFIGURE_ENABLE= tui
EXCLUDE+= readline
.endif
-.if ${PORT_OPTIONS:MTHREADS}
-EXTRA_PATCHES+= ${FILESDIR}/extrapatch-gdb-configure.tgt \
- ${FILESDIR}/extrapatch-gdb-Makefile.in
-.endif
-
.if ${ARCH} == "amd64"
CONFIGURE_TARGET= x86_64-portbld-freebsd${OSREL}
.endif
@@ -81,9 +77,9 @@ CONFIGURE_TARGET= x86_64-portbld-freebsd
post-patch:
@${REINPLACE_CMD} -e 's|$$| [GDB v${PORTVERSION} for FreeBSD]|' \
${WRKSRC}/gdb/version.in
-
.if ${PORT_OPTIONS:MTHREADS}
@${CP} ${FILESDIR}/fbsd-threads.c ${WRKSRC}/gdb/
+ @${PATCH} ${PATCH_ARGS} < ${FILESDIR}/extrapatch-threads
.endif
do-install:
Added: head/devel/gdb/files/extrapatch-threads
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/devel/gdb/files/extrapatch-threads Wed Feb 18 19:24:15 2015 (r379311)
@@ -0,0 +1,712 @@
+diff --git a/gdb/Makefile.in b/gdb/Makefile.in
+index ea27cf5..d17752f 100644
+--- gdb/Makefile.in
++++ gdb/Makefile.in
+@@ -668,6 +668,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-irix.o solib-svr4.o \
+@@ -1327,7 +1328,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)
+
+@@ -1600,7 +1601,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 a/gdb/amd64bsd-nat.c b/gdb/amd64bsd-nat.c
+index 9e6a0df..7aff6f0 100644
+--- gdb/amd64bsd-nat.c
++++ gdb/amd64bsd-nat.c
+@@ -41,6 +41,19 @@
+ size_t x86_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). */
+
+@@ -54,7 +67,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"));
+
+@@ -72,7 +85,7 @@ amd64bsd_fetch_inferior_registers (struct target_ops *ops,
+ if (x86_xsave_len != 0)
+ {
+ xstateregs = alloca(x86_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"));
+
+@@ -81,7 +94,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"));
+
+@@ -104,11 +117,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);
+
+@@ -118,7 +131,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"));
+
+@@ -135,26 +148,26 @@ amd64bsd_store_inferior_registers (struct target_ops *ops,
+ if (x86_xsave_len != 0)
+ {
+ xstateregs = alloca(x86_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, x86_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"));
+ }
+@@ -184,7 +197,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"));
+
+@@ -196,7 +209,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"));
+
+@@ -207,7 +220,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 a/gdb/amd64fbsd-nat.c b/gdb/amd64fbsd-nat.c
+index eea2472..9ce6a54 100644
+--- gdb/amd64fbsd-nat.c
++++ gdb/amd64fbsd-nat.c
+@@ -18,6 +18,7 @@
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ #include "defs.h"
++#include "gregset.h"
+ #include "inferior.h"
+ #include "regcache.h"
+ #include "target.h"
+@@ -95,6 +96,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 <machine/pcb.h>
+diff --git a/gdb/amd64fbsd-tdep.c b/gdb/amd64fbsd-tdep.c
+index 582ae50..8e07369 100644
+--- gdb/amd64fbsd-tdep.c
++++ gdb/amd64fbsd-tdep.c
+@@ -31,7 +31,6 @@
+ #include <string.h>
+
+ #include "amd64-tdep.h"
+-#include "bsd-uthread.h"
+ #include "solib-svr4.h"
+
+ /* Supported register note sections. */
+@@ -178,46 +177,6 @@ amd64fbsd_core_read_description (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);
+@@ -245,10 +204,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 a/gdb/configure.tgt b/gdb/configure.tgt
+index 01311b2..0929a25 100644
+--- gdb/configure.tgt
++++ gdb/configure.tgt
+@@ -189,7 +189,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 solib-svr4.o"
++ fbsd-threads.o solib-svr4.o"
+ ;;
+ i[34567]86-*-netbsd* | i[34567]86-*-knetbsd*-gnu)
+ # Target: NetBSD/i386
+@@ -415,7 +415,7 @@ nios2*-*-*)
+ powerpc*-*-freebsd*)
+ # Target: FreeBSD/powerpc
+ gdb_target_obs="rs6000-tdep.o ppc-sysv-tdep.o ppc64-tdep.o \
+- ppcfbsd-tdep.o solib-svr4.o \
++ ppcfbsd-tdep.o solib-svr4.o fbsd-threads.o \
+ ravenscar-thread.o ppc-ravenscar-thread.o"
+ ;;
+
+@@ -667,7 +667,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 solib-svr4.o"
++ fbsd-threads.o solib-svr4.o"
+ ;;
+ x86_64-*-mingw* | x86_64-*-cygwin*)
+ # Target: MingW/amd64
+diff --git a/gdb/i386bsd-nat.c b/gdb/i386bsd-nat.c
+index c26e830..246acdd 100644
+--- gdb/i386bsd-nat.c
++++ gdb/i386bsd-nat.c
+@@ -89,9 +89,22 @@ size_t x86_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;
+@@ -110,7 +123,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)
+ {
+@@ -140,7 +153,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"));
+
+@@ -162,7 +175,7 @@ i386bsd_fetch_inferior_registers (struct target_ops *ops,
+ char *xstateregs;
+
+ xstateregs = alloca(x86_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"));
+
+@@ -174,7 +187,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;
+@@ -184,7 +197,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"));
+
+@@ -206,13 +219,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"));
+
+@@ -233,13 +246,13 @@ i386bsd_store_inferior_registers (struct target_ops *ops,
+ char *xstateregs;
+
+ xstateregs = alloca(x86_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, x86_xsave_len) == -1)
+ perror_with_name (_("Couldn't write extended state status"));
+ }
+@@ -247,14 +260,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"));
+ }
+@@ -262,13 +275,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
+@@ -307,7 +320,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"));
+
+@@ -319,7 +332,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"));
+
+@@ -330,7 +343,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 a/gdb/i386bsd-nat.h b/gdb/i386bsd-nat.h
+index 044f530..2fca773 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 a/gdb/i386fbsd-nat.c b/gdb/i386fbsd-nat.c
+index b9620e1..71abcdf 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 <sys/types.h>
+ #include <sys/ptrace.h>
+@@ -82,6 +83,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 <machine/pcb.h>
+diff --git a/gdb/i386fbsd-tdep.c b/gdb/i386fbsd-tdep.c
+index 8f7109f..fcb85d8 100644
+--- gdb/i386fbsd-tdep.c
++++ gdb/i386fbsd-tdep.c
+@@ -30,7 +30,6 @@
+
+ #include "i386-tdep.h"
+ #include "i387-tdep.h"
+-#include "bsd-uthread.h"
+ #include "solib-svr4.h"
+
+ /* FreeBSD 3.0-RELEASE or later. */
+@@ -153,46 +152,6 @@ i386fbsd_core_read_description (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);
+@@ -217,10 +176,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 a/gdb/ppcfbsd-nat.c b/gdb/ppcfbsd-nat.c
+index 079bd12..74922f2 100644
+--- gdb/ppcfbsd-nat.c
++++ gdb/ppcfbsd-nat.c
+@@ -39,6 +39,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. */
+
+@@ -123,7 +136,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"));
+
+@@ -134,7 +147,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"));
+
+@@ -151,13 +164,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"));
+
+@@ -165,13 +178,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"));
+ }
Modified: head/devel/gdb/files/fbsd-threads.c
==============================================================================
--- head/devel/gdb/files/fbsd-threads.c Wed Feb 18 19:17:14 2015 (r379310)
+++ head/devel/gdb/files/fbsd-threads.c Wed Feb 18 19:24:15 2015 (r379311)
@@ -803,47 +803,6 @@ fbsd_thread_wait (struct target_ops *ops
}
static void
-fbsd_lwp_fetch_registers (struct target_ops *ops,
- struct regcache *regcache, int regnum)
-{
- gregset_t gregs;
- fpregset_t fpregs;
- lwpid_t lwp;
-#ifdef PT_GETXMMREGS
- char xmmregs[512];
-#endif
-
- if (!target_has_execution)
- {
- struct target_ops *beneath = find_target_beneath (ops);
-
- beneath->to_fetch_registers (ops, regcache, regnum);
- return;
- }
-
- lwp = GET_LWP (inferior_ptid);
-
- if (ptrace (PT_GETREGS, lwp, (caddr_t) &gregs, 0) == -1)
- error ("Cannot get lwp %d registers: %s\n", lwp, safe_strerror (errno));
- supply_gregset (regcache, &gregs);
-
-#ifdef PT_GETXMMREGS
- if (ptrace (PT_GETXMMREGS, lwp, xmmregs, 0) == 0)
- {
- i387_supply_fxsave (regcache, -1, xmmregs);
- }
- else
- {
-#endif
- if (ptrace (PT_GETFPREGS, lwp, (caddr_t) &fpregs, 0) == -1)
- error ("Cannot get lwp %d registers: %s\n ", lwp, safe_strerror (errno));
- supply_fpregset (regcache, &fpregs);
-#ifdef PT_GETXMMREGS
- }
-#endif
-}
-
-static void
fbsd_thread_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{
@@ -857,7 +816,9 @@ fbsd_thread_fetch_registers (struct targ
if (!IS_THREAD (inferior_ptid))
{
- fbsd_lwp_fetch_registers (ops, regcache, regnum);
+ struct target_ops *beneath = find_target_beneath (ops);
+
+ beneath->to_fetch_registers (ops, regcache, regnum);
return;
}
@@ -895,60 +856,6 @@ fbsd_thread_fetch_registers (struct targ
}
static void
-fbsd_lwp_store_registers (struct target_ops *ops,
- struct regcache *regcache, int regnum)
-{
- gregset_t gregs;
- fpregset_t fpregs;
- lwpid_t lwp;
-#ifdef PT_GETXMMREGS
- char xmmregs[512];
-#endif
-
- /* FIXME, is it possible ? */
- if (!IS_LWP (inferior_ptid))
- {
- struct target_ops *beneath = find_target_beneath (ops);
-
- beneath->to_store_registers (ops, regcache, regnum);
- return ;
- }
-
- lwp = GET_LWP (inferior_ptid);
- if (regnum != -1)
- if (ptrace (PT_GETREGS, lwp, (caddr_t) &gregs, 0) == -1)
- error ("Cannot get lwp %d registers: %s\n", lwp, safe_strerror (errno));
-
- fill_gregset (regcache, &gregs, regnum);
- if (ptrace (PT_SETREGS, lwp, (caddr_t) &gregs, 0) == -1)
- error ("Cannot set lwp %d registers: %s\n", lwp, safe_strerror (errno));
-
-#ifdef PT_GETXMMREGS
- if (regnum != -1)
- if (ptrace (PT_GETXMMREGS, lwp, xmmregs, 0) == -1)
- goto noxmm;
-
- i387_collect_fxsave (regcache, regnum, xmmregs);
- if (ptrace (PT_SETXMMREGS, lwp, xmmregs, 0) == -1)
- goto noxmm;
-
- return;
-
-noxmm:
-#endif
-
- if (regnum != -1)
- if (ptrace (PT_GETFPREGS, lwp, (caddr_t) &fpregs, 0) == -1)
- error ("Cannot get lwp %d float registers: %s\n", lwp,
- safe_strerror (errno));
-
- fill_fpregset (regcache, &fpregs, regnum);
- if (ptrace (PT_SETFPREGS, lwp, (caddr_t) &fpregs, 0) == -1)
- error ("Cannot set lwp %d float registers: %s\n", lwp,
- safe_strerror (errno));
-}
-
-static void
fbsd_thread_store_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{
@@ -962,7 +869,9 @@ fbsd_thread_store_registers (struct targ
if (!IS_THREAD (inferior_ptid))
{
- fbsd_lwp_store_registers (ops, regcache, regnum);
+ struct target_ops *beneath = find_target_beneath (ops);
+
+ beneath->to_store_registers (ops, regcache, regnum);
return;
}
Modified: head/devel/gdb/files/patch-gdb-amd64fbsd-nat.c
==============================================================================
--- head/devel/gdb/files/patch-gdb-amd64fbsd-nat.c Wed Feb 18 19:17:14 2015 (r379310)
+++ head/devel/gdb/files/patch-gdb-amd64fbsd-nat.c Wed Feb 18 19:24:15 2015 (r379311)
@@ -1,10 +1,9 @@
--- gdb/amd64fbsd-nat.c.orig 2014-06-11 18:34:41.000000000 +0200
+++ gdb/amd64fbsd-nat.c 2014-09-24 18:27:50.618458853 +0200
-@@ -21,13 +21,17 @@
+@@ -21,13 +21,16 @@
#include "inferior.h"
#include "regcache.h"
#include "target.h"
-+#include "gregset.h"
#include "gdb_assert.h"
#include <signal.h>
@@ -18,53 +17,6 @@
#include <machine/reg.h>
#include "fbsd-nat.h"
-@@ -93,6 +97,46 @@
- };
-
-
-+/* 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 <machine/pcb.h>
@@ -247,6 +291,10 @@
SC_RBP_OFFSET = offset;
Modified: head/devel/gdb/files/patch-gdb-amd64fbsd-tdep.c
==============================================================================
--- head/devel/gdb/files/patch-gdb-amd64fbsd-tdep.c Wed Feb 18 19:17:14 2015 (r379310)
+++ head/devel/gdb/files/patch-gdb-amd64fbsd-tdep.c Wed Feb 18 19:24:15 2015 (r379311)
@@ -1,13 +1,5 @@
--- gdb/amd64fbsd-tdep.c.orig 2010-01-01 02:31:29.000000000 -0500
+++ gdb/amd64fbsd-tdep.c 2011-01-05 17:27:29.264869000 -0500
-@@ -29,7 +29,6 @@
- #include "gdb_string.h"
-
- #include "amd64-tdep.h"
--#include "bsd-uthread.h"
- #include "solib-svr4.h"
-
- /* Support for signal handlers. */
@@ -40,12 +39,16 @@
static CORE_ADDR
amd64fbsd_sigcontext_addr (struct frame_info *this_frame)
@@ -26,61 +18,3 @@
return sp + 16;
}
-@@ -142,46 +145,6 @@
- };
-
- 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);
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-ports-all
mailing list