Author: kib
Date: Mon Nov 23 17:29:25 2020
New Revision: 367959
URL: https://svnweb.freebsd.org/changeset/base/367959

Log:
  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

Modified:
  head/sys/kern/kern_exec.c
  head/sys/kern/kern_exit.c
  head/sys/kern/kern_kthread.c
  head/sys/kern/kern_thr.c
  head/sys/sys/sysent.h

Modified: head/sys/kern/kern_exec.c
==============================================================================
--- head/sys/kern/kern_exec.c   Mon Nov 23 17:00:06 2020        (r367958)
+++ head/sys/kern/kern_exec.c   Mon Nov 23 17:29:25 2020        (r367959)
@@ -1051,6 +1051,8 @@ exec_new_vmspace(struct image_params *imgp, struct sys
        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);
 

Modified: head/sys/kern/kern_exit.c
==============================================================================
--- head/sys/kern/kern_exit.c   Mon Nov 23 17:00:06 2020        (r367958)
+++ head/sys/kern/kern_exit.c   Mon Nov 23 17:29:25 2020        (r367959)
@@ -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.
@@ -560,6 +564,9 @@ exit1(struct thread *td, int rval, int signo)
        /* Save exit status. */
        PROC_LOCK(p);
        p->p_xthread = td;
+
+       if (p->p_sysent->sv_ontdexit != NULL)
+               p->p_sysent->sv_ontdexit(td);
 
 #ifdef KDTRACE_HOOKS
        /*

Modified: head/sys/kern/kern_kthread.c
==============================================================================
--- head/sys/kern/kern_kthread.c        Mon Nov 23 17:00:06 2020        
(r367958)
+++ head/sys/kern/kern_kthread.c        Mon Nov 23 17:29:25 2020        
(r367959)
@@ -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);

Modified: head/sys/kern/kern_thr.c
==============================================================================
--- head/sys/kern/kern_thr.c    Mon Nov 23 17:00:06 2020        (r367958)
+++ head/sys/kern/kern_thr.c    Mon Nov 23 17:29:25 2020        (r367959)
@@ -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++;

Modified: head/sys/sys/sysent.h
==============================================================================
--- head/sys/sys/sysent.h       Mon Nov 23 17:00:06 2020        (r367958)
+++ head/sys/sys/sysent.h       Mon Nov 23 17:29:25 2020        (r367959)
@@ -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. */
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to