Date: Sun, 24 Oct 2021 01:12:34 +0300 From: Konstantin Belousov <kostikbel@gmail.com> To: Edward Tomasz Napierala <trasz@freebsd.org> Cc: src-committers@freebsd.org, dev-commits-src-all@freebsd.org, dev-commits-src-main@freebsd.org Subject: Re: git: 6e66030c4c05 - main - linux: implement PTRACE_EVENT_EXEC Message-ID: <YXSI0vbCzOqcjLri@kib.kiev.ua> In-Reply-To: <202110231846.19NIkYg9047888@gitrepo.freebsd.org> References: <202110231846.19NIkYg9047888@gitrepo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Oct 23, 2021 at 06:46:34PM +0000, Edward Tomasz Napierala wrote: > The branch main has been updated by trasz: > > URL: https://cgit.FreeBSD.org/src/commit/?id=6e66030c4c05331f9b0adf87c31f2f233dd3ae1f > > commit 6e66030c4c05331f9b0adf87c31f2f233dd3ae1f > Author: Edward Tomasz Napierala <trasz@FreeBSD.org> > AuthorDate: 2021-10-23 18:13:14 +0000 > Commit: Edward Tomasz Napierala <trasz@FreeBSD.org> > CommitDate: 2021-10-23 18:46:26 +0000 > > linux: implement PTRACE_EVENT_EXEC > > This fixes strace(1) from Ubuntu Focal. > > Reviewed By: jhb > Sponsored By: EPSRC > Differential Revision: https://reviews.freebsd.org/D32367 > --- > sys/amd64/linux/linux_ptrace.c | 9 +++++++-- > sys/kern/subr_syscall.c | 12 ++++++++++++ > 2 files changed, 19 insertions(+), 2 deletions(-) > > diff --git a/sys/amd64/linux/linux_ptrace.c b/sys/amd64/linux/linux_ptrace.c > index 37f136856ef0..d7dffc92dd11 100644 > --- a/sys/amd64/linux/linux_ptrace.c > +++ b/sys/amd64/linux/linux_ptrace.c > @@ -71,6 +71,7 @@ __FBSDID("$FreeBSD$"); > #define LINUX_PTRACE_SEIZE 0x4206 > #define LINUX_PTRACE_GET_SYSCALL_INFO 0x420e > > +#define LINUX_PTRACE_EVENT_EXEC 4 > #define LINUX_PTRACE_EVENT_EXIT 6 > > #define LINUX_PTRACE_O_TRACESYSGOOD 1 > @@ -151,8 +152,12 @@ linux_ptrace_status(struct thread *td, pid_t pid, int status) > lwpinfo.pl_flags & PL_FLAG_SCE) > status |= (LINUX_SIGTRAP | 0x80) << 8; > if ((pem->ptrace_flags & LINUX_PTRACE_O_TRACESYSGOOD) && > - lwpinfo.pl_flags & PL_FLAG_SCX) > - status |= (LINUX_SIGTRAP | 0x80) << 8; > + lwpinfo.pl_flags & PL_FLAG_SCX) { > + if (lwpinfo.pl_flags & PL_FLAG_EXEC) > + status |= (LINUX_SIGTRAP | LINUX_PTRACE_EVENT_EXEC << 8) << 8; > + else > + status |= (LINUX_SIGTRAP | 0x80) << 8; > + } > if ((pem->ptrace_flags & LINUX_PTRACE_O_TRACEEXIT) && > lwpinfo.pl_flags & PL_FLAG_EXITED) > status |= (LINUX_SIGTRAP | LINUX_PTRACE_EVENT_EXIT << 8) << 8; > diff --git a/sys/kern/subr_syscall.c b/sys/kern/subr_syscall.c > index ada2053bc87c..fab67a68b0a3 100644 > --- a/sys/kern/subr_syscall.c > +++ b/sys/kern/subr_syscall.c > @@ -254,6 +254,18 @@ syscallret(struct thread *td) > if (__predict_false(traced || > (td->td_dbgflags & (TDB_EXEC | TDB_FORK)) != 0)) { > PROC_LOCK(p); > + /* > + * Linux debuggers expect an additional stop for exec, > + * between the usual syscall entry and exit. Raise > + * the exec event now and then clear TDB_EXEC so that > + * the next stop is reported as a syscall exit by > + * linux_ptrace_status(). > + */ > + if ((td->td_dbgflags & TDB_EXEC) != 0 && > + SV_PROC_ABI(td->td_proc) == SV_ABI_LINUX) { > + ptracestop(td, SIGTRAP, NULL); > + td->td_dbgflags &= ~TDB_EXEC; > + } > /* > * If tracing the execed process, trap to the debugger > * so that breakpoints can be set before the program You committed before we finished the discussion. In fact I do not think it is right. Now it generates spurious stop for FreeBSD native debugger, and probably de-synchronize SCX/SCE pairing for it as well. In other words, you need to generate this stop based on ABI of the debugger, not debuggeeeeee.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?YXSI0vbCzOqcjLri>