summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_exec.c
diff options
context:
space:
mode:
authorjb <jb@FreeBSD.org>2008-05-24 06:22:16 +0000
committerjb <jb@FreeBSD.org>2008-05-24 06:22:16 +0000
commitc4443570b616a998fb115e9ea8e02aaa8291c538 (patch)
tree5d1a1433c24202dd7d4681d388f6df0788664c25 /sys/kern/kern_exec.c
parente0c188cb54d2e72e7d003f16765a9c3dd9495e8e (diff)
downloadFreeBSD-src-c4443570b616a998fb115e9ea8e02aaa8291c538.zip
FreeBSD-src-c4443570b616a998fb115e9ea8e02aaa8291c538.tar.gz
Add DTrace 'proc' provider probes using the Statically Defined Trace
(sdt) mechanism.
Diffstat (limited to 'sys/kern/kern_exec.c')
-rw-r--r--sys/kern/kern_exec.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c
index 838c4fd..f4335a2 100644
--- a/sys/kern/kern_exec.c
+++ b/sys/kern/kern_exec.c
@@ -28,6 +28,7 @@
__FBSDID("$FreeBSD$");
#include "opt_hwpmc_hooks.h"
+#include "opt_kdtrace.h"
#include "opt_ktrace.h"
#include "opt_mac.h"
#include "opt_vm.h"
@@ -54,6 +55,7 @@ __FBSDID("$FreeBSD$");
#include <sys/pioctl.h>
#include <sys/namei.h>
#include <sys/resourcevar.h>
+#include <sys/sdt.h>
#include <sys/sf_buf.h>
#include <sys/syscallsubr.h>
#include <sys/sysent.h>
@@ -83,6 +85,19 @@ __FBSDID("$FreeBSD$");
#include <security/audit/audit.h>
#include <security/mac/mac_framework.h>
+#ifdef KDTRACE_HOOKS
+#include <sys/dtrace_bsd.h>
+dtrace_execexit_func_t dtrace_fasttrap_exec;
+#endif
+
+SDT_PROVIDER_DECLARE(proc);
+SDT_PROBE_DEFINE(proc, kernel, , exec);
+SDT_PROBE_ARGTYPE(proc, kernel, , exec, 0, "char *");
+SDT_PROBE_DEFINE(proc, kernel, , exec_failure);
+SDT_PROBE_ARGTYPE(proc, kernel, , exec_failure, 0, "int");
+SDT_PROBE_DEFINE(proc, kernel, , exec_success);
+SDT_PROBE_ARGTYPE(proc, kernel, , exec_success, 0, "char *");
+
MALLOC_DEFINE(M_PARGS, "proc-args", "Process arguments");
static int sysctl_kern_ps_strings(SYSCTL_HANDLER_ARGS);
@@ -371,6 +386,8 @@ do_execve(td, args, mac_p)
imgp->image_header = NULL;
+ SDT_PROBE(proc, kernel, , exec, args->fname, 0, 0, 0, 0 );
+
/*
* Translate the file name. namei() returns a vnode pointer
* in ni_vp amoung other things.
@@ -702,6 +719,15 @@ interpret:
textvp = p->p_textvp;
p->p_textvp = binvp;
+#ifdef KDTRACE_HOOKS
+ /*
+ * Tell the DTrace fasttrap provider about the exec if it
+ * has declared an interest.
+ */
+ if (dtrace_fasttrap_exec)
+ dtrace_fasttrap_exec(p);
+#endif
+
/*
* Notify others that we exec'd, and clear the P_INEXEC flag
* as we're now a bona fide freshly-execed process.
@@ -764,6 +790,7 @@ interpret:
vfs_mark_atime(imgp->vp, td);
done1:
+
/*
* Free any resources malloc'd earlier that we didn't use.
*/
@@ -773,6 +800,9 @@ done1:
else
crfree(newcred);
VOP_UNLOCK(imgp->vp, 0);
+
+ SDT_PROBE(proc, kernel, , exec_success, args->fname, 0, 0, 0, 0);
+
/*
* Handle deferred decrement of ref counts.
*/
@@ -836,6 +866,8 @@ exec_fail:
p->p_flag &= ~P_INEXEC;
PROC_UNLOCK(p);
+ SDT_PROBE(proc, kernel, , exec_failure, error, 0, 0, 0, 0);
+
done2:
#ifdef MAC
mac_execve_exit(imgp);
OpenPOWER on IntegriCloud