From b2d30a77c1902b5b569e31d4d58ae10bbc4e64a3 Mon Sep 17 00:00:00 2001 From: kib Date: Mon, 23 Nov 2020 17:29:25 +0000 Subject: [PATCH] Provide ABI modules hooks for process exec/exit and thread exit. Exec and exit are same as corresponding eventhandler hooks. Thread exit hook is called somewhat earlier, while thread is still owned by the process and enough context is available. Note that the process lock is owned when the hook is called. Reviewed by: markj Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D27309 --- sys/kern/kern_exec.c | 2 ++ sys/kern/kern_exit.c | 7 +++++++ sys/kern/kern_kthread.c | 5 +++++ sys/kern/kern_thr.c | 3 +++ sys/sys/sysent.h | 3 +++ 5 files changed, 20 insertions(+) diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index 6a61ce17a98..b3fcbef0289 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -1051,6 +1051,8 @@ exec_new_vmspace(struct image_params *imgp, struct sysentvec *sv) sigfastblock_clear(td); umtx_exec(p); itimers_exec(p); + if (sv->sv_onexec != NULL) + sv->sv_onexec(p, imgp); EVENTHANDLER_DIRECT_INVOKE(process_exec, p, imgp); diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index 9d70d95a552..0e748751d01 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -72,6 +72,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #ifdef KTRACE @@ -327,6 +328,9 @@ exit1(struct thread *td, int rval, int signo) itimers_exit(p); + if (p->p_sysent->sv_onexit != NULL) + p->p_sysent->sv_onexit(p); + /* * Check if any loadable modules need anything done at process exit. * E.g. SYSV IPC stuff. @@ -561,6 +565,9 @@ exit1(struct thread *td, int rval, int signo) PROC_LOCK(p); p->p_xthread = td; + if (p->p_sysent->sv_ontdexit != NULL) + p->p_sysent->sv_ontdexit(td); + #ifdef KDTRACE_HOOKS /* * Tell the DTrace fasttrap provider about the exit if it diff --git a/sys/kern/kern_kthread.c b/sys/kern/kern_kthread.c index 5cc4bd275bc..d049a099847 100644 --- a/sys/kern/kern_kthread.c +++ b/sys/kern/kern_kthread.c @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -355,6 +356,10 @@ kthread_exit(void) PROC_UNLOCK(p); kproc_exit(0); } + + if (p->p_sysent->sv_ontdexit != NULL) + p->p_sysent->sv_ontdexit(td); + tidhash_remove(td); umtx_thread_exit(td); tdsigcleanup(td); diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c index f3e4e364985..69259d78811 100644 --- a/sys/kern/kern_thr.c +++ b/sys/kern/kern_thr.c @@ -353,6 +353,9 @@ kern_thr_exit(struct thread *td) return (0); } + if (p->p_sysent->sv_ontdexit != NULL) + p->p_sysent->sv_ontdexit(td); + td->td_dbgflags |= TDB_EXIT; if (p->p_ptevents & PTRACE_LWP) { p->p_pendingexits++; diff --git a/sys/sys/sysent.h b/sys/sys/sysent.h index 3b0df46e42a..db729239243 100644 --- a/sys/sys/sysent.h +++ b/sys/sys/sysent.h @@ -145,6 +145,9 @@ struct sysentvec { u_long *sv_hwcap2; /* Value passed in AT_HWCAP2. */ const char *(*sv_machine_arch)(struct proc *); vm_offset_t sv_fxrng_gen_base; + void (*sv_onexec)(struct proc *, struct image_params *); + void (*sv_onexit)(struct proc *); + void (*sv_ontdexit)(struct thread *td); }; #define SV_ILP32 0x000100 /* 32-bit executable. */ -- 2.45.0