/* Copyright (C) 2011-2014 Oracle, Inc. */
DTRACE_SYSCALL_STUB(EXECVE, execve)
+DTRACE_SYSCALL_STUB(EXECVEAT, execveat)
DTRACE_SYSCALL_STUB(PIPE, pipe)
DTRACE_SYSCALL_STUB(MEMORY_ORDERING, memory_ordering)
-DTRACE_SYSCALL_STUB(SIGALTSTACK, sigaltstack)
DTRACE_SYSCALL_STUB(RT_SIGRETURN, rt_sigreturn)
DTRACE_SYSCALL_STUB(VFORK, vfork)
DTRACE_SYSCALL_STUB(FORK, fork)
#include <linux/fs.h>
#include <linux/kallsyms.h>
#include <linux/module.h>
+#include <linux/namei.h>
#include <linux/sched.h>
#include <linux/syscalls.h>
#include <asm/compat.h>
rc = do_execve(getname(name), argv, envp);
-out:
+ if ((id = sc->stsy_return) != DTRACE_IDNONE)
+ (*systrace_probe)(id, (uintptr_t)rc, (uintptr_t)rc,
+ (uintptr_t)((uint64_t)rc >> 32), 0, 0, 0);
+
+ return rc;
+}
+
+asmlinkage long dtrace_sys_execveat(int fd, const char __user *name,
+ const char __user *const __user *argv,
+ const char __user *const __user *envp,
+ int flags)
+{
+ long rc = 0;
+ dtrace_id_t id;
+ dtrace_syscalls_t *sc;
+ int lookup_flags =
+ (flags & AT_EMPTY_PATH) ? LOOKUP_EMPTY : 0;
+
+ sc = &systrace_info.sysent[__NR_execveat];
+
+ if ((id = sc->stsy_entry) != DTRACE_IDNONE)
+ (*systrace_probe)(id, fd, (uintptr_t)name, (uintptr_t)argv,
+ (uintptr_t)envp, flags, 0);
+
+ /*
+ * FIXME: Add stop functionality for DTrace.
+ */
+
+ rc = do_execveat(fd, getname_flags(name, lookup_flags, NULL), argv,
+ envp, flags);
+
if ((id = sc->stsy_return) != DTRACE_IDNONE)
(*systrace_probe)(id, (uintptr_t)rc, (uintptr_t)rc,
(uintptr_t)((uint64_t)rc >> 32), 0, 0, 0);
flushw
ENDPROC(dtrace_stub_execve)
+ ENTRY(dtrace_stub_execveat)
+ set dtrace_sys_execveat, %g1
+ jmpl %g1, %g0
+ flushw
+ ENDPROC(dtrace_stub_execveat)
+
ENTRY(dtrace_stub_pipe)
ba,pt %xcc, dtrace_sys_pipe
add %sp, PTREGS_OFF, %o0
add %sp, PTREGS_OFF, %o1
ENDPROC(dtrace_stub_memory_ordering)
- ENTRY(dtrace_stub_sigaltstack)
- ba,pt %xcc, dtrace_sys_sigaltstack
- add %i6, STACK_BIAS, %o2
- ENDPROC(dtrace_stub_sigaltstack)
-
ENTRY(dtrace_stub_rt_sigreturn)
add %sp, PTREGS_OFF, %o0
call dtrace_sys_rt_sigreturn
sc = &systrace_info.sysent[__NR_execveat];
if ((id = sc->stsy_entry) != DTRACE_IDNONE)
- (*systrace_probe)(id, (uintptr_t)name, (uintptr_t)argv,
- (uintptr_t)envp, 0, 0, 0);
+ (*systrace_probe)(id, fd, (uintptr_t)name, (uintptr_t)argv,
+ (uintptr_t)envp, flags, 0);
/*
* FIXME: Add stop functionality for DTrace.