]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
dtrace: accomodate changes in the 4.1 kernel for sparc64
authorKris Van Hees <kris.van.hees@oracle.com>
Sat, 11 Jul 2015 04:18:28 +0000 (03:18 -0100)
committerNick Alcock <nick.alcock@oracle.com>
Tue, 21 Jul 2015 14:30:21 +0000 (15:30 +0100)
The handling of some system calls changed:

- The sigaltstack system call is no longer a special case using a
  stub in assembler.
- New system call: execveat

This commit also fixes a problem with the support for the execveat
system call on x86_64, where not all arguments were being passed in
the entry probe for that new system call.

Signed-off-by: Kris Van Hees <kris.van.hees@oracle.com>
Acked-by: Nick Alcock <nick.alcock@oracle.com>
arch/sparc/include/asm/dtrace_syscall.h
arch/sparc/kernel/dtrace_syscall.c
arch/sparc/kernel/dtrace_syscall_stubs.S
arch/x86/kernel/dtrace_syscall.c

index 538f2c15ef88ee2e5dee7008ba2756a5ff70afcd..4bdc51021147007162a34024fb0bad0add302687 100644 (file)
@@ -1,9 +1,9 @@
 /* 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)
index 18ebb06bf7f5f839c1f12acc703bae7702d2dda2..2224b3c1a38b3a2174ab9976707787eea76c6bf1 100644 (file)
@@ -11,6 +11,7 @@
 #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>
@@ -183,7 +184,37 @@ asmlinkage long dtrace_sys_execve(const char __user *name,
 
        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);
index 65377ba69b950fa0b1e5ca0ce2aeb64793c43a82..19ddaf81011b06b645b77200cc28c6696cad3cc2 100644 (file)
         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
index f9091383285fdfa63af28f593c16a96750cd88d3..21a8dd806a240656116ffe909aa2ce7809922672 100644 (file)
@@ -230,8 +230,8 @@ long dtrace_sys_execveat(int fd, const char __user *name,
        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.