Date: Tue, 26 Nov 2013 10:09:53 +0200 From: Konstantin Belousov <kostikbel@gmail.com> To: Andriy Gapon <avg@FreeBSD.org> Cc: FreeBSD Current <freebsd-current@FreeBSD.org>, Luca Pizzamiglio <luca.pizzamiglio@gmail.com> Subject: Re: gdb has outdated knowledge of signal trampolines Message-ID: <20131126080953.GS59496@kib.kiev.ua> In-Reply-To: <20131125173527.GP59496@kib.kiev.ua> References: <529322E1.1060105@FreeBSD.org> <20131125173527.GP59496@kib.kiev.ua>
next in thread | previous in thread | raw e-mail | index | archive | help
--cYIzBPdBhuBoQ5I4 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, Nov 25, 2013 at 07:35:27PM +0200, Konstantin Belousov wrote: > Could you update your gdb patch to use the KERN_PROC_SIGTRAMP from > the patch below ? If this works out, I will add initialization of > sv_szsigcode for ABIs which do not use shared page. Below is the complete patch. With it applied, I get (gdb) bt #0 sighandler (signo=3D1, info=3D0x7fffffffd2b0, context=3DUnhandled dwarf= expression opcode 0xf3 ) at siginfo.c:34 #1 <signal handler called> #2 0x000000080088849a in sigsuspend () from /lib/libc.so.7 #3 0x000000000040093a in main (argc=3DUnhandled dwarf expression opcode 0x= f3 ) at siginfo.c:54 diff --git a/contrib/gdb/gdb/amd64fbsd-nat.c b/contrib/gdb/gdb/amd64fbsd-na= t.c index f083734..dacd4a3 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> =20 #ifdef HAVE_SYS_PROCFS_H @@ -212,24 +213,23 @@ Please report this to <bug-gdb@gnu.org>.", =20 SC_RBP_OFFSET =3D offset; =20 - /* 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; =20 mib[0] =3D CTL_KERN; - mib[1] =3D KERN_PS_STRINGS; - len =3D sizeof (ps_strings); - if (sysctl (mib, 2, &ps_strings, &len, NULL, 0) =3D=3D 0) + mib[1] =3D KERN_PROC; + mib[2] =3D KERN_PROC_SIGTRAMP; + mib[3] =3D getpid(); + len =3D sizeof (kst); + if (sysctl (mib, sizeof(mib) / sizeof(mib[0]), &kst, &len, NULL, 0) = =3D=3D 0) { - amd64fbsd_sigtramp_start_addr =3D ps_strings - 32; - amd64fbsd_sigtramp_end_addr =3D ps_strings; + amd64fbsd_sigtramp_start_addr =3D kst.ksigtramp_start; + amd64fbsd_sigtramp_end_addr =3D kst.ksigtramp_end; } } } diff --git a/sys/amd64/include/pcb.h b/sys/amd64/include/pcb.h index c106edc..80aff86 100644 --- a/sys/amd64/include/pcb.h +++ b/sys/amd64/include/pcb.h @@ -43,6 +43,7 @@ #include <machine/fpu.h> #include <machine/segments.h> =20 +#ifdef __amd64__ struct pcb { register_t pcb_r15; register_t pcb_r14; @@ -105,6 +106,7 @@ struct pcb { =20 uint64_t pcb_pad[3]; }; +#endif =20 #ifdef _KERNEL struct trapframe; diff --git a/sys/amd64/include/segments.h b/sys/amd64/include/segments.h index d9f4280..6bcadc7 100644 --- a/sys/amd64/include/segments.h +++ b/sys/amd64/include/segments.h @@ -82,8 +82,8 @@ struct soft_segment_descriptor { * region descriptors, used to load gdt/idt tables before segments yet exi= st. */ struct region_descriptor { - unsigned long rd_limit:16; /* segment extent */ - unsigned long rd_base:64 __packed; /* base address */ + uint64_t rd_limit:16; /* segment extent */ + uint64_t rd_base:64 __packed; /* base address */ } __packed; =20 #ifdef _KERNEL diff --git a/sys/compat/freebsd32/freebsd32.h b/sys/compat/freebsd32/freebs= d32.h index 8376e95..94f886e 100644 --- a/sys/compat/freebsd32/freebsd32.h +++ b/sys/compat/freebsd32/freebsd32.h @@ -362,6 +362,12 @@ struct kinfo_proc32 { int ki_tdflags; }; =20 +struct kinfo_sigtramp32 { + uint32_t ksigtramp_start; + uint32_t ksigtramp_end; + uint32_t ksigtramp_spare[4]; +}; + struct kld32_file_stat_1 { int version; /* set to sizeof(struct kld_file_stat_1) */ char name[MAXPATHLEN]; diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index 9968e76..2e6bc32 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -2632,6 +2632,60 @@ errout: return (error); } =20 +static int +sysctl_kern_proc_sigtramp(SYSCTL_HANDLER_ARGS) +{ + int *name =3D (int *)arg1; + u_int namelen =3D arg2; + struct proc *p; + struct kinfo_sigtramp kst; + const struct sysentvec *sv; + int error; +#ifdef COMPAT_FREEBSD32 + struct kinfo_sigtramp32 kst32; +#endif + + if (namelen !=3D 1) + return (EINVAL); + + error =3D pget((pid_t)name[0], PGET_CANDEBUG, &p); + if (error !=3D 0) + return (error); + sv =3D p->p_sysent; +#ifdef COMPAT_FREEBSD32 + if ((req->flags & SCTL_MASK32) !=3D 0) { + bzero(&kst32, sizeof(kst32)); + if (SV_PROC_FLAG(p, SV_ILP32)) { + if (sv->sv_sigcode_base !=3D 0) { + kst32.ksigtramp_start =3D sv->sv_sigcode_base; + kst32.ksigtramp_end =3D sv->sv_sigcode_base + + *sv->sv_szsigcode; + } else { + kst32.ksigtramp_start =3D sv->sv_psstrings - + *sv->sv_szsigcode; + kst32.ksigtramp_end =3D sv->sv_psstrings; + } + } + PROC_UNLOCK(p); + error =3D SYSCTL_OUT(req, &kst32, sizeof(kst32)); + return (error); + } +#endif + bzero(&kst, sizeof(kst)); + if (sv->sv_sigcode_base !=3D 0) { + kst.ksigtramp_start =3D (char *)sv->sv_sigcode_base; + kst.ksigtramp_end =3D (char *)sv->sv_sigcode_base + + *sv->sv_szsigcode; + } else { + kst.ksigtramp_start =3D (char *)sv->sv_psstrings - + *sv->sv_szsigcode; + kst.ksigtramp_end =3D (char *)sv->sv_psstrings; + } + PROC_UNLOCK(p); + error =3D SYSCTL_OUT(req, &kst, sizeof(kst)); + return (error); +} + SYSCTL_NODE(_kern, KERN_PROC, proc, CTLFLAG_RD, 0, "Process table"); =20 SYSCTL_PROC(_kern_proc, KERN_PROC_ALL, all, CTLFLAG_RD|CTLTYPE_STRUCT| @@ -2740,3 +2794,7 @@ static SYSCTL_NODE(_kern_proc, KERN_PROC_UMASK, umask= , CTLFLAG_RD | static SYSCTL_NODE(_kern_proc, KERN_PROC_OSREL, osrel, CTLFLAG_RW | CTLFLAG_ANYBODY | CTLFLAG_MPSAFE, sysctl_kern_proc_osrel, "Process binary osreldate"); + +static SYSCTL_NODE(_kern_proc, KERN_PROC_SIGTRAMP, sigtramp, CTLFLAG_RD | + CTLFLAG_MPSAFE, sysctl_kern_proc_sigtramp, + "Process signal trampoline location"); diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h index 64292ba..8e70a12 100644 --- a/sys/sys/sysctl.h +++ b/sys/sys/sysctl.h @@ -530,6 +530,7 @@ SYSCTL_ALLOWED_TYPES(UINT64, uint64_t *a; unsigned long= long *b; ); #define KERN_PROC_PS_STRINGS 38 /* get ps_strings location */ #define KERN_PROC_UMASK 39 /* process umask */ #define KERN_PROC_OSREL 40 /* osreldate for process binary */ +#define KERN_PROC_SIGTRAMP 41 /* signal trampoline location */ =20 /* * KERN_IPC identifiers diff --git a/sys/sys/user.h b/sys/sys/user.h index d2e2b6e..e926fe8 100644 --- a/sys/sys/user.h +++ b/sys/sys/user.h @@ -498,6 +498,12 @@ struct kinfo_kstack { int _kkst_ispare[16]; /* Space for more stuff. */ }; =20 +struct kinfo_sigtramp { + void *ksigtramp_start; + void *ksigtramp_end; + void *ksigtramp_spare[4]; +}; + #ifdef _KERNEL /* Flags for kern_proc_out function. */ #define KERN_PROC_NOTHREADS 0x1 --cYIzBPdBhuBoQ5I4 Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (FreeBSD) iQIcBAEBAgAGBQJSlFdQAAoJEJDCuSvBvK1BPr8QAIf8qsyGYHcZkubOChm6j0ZR EXGKnb3/mM+RE6g0lo0NSux2Buffo7kG/Rt61l06Lyy15NZY0yi1AJ4rWJixhcA2 b3ecizPRZiNN3BZ7k8nk/bS7zlvrQkhzqNy0GJ9Hzmx/Ex/3I2mdmOlUwjGyzzV1 qMpMIj/H3/UDu34iwTyqOqQ3Pol0vVMpZR5Ye0H9NywpAZJH/7yecAD7SL+UQ0Lg exwTWVZ81XjUNKDyFq4xaQEV/hm78OsHVgGLHMkbDKlF1W/sDdTQEJik8OOydQM8 gVbE86eAsTHKHDDwHIIPETlwlNdTkPUxqu3JN2xwyoBwcqAztHJV4JNDIfO7qk0d eI/dl2w2i2JhQPAvcNVTW0oQW39POCrwiCp/o1/6faN3aepZCTG+UoZs+pjdZe6l YvJtiBEV/L5vp19XovGY7i5LAEKm7K7LIP1RkaKJ/nSNwhLbJJ26t4nkl93Tm7ra weTmpAg6MNcA5VIWnLb5Wk2/5RBkrMsW9IB5dPlBysWSqGpABgn85ZnUioz2Oaqu f009cI9SkjeSguFaqXzt9+x6oPgwumFg8riR3zAFVk5mQATv7BAaYW257T93gVi/ Vxh81gp7ovh4epfBVxI1hy1/5+C/f4CXD/q7inweE/J/L1W99SkkPDbgPLNhoyme Gz5KXABTn50IMs7hjNC1 =dPPG -----END PGP SIGNATURE----- --cYIzBPdBhuBoQ5I4--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20131126080953.GS59496>