parisc: Add syscall tracepoint support
authorHelge Deller <deller@gmx.de>
Wed, 13 Apr 2016 20:44:54 +0000 (22:44 +0200)
committerHelge Deller <deller@gmx.de>
Sun, 22 May 2016 19:38:47 +0000 (21:38 +0200)
This patch adds support for the TIF_SYSCALL_TRACEPOINT on the parisc
architecture. Basically, it calls the appropriate tracepoints on syscall
entry and exit.

Signed-off-by: Helge Deller <deller@gmx.de>
arch/parisc/Kconfig
arch/parisc/include/asm/ftrace.h
arch/parisc/include/asm/syscall.h
arch/parisc/include/asm/thread_info.h
arch/parisc/kernel/ptrace.c
arch/parisc/kernel/syscall.S

index 3d498a676551d0fa778f0bafe0cbced3fe44765d..9589511e9c9570e80b4148568bc8646c529d06a0 100644 (file)
@@ -6,6 +6,7 @@ config PARISC
        select HAVE_OPROFILE
        select HAVE_FUNCTION_TRACER
        select HAVE_FUNCTION_GRAPH_TRACER
+       select HAVE_SYSCALL_TRACEPOINTS
        select ARCH_WANT_FRAME_POINTERS
        select RTC_CLASS
        select RTC_DRV_GENERIC
index 24cd81d58d706faafe469c10a85f1182a28b958a..d635c6b0269df84337cf0abc23f87603aad99296 100644 (file)
@@ -6,6 +6,8 @@ extern void mcount(void);
 
 #define MCOUNT_INSN_SIZE 4
 
+extern unsigned long sys_call_table[];
+
 extern unsigned long return_address(unsigned int);
 
 #define ftrace_return_address(n) return_address(n)
index 637ce8d6f3752425371acee122b207d8e5af0b50..5e0b4e6bd99d14c94437ae409faca2ae413d9cde 100644 (file)
@@ -8,6 +8,8 @@
 #include <linux/err.h>
 #include <asm/ptrace.h>
 
+#define NR_syscalls (__NR_Linux_syscalls)
+
 static inline long syscall_get_nr(struct task_struct *tsk,
                                  struct pt_regs *regs)
 {
@@ -33,12 +35,19 @@ static inline void syscall_get_arguments(struct task_struct *tsk,
                args[1] = regs->gr[25];
        case 1:
                args[0] = regs->gr[26];
+       case 0:
                break;
        default:
                BUG();
        }
 }
 
+static inline long syscall_get_return_value(struct task_struct *task,
+                                               struct pt_regs *regs)
+{
+       return regs->gr[28];
+}
+
 static inline void syscall_set_return_value(struct task_struct *task,
                                            struct pt_regs *regs,
                                            int error, long val)
index e96e693fd58ca0df4a231a35a6f753e447dac1cb..7581330ea35be1e15498cf5cef9bbcbd3889aab9 100644 (file)
@@ -55,6 +55,7 @@ struct thread_info {
 #define TIF_SINGLESTEP         9       /* single stepping? */
 #define TIF_BLOCKSTEP          10      /* branch stepping? */
 #define TIF_SECCOMP            11      /* secure computing */
+#define TIF_SYSCALL_TRACEPOINT 12      /* syscall tracepoint instrumentation */
 
 #define _TIF_SYSCALL_TRACE     (1 << TIF_SYSCALL_TRACE)
 #define _TIF_SIGPENDING                (1 << TIF_SIGPENDING)
@@ -66,12 +67,13 @@ struct thread_info {
 #define _TIF_SINGLESTEP                (1 << TIF_SINGLESTEP)
 #define _TIF_BLOCKSTEP         (1 << TIF_BLOCKSTEP)
 #define _TIF_SECCOMP           (1 << TIF_SECCOMP)
+#define _TIF_SYSCALL_TRACEPOINT        (1 << TIF_SYSCALL_TRACEPOINT)
 
 #define _TIF_USER_WORK_MASK     (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | \
                                  _TIF_NEED_RESCHED)
 #define _TIF_SYSCALL_TRACE_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP |        \
                                 _TIF_BLOCKSTEP | _TIF_SYSCALL_AUDIT | \
-                                _TIF_SECCOMP)
+                                _TIF_SECCOMP | _TIF_SYSCALL_TRACEPOINT)
 
 #ifdef CONFIG_64BIT
 # ifdef CONFIG_COMPAT
index 8fb81a3915990dc741324b560986895f5025a9d5..4863761bdbbb6cabab4a32997cb9a705176664cd 100644 (file)
@@ -30,6 +30,9 @@
 /* PSW bits we allow the debugger to modify */
 #define USER_PSW_BITS  (PSW_N | PSW_B | PSW_V | PSW_CB)
 
+#define CREATE_TRACE_POINTS
+#include <trace/events/syscalls.h>
+
 /*
  * Called by kernel/ptrace.c when detaching..
  *
@@ -283,6 +286,10 @@ long do_syscall_trace_enter(struct pt_regs *regs)
                regs->gr[20] = -1UL;
                goto out;
        }
+#ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS
+       if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
+               trace_sys_enter(regs, regs->gr[20]);
+#endif
 
 #ifdef CONFIG_64BIT
        if (!is_compat_task())
@@ -311,6 +318,11 @@ void do_syscall_trace_exit(struct pt_regs *regs)
 
        audit_syscall_exit(regs);
 
+#ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS
+       if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
+               trace_sys_exit(regs, regs->gr[20]);
+#endif
+
        if (stepping || test_thread_flag(TIF_SYSCALL_TRACE))
                tracehook_report_syscall_exit(regs, stepping);
 }
index 57b4836b7ecd898e10197aa0d473ea6107b9fb42..d03422e5f188368f8df5283cedfd4e32845e64df 100644 (file)
@@ -912,6 +912,7 @@ END(lws_table)
 
        .align 8
 ENTRY(sys_call_table)
+       .export sys_call_table,data
 #include "syscall_table.S"
 END(sys_call_table)