diff options
Diffstat (limited to 'kernel/trace/trace_syscalls.c')
-rw-r--r-- | kernel/trace/trace_syscalls.c | 56 |
1 files changed, 54 insertions, 2 deletions
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index b8d30e7ecd05..a21d366cae46 100644 --- a/kernel/trace/trace_syscalls.c +++ b/kernel/trace/trace_syscalls.c | |||
@@ -15,8 +15,19 @@ static int sys_refcount_exit; | |||
15 | static DECLARE_BITMAP(enabled_enter_syscalls, NR_syscalls); | 15 | static DECLARE_BITMAP(enabled_enter_syscalls, NR_syscalls); |
16 | static DECLARE_BITMAP(enabled_exit_syscalls, NR_syscalls); | 16 | static DECLARE_BITMAP(enabled_exit_syscalls, NR_syscalls); |
17 | 17 | ||
18 | struct ftrace_event_class event_class_syscalls = { | 18 | static int syscall_enter_register(struct ftrace_event_call *event, |
19 | .system = "syscalls" | 19 | enum trace_reg type); |
20 | static int syscall_exit_register(struct ftrace_event_call *event, | ||
21 | enum trace_reg type); | ||
22 | |||
23 | struct ftrace_event_class event_class_syscall_enter = { | ||
24 | .system = "syscalls", | ||
25 | .reg = syscall_enter_register | ||
26 | }; | ||
27 | |||
28 | struct ftrace_event_class event_class_syscall_exit = { | ||
29 | .system = "syscalls", | ||
30 | .reg = syscall_exit_register | ||
20 | }; | 31 | }; |
21 | 32 | ||
22 | extern unsigned long __start_syscalls_metadata[]; | 33 | extern unsigned long __start_syscalls_metadata[]; |
@@ -587,3 +598,44 @@ void perf_sysexit_disable(struct ftrace_event_call *call) | |||
587 | 598 | ||
588 | #endif /* CONFIG_PERF_EVENTS */ | 599 | #endif /* CONFIG_PERF_EVENTS */ |
589 | 600 | ||
601 | static int syscall_enter_register(struct ftrace_event_call *event, | ||
602 | enum trace_reg type) | ||
603 | { | ||
604 | switch (type) { | ||
605 | case TRACE_REG_REGISTER: | ||
606 | return reg_event_syscall_enter(event); | ||
607 | case TRACE_REG_UNREGISTER: | ||
608 | unreg_event_syscall_enter(event); | ||
609 | return 0; | ||
610 | |||
611 | #ifdef CONFIG_PERF_EVENTS | ||
612 | case TRACE_REG_PERF_REGISTER: | ||
613 | return perf_sysenter_enable(event); | ||
614 | case TRACE_REG_PERF_UNREGISTER: | ||
615 | perf_sysenter_disable(event); | ||
616 | return 0; | ||
617 | #endif | ||
618 | } | ||
619 | return 0; | ||
620 | } | ||
621 | |||
622 | static int syscall_exit_register(struct ftrace_event_call *event, | ||
623 | enum trace_reg type) | ||
624 | { | ||
625 | switch (type) { | ||
626 | case TRACE_REG_REGISTER: | ||
627 | return reg_event_syscall_exit(event); | ||
628 | case TRACE_REG_UNREGISTER: | ||
629 | unreg_event_syscall_exit(event); | ||
630 | return 0; | ||
631 | |||
632 | #ifdef CONFIG_PERF_EVENTS | ||
633 | case TRACE_REG_PERF_REGISTER: | ||
634 | return perf_sysexit_enable(event); | ||
635 | case TRACE_REG_PERF_UNREGISTER: | ||
636 | perf_sysexit_disable(event); | ||
637 | return 0; | ||
638 | #endif | ||
639 | } | ||
640 | return 0; | ||
641 | } | ||