summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Tomasz Napierala <trasz@FreeBSD.org>2019-07-04 19:46:58 +0000
committerEdward Tomasz Napierala <trasz@FreeBSD.org>2019-07-04 19:46:58 +0000
commit8037385293348e7d688c63e3a99d17ad61a72bf0 (patch)
tree4a179b6fc2b5f8f2d856083f8955a7c7b41ca3b7
parentde7ea4e414fe84bc9917c99c9faeca20baea3318 (diff)
Notes
-rw-r--r--sys/amd64/linux/linux_ptrace.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/sys/amd64/linux/linux_ptrace.c b/sys/amd64/linux/linux_ptrace.c
index ae7251899e34..fd3d28421183 100644
--- a/sys/amd64/linux/linux_ptrace.c
+++ b/sys/amd64/linux/linux_ptrace.c
@@ -72,6 +72,8 @@ __FBSDID("$FreeBSD$");
#define LINUX_PTRACE_GETREGSET 0x4204
#define LINUX_PTRACE_SEIZE 0x4206
+#define LINUX_PTRACE_EVENT_EXIT 6
+
#define LINUX_PTRACE_O_TRACESYSGOOD 1
#define LINUX_PTRACE_O_TRACEFORK 2
#define LINUX_PTRACE_O_TRACEVFORK 4
@@ -139,6 +141,9 @@ linux_ptrace_status(struct thread *td, pid_t pid, int status)
if ((pem->ptrace_flags & LINUX_PTRACE_O_TRACESYSGOOD) &&
lwpinfo.pl_flags & PL_FLAG_SCX)
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;
LINUX_PEM_SUNLOCK(pem);
return (status);
@@ -359,9 +364,9 @@ linux_ptrace_setoptions(struct thread *td, pid_t pid, l_ulong data)
mask |= PTRACE_VFORK; /* XXX: Close enough? */
if (data & LINUX_PTRACE_O_TRACEEXIT) {
- linux_msg(td, "PTRACE_O_TRACEEXIT not implemented; "
- "returning EINVAL");
- return (EINVAL);
+ pem->ptrace_flags |= LINUX_PTRACE_O_TRACEEXIT;
+ } else {
+ pem->ptrace_flags &= ~LINUX_PTRACE_O_TRACEEXIT;
}
return (kern_ptrace(td, PT_SET_EVENT_MASK, pid, &mask, sizeof(mask)));