From: Kris Van Hees Date: Sat, 11 Jul 2015 04:18:28 +0000 (-0100) Subject: dtrace: accomodate changes in the 4.1 kernel for sparc64 X-Git-Tag: v4.1.12-92~313^2 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=48431b3da06677ff1abcd51eb88106a32f3bfc0f;p=users%2Fjedix%2Flinux-maple.git dtrace: accomodate changes in the 4.1 kernel for sparc64 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 Acked-by: Nick Alcock --- diff --git a/arch/sparc/include/asm/dtrace_syscall.h b/arch/sparc/include/asm/dtrace_syscall.h index 538f2c15ef88..4bdc51021147 100644 --- a/arch/sparc/include/asm/dtrace_syscall.h +++ b/arch/sparc/include/asm/dtrace_syscall.h @@ -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) diff --git a/arch/sparc/kernel/dtrace_syscall.c b/arch/sparc/kernel/dtrace_syscall.c index 18ebb06bf7f5..2224b3c1a38b 100644 --- a/arch/sparc/kernel/dtrace_syscall.c +++ b/arch/sparc/kernel/dtrace_syscall.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -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); diff --git a/arch/sparc/kernel/dtrace_syscall_stubs.S b/arch/sparc/kernel/dtrace_syscall_stubs.S index 65377ba69b95..19ddaf81011b 100644 --- a/arch/sparc/kernel/dtrace_syscall_stubs.S +++ b/arch/sparc/kernel/dtrace_syscall_stubs.S @@ -17,6 +17,12 @@ 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 @@ -27,11 +33,6 @@ 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 diff --git a/arch/x86/kernel/dtrace_syscall.c b/arch/x86/kernel/dtrace_syscall.c index f9091383285f..21a8dd806a24 100644 --- a/arch/x86/kernel/dtrace_syscall.c +++ b/arch/x86/kernel/dtrace_syscall.c @@ -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.