aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2013-11-26 19:54:12 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2013-11-26 19:54:12 +0000
commit0615c93b2c22b7b9b4f915345db9f6e2ac5cb61d (patch)
treef74bd82050eb7b57381811b9b0bbfdef42bfd8c4 /contrib
parentd790c91565e1389f13463239401c48c92f065230 (diff)
downloadsrc-0615c93b2c22b7b9b4f915345db9f6e2ac5cb61d.tar.gz
src-0615c93b2c22b7b9b4f915345db9f6e2ac5cb61d.zip
Use sysctl KERN_PROC_SIGTRAMP to retrieve the signal trampoline
location for the native amd64 ABI. This fixes unwinding over the signal frame after trampoline was moved to the shared page. The code would be more correct if using sysctl for the target process instead of inspecting gdb' own trampoline, but the current change is least intrusive and currently, we always initialize the native ABI sysvec first, which means that trampoline location for FreeBSD/amd64 ABI is relatively stable. Similar change will benefit libunwind. Analyzed by: avg Sponsored by: The FreeBSD Foundation MFC after: 1 week
Notes
Notes: svn path=/head/; revision=258663
Diffstat (limited to 'contrib')
-rw-r--r--contrib/gdb/gdb/amd64fbsd-nat.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/contrib/gdb/gdb/amd64fbsd-nat.c b/contrib/gdb/gdb/amd64fbsd-nat.c
index f08373422c29..dacd4a37427b 100644
--- a/contrib/gdb/gdb/amd64fbsd-nat.c
+++ b/contrib/gdb/gdb/amd64fbsd-nat.c
@@ -29,6 +29,7 @@
#include <sys/types.h>
#include <sys/ptrace.h>
#include <sys/sysctl.h>
+#include <sys/user.h>
#include <machine/reg.h>
#ifdef HAVE_SYS_PROCFS_H
@@ -212,24 +213,23 @@ Please report this to <bug-gdb@gnu.org>.",
SC_RBP_OFFSET = offset;
- /* FreeBSD provides a kern.ps_strings sysctl that we can use to
+ /* FreeBSD provides a kern.proc.sigtramp sysctl that we can use to
locate the sigtramp. That way we can still recognize a sigtramp
- if its location is changed in a new kernel. Of course this is
- still based on the assumption that the sigtramp is placed
- directly under the location where the program arguments and
- environment can be found. */
+ if its location is changed in a new kernel. */
{
- int mib[2];
- long ps_strings;
+ int mib[4];
+ struct kinfo_sigtramp kst;
size_t len;
mib[0] = CTL_KERN;
- mib[1] = KERN_PS_STRINGS;
- len = sizeof (ps_strings);
- if (sysctl (mib, 2, &ps_strings, &len, NULL, 0) == 0)
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_SIGTRAMP;
+ mib[3] = getpid();
+ len = sizeof (kst);
+ if (sysctl (mib, sizeof(mib) / sizeof(mib[0]), &kst, &len, NULL, 0) == 0)
{
- amd64fbsd_sigtramp_start_addr = ps_strings - 32;
- amd64fbsd_sigtramp_end_addr = ps_strings;
+ amd64fbsd_sigtramp_start_addr = kst.ksigtramp_start;
+ amd64fbsd_sigtramp_end_addr = kst.ksigtramp_end;
}
}
}