Skip site navigation (1)Skip section navigation (2)
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>