blob: 51b72d8a84987e7ad84a7e18e639dc9bdb0e84c3 [file] [log] [blame]
lh9ed821d2023-04-07 01:36:19 -07001#ifndef _TRACE_SYSCALL_H
2#define _TRACE_SYSCALL_H
3
4#include <linux/tracepoint.h>
5#include <linux/unistd.h>
6#include <linux/ftrace_event.h>
7#include <linux/thread_info.h>
8
9#include <asm/ptrace.h>
10
11
12/*
13 * A syscall entry in the ftrace syscalls array.
14 *
15 * @name: name of the syscall
16 * @syscall_nr: number of the syscall
17 * @nb_args: number of parameters it takes
18 * @types: list of types as strings
19 * @args: list of args as strings (args[i] matches types[i])
20 * @enter_event: associated syscall_enter trace event
21 * @exit_event: associated syscall_exit trace event
22 */
23struct syscall_metadata {
24 const char *name;
25 int syscall_nr;
26 int nb_args;
27 const char **types;
28 const char **args;
29 struct list_head enter_fields;
30
31 struct ftrace_event_call *enter_event;
32 struct ftrace_event_call *exit_event;
33};
34
35#ifdef CONFIG_FTRACE_SYSCALLS
36extern unsigned long arch_syscall_addr(int nr);
37extern int init_syscall_trace(struct ftrace_event_call *call);
38
39extern int reg_event_syscall_enter(struct ftrace_event_call *call);
40extern void unreg_event_syscall_enter(struct ftrace_event_call *call);
41extern int reg_event_syscall_exit(struct ftrace_event_call *call);
42extern void unreg_event_syscall_exit(struct ftrace_event_call *call);
43extern int
44ftrace_format_syscall(struct ftrace_event_call *call, struct trace_seq *s);
45enum print_line_t print_syscall_enter(struct trace_iterator *iter, int flags,
46 struct trace_event *event);
47enum print_line_t print_syscall_exit(struct trace_iterator *iter, int flags,
48 struct trace_event *event);
49#endif
50
51#ifdef CONFIG_PERF_EVENTS
52int perf_sysenter_enable(struct ftrace_event_call *call);
53void perf_sysenter_disable(struct ftrace_event_call *call);
54int perf_sysexit_enable(struct ftrace_event_call *call);
55void perf_sysexit_disable(struct ftrace_event_call *call);
56#endif
57
58#if defined(CONFIG_TRACEPOINTS) && defined(CONFIG_HAVE_SYSCALL_TRACEPOINTS)
59static inline void syscall_tracepoint_update(struct task_struct *p)
60{
61 if (test_thread_flag(TIF_SYSCALL_TRACEPOINT))
62 set_tsk_thread_flag(p, TIF_SYSCALL_TRACEPOINT);
63 else
64 clear_tsk_thread_flag(p, TIF_SYSCALL_TRACEPOINT);
65}
66#else
67static inline void syscall_tracepoint_update(struct task_struct *p)
68{
69}
70#endif
71
72#endif /* _TRACE_SYSCALL_H */