From owner-svn-ports-head@FreeBSD.ORG Wed Feb 18 19:24:17 2015 Return-Path: Delivered-To: svn-ports-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 6251C391; Wed, 18 Feb 2015 19:24:17 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 4A0DEA77; Wed, 18 Feb 2015 19:24:17 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t1IJOHMN055701; Wed, 18 Feb 2015 19:24:17 GMT (envelope-from jhb@FreeBSD.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t1IJOGJQ055693; Wed, 18 Feb 2015 19:24:16 GMT (envelope-from jhb@FreeBSD.org) Message-Id: <201502181924.t1IJOGJQ055693@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: jhb set sender to jhb@FreeBSD.org using -f From: John Baldwin Date: Wed, 18 Feb 2015 19:24:16 +0000 (UTC) To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r379311 - in head/devel/gdb: . files X-SVN-Group: ports-head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-ports-head@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: SVN commit messages for the ports tree for head List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 18 Feb 2015 19:24:17 -0000 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 . */ + + #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 +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 + + #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 + #include +@@ -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 +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 @@ -18,53 +17,6 @@ #include #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 @@ -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 ***