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
This commit is contained in:
kib 2020-11-23 17:29:25 +00:00
parent 2654ad033a
commit b2d30a77c1
5 changed files with 20 additions and 0 deletions

View File

@ -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);

View File

@ -72,6 +72,7 @@ __FBSDID("$FreeBSD$");
#include <sys/sdt.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/sysent.h>
#include <sys/timers.h>
#include <sys/umtx.h>
#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

View File

@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
#include <sys/resourcevar.h>
#include <sys/rwlock.h>
#include <sys/signalvar.h>
#include <sys/sysent.h>
#include <sys/sx.h>
#include <sys/umtx.h>
#include <sys/unistd.h>
@ -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);

View File

@ -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++;

View File

@ -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. */