aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2021-05-18 16:25:50 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2021-05-25 15:22:27 +0000
commitd7a7ea5be60753c140a39ec6fa30e5ca4014dbb5 (patch)
treeae6e24c92c0bb46d30b2d3aaeea36e5bf5ad8718
parent91aae953cb807d6fb7a70782b323bf9beb60d7c9 (diff)
downloadsrc-d7a7ea5be60753c140a39ec6fa30e5ca4014dbb5.tar.gz
src-d7a7ea5be60753c140a39ec6fa30e5ca4014dbb5.zip
sys_process.c: extract ptrace_unsuspend()
Reviewed by: jhb Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differrential revision: https://reviews.freebsd.org/D30351
-rw-r--r--sys/kern/sys_process.c20
-rw-r--r--sys/sys/ptrace.h3
2 files changed, 17 insertions, 6 deletions
diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c
index 50157106a35e..b56c33203906 100644
--- a/sys/kern/sys_process.c
+++ b/sys/kern/sys_process.c
@@ -610,6 +610,19 @@ proc_set_traced(struct proc *p, bool stop)
p->p_ptevents = PTRACE_DEFAULT;
}
+void
+ptrace_unsuspend(struct proc *p)
+{
+ PROC_LOCK_ASSERT(p, MA_OWNED);
+
+ PROC_SLOCK(p);
+ p->p_flag &= ~(P_STOPPED_TRACE | P_STOPPED_SIG | P_WAITED);
+ thread_unsuspend(p);
+ PROC_SUNLOCK(p);
+ itimer_proc_continue(p);
+ kqtimer_proc_continue(p);
+}
+
static int
proc_can_ptrace(struct thread *td, struct proc *p)
{
@@ -1164,12 +1177,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data)
* suspended, use PT_SUSPEND to suspend it before
* continuing the process.
*/
- PROC_SLOCK(p);
- p->p_flag &= ~(P_STOPPED_TRACE | P_STOPPED_SIG | P_WAITED);
- thread_unsuspend(p);
- PROC_SUNLOCK(p);
- itimer_proc_continue(p);
- kqtimer_proc_continue(p);
+ ptrace_unsuspend(p);
break;
case PT_WRITE_I:
diff --git a/sys/sys/ptrace.h b/sys/sys/ptrace.h
index 06f01a04fd9d..1e7c1c71056b 100644
--- a/sys/sys/ptrace.h
+++ b/sys/sys/ptrace.h
@@ -240,6 +240,9 @@ int proc_write_fpregs32(struct thread *_td, struct fpreg32 *_fpreg32);
int proc_read_dbregs32(struct thread *_td, struct dbreg32 *_dbreg32);
int proc_write_dbregs32(struct thread *_td, struct dbreg32 *_dbreg32);
#endif
+
+void ptrace_unsuspend(struct proc *p);
+
#else /* !_KERNEL */
#include <sys/cdefs.h>