diff options
Diffstat (limited to 'include/linux/syscalls.h')
| -rw-r--r-- | include/linux/syscalls.h | 85 |
1 files changed, 22 insertions, 63 deletions
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index a990ace1a838..939a61507ac5 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
| @@ -25,6 +25,7 @@ struct linux_dirent64; | |||
| 25 | struct list_head; | 25 | struct list_head; |
| 26 | struct msgbuf; | 26 | struct msgbuf; |
| 27 | struct msghdr; | 27 | struct msghdr; |
| 28 | struct mmsghdr; | ||
| 28 | struct msqid_ds; | 29 | struct msqid_ds; |
| 29 | struct new_utsname; | 30 | struct new_utsname; |
| 30 | struct nfsctl_arg; | 31 | struct nfsctl_arg; |
| @@ -99,37 +100,16 @@ struct perf_event_attr; | |||
| 99 | #define __SC_TEST6(t6, a6, ...) __SC_TEST(t6); __SC_TEST5(__VA_ARGS__) | 100 | #define __SC_TEST6(t6, a6, ...) __SC_TEST(t6); __SC_TEST5(__VA_ARGS__) |
| 100 | 101 | ||
| 101 | #ifdef CONFIG_EVENT_PROFILE | 102 | #ifdef CONFIG_EVENT_PROFILE |
| 102 | #define TRACE_SYS_ENTER_PROFILE(sname) \ | ||
| 103 | static int prof_sysenter_enable_##sname(void) \ | ||
| 104 | { \ | ||
| 105 | return reg_prof_syscall_enter("sys"#sname); \ | ||
| 106 | } \ | ||
| 107 | \ | ||
| 108 | static void prof_sysenter_disable_##sname(void) \ | ||
| 109 | { \ | ||
| 110 | unreg_prof_syscall_enter("sys"#sname); \ | ||
| 111 | } | ||
| 112 | |||
| 113 | #define TRACE_SYS_EXIT_PROFILE(sname) \ | ||
| 114 | static int prof_sysexit_enable_##sname(void) \ | ||
| 115 | { \ | ||
| 116 | return reg_prof_syscall_exit("sys"#sname); \ | ||
| 117 | } \ | ||
| 118 | \ | ||
| 119 | static void prof_sysexit_disable_##sname(void) \ | ||
| 120 | { \ | ||
| 121 | unreg_prof_syscall_exit("sys"#sname); \ | ||
| 122 | } | ||
| 123 | 103 | ||
| 124 | #define TRACE_SYS_ENTER_PROFILE_INIT(sname) \ | 104 | #define TRACE_SYS_ENTER_PROFILE_INIT(sname) \ |
| 125 | .profile_count = ATOMIC_INIT(-1), \ | 105 | .profile_count = ATOMIC_INIT(-1), \ |
| 126 | .profile_enable = prof_sysenter_enable_##sname, \ | 106 | .profile_enable = prof_sysenter_enable, \ |
| 127 | .profile_disable = prof_sysenter_disable_##sname, | 107 | .profile_disable = prof_sysenter_disable, |
| 128 | 108 | ||
| 129 | #define TRACE_SYS_EXIT_PROFILE_INIT(sname) \ | 109 | #define TRACE_SYS_EXIT_PROFILE_INIT(sname) \ |
| 130 | .profile_count = ATOMIC_INIT(-1), \ | 110 | .profile_count = ATOMIC_INIT(-1), \ |
| 131 | .profile_enable = prof_sysexit_enable_##sname, \ | 111 | .profile_enable = prof_sysexit_enable, \ |
| 132 | .profile_disable = prof_sysexit_disable_##sname, | 112 | .profile_disable = prof_sysexit_disable, |
| 133 | #else | 113 | #else |
| 134 | #define TRACE_SYS_ENTER_PROFILE(sname) | 114 | #define TRACE_SYS_ENTER_PROFILE(sname) |
| 135 | #define TRACE_SYS_ENTER_PROFILE_INIT(sname) | 115 | #define TRACE_SYS_ENTER_PROFILE_INIT(sname) |
| @@ -153,74 +133,46 @@ static void prof_sysexit_disable_##sname(void) \ | |||
| 153 | #define __SC_STR_TDECL6(t, a, ...) #t, __SC_STR_TDECL5(__VA_ARGS__) | 133 | #define __SC_STR_TDECL6(t, a, ...) #t, __SC_STR_TDECL5(__VA_ARGS__) |
| 154 | 134 | ||
| 155 | #define SYSCALL_TRACE_ENTER_EVENT(sname) \ | 135 | #define SYSCALL_TRACE_ENTER_EVENT(sname) \ |
| 136 | static const struct syscall_metadata __syscall_meta_##sname; \ | ||
| 156 | static struct ftrace_event_call event_enter_##sname; \ | 137 | static struct ftrace_event_call event_enter_##sname; \ |
| 157 | struct trace_event enter_syscall_print_##sname = { \ | 138 | static struct trace_event enter_syscall_print_##sname = { \ |
| 158 | .trace = print_syscall_enter, \ | 139 | .trace = print_syscall_enter, \ |
| 159 | }; \ | 140 | }; \ |
| 160 | static int init_enter_##sname(void) \ | ||
| 161 | { \ | ||
| 162 | int num, id; \ | ||
| 163 | num = syscall_name_to_nr("sys"#sname); \ | ||
| 164 | if (num < 0) \ | ||
| 165 | return -ENOSYS; \ | ||
| 166 | id = register_ftrace_event(&enter_syscall_print_##sname);\ | ||
| 167 | if (!id) \ | ||
| 168 | return -ENODEV; \ | ||
| 169 | event_enter_##sname.id = id; \ | ||
| 170 | set_syscall_enter_id(num, id); \ | ||
| 171 | INIT_LIST_HEAD(&event_enter_##sname.fields); \ | ||
| 172 | return 0; \ | ||
| 173 | } \ | ||
| 174 | TRACE_SYS_ENTER_PROFILE(sname); \ | ||
| 175 | static struct ftrace_event_call __used \ | 141 | static struct ftrace_event_call __used \ |
| 176 | __attribute__((__aligned__(4))) \ | 142 | __attribute__((__aligned__(4))) \ |
| 177 | __attribute__((section("_ftrace_events"))) \ | 143 | __attribute__((section("_ftrace_events"))) \ |
| 178 | event_enter_##sname = { \ | 144 | event_enter_##sname = { \ |
| 179 | .name = "sys_enter"#sname, \ | 145 | .name = "sys_enter"#sname, \ |
| 180 | .system = "syscalls", \ | 146 | .system = "syscalls", \ |
| 181 | .event = &event_syscall_enter, \ | 147 | .event = &enter_syscall_print_##sname, \ |
| 182 | .raw_init = init_enter_##sname, \ | 148 | .raw_init = init_syscall_trace, \ |
| 183 | .show_format = syscall_enter_format, \ | 149 | .show_format = syscall_enter_format, \ |
| 184 | .define_fields = syscall_enter_define_fields, \ | 150 | .define_fields = syscall_enter_define_fields, \ |
| 185 | .regfunc = reg_event_syscall_enter, \ | 151 | .regfunc = reg_event_syscall_enter, \ |
| 186 | .unregfunc = unreg_event_syscall_enter, \ | 152 | .unregfunc = unreg_event_syscall_enter, \ |
| 187 | .data = "sys"#sname, \ | 153 | .data = (void *)&__syscall_meta_##sname,\ |
| 188 | TRACE_SYS_ENTER_PROFILE_INIT(sname) \ | 154 | TRACE_SYS_ENTER_PROFILE_INIT(sname) \ |
| 189 | } | 155 | } |
| 190 | 156 | ||
| 191 | #define SYSCALL_TRACE_EXIT_EVENT(sname) \ | 157 | #define SYSCALL_TRACE_EXIT_EVENT(sname) \ |
| 158 | static const struct syscall_metadata __syscall_meta_##sname; \ | ||
| 192 | static struct ftrace_event_call event_exit_##sname; \ | 159 | static struct ftrace_event_call event_exit_##sname; \ |
| 193 | struct trace_event exit_syscall_print_##sname = { \ | 160 | static struct trace_event exit_syscall_print_##sname = { \ |
| 194 | .trace = print_syscall_exit, \ | 161 | .trace = print_syscall_exit, \ |
| 195 | }; \ | 162 | }; \ |
| 196 | static int init_exit_##sname(void) \ | ||
| 197 | { \ | ||
| 198 | int num, id; \ | ||
| 199 | num = syscall_name_to_nr("sys"#sname); \ | ||
| 200 | if (num < 0) \ | ||
| 201 | return -ENOSYS; \ | ||
| 202 | id = register_ftrace_event(&exit_syscall_print_##sname);\ | ||
| 203 | if (!id) \ | ||
| 204 | return -ENODEV; \ | ||
| 205 | event_exit_##sname.id = id; \ | ||
| 206 | set_syscall_exit_id(num, id); \ | ||
| 207 | INIT_LIST_HEAD(&event_exit_##sname.fields); \ | ||
| 208 | return 0; \ | ||
| 209 | } \ | ||
| 210 | TRACE_SYS_EXIT_PROFILE(sname); \ | ||
| 211 | static struct ftrace_event_call __used \ | 163 | static struct ftrace_event_call __used \ |
| 212 | __attribute__((__aligned__(4))) \ | 164 | __attribute__((__aligned__(4))) \ |
| 213 | __attribute__((section("_ftrace_events"))) \ | 165 | __attribute__((section("_ftrace_events"))) \ |
| 214 | event_exit_##sname = { \ | 166 | event_exit_##sname = { \ |
| 215 | .name = "sys_exit"#sname, \ | 167 | .name = "sys_exit"#sname, \ |
| 216 | .system = "syscalls", \ | 168 | .system = "syscalls", \ |
| 217 | .event = &event_syscall_exit, \ | 169 | .event = &exit_syscall_print_##sname, \ |
| 218 | .raw_init = init_exit_##sname, \ | 170 | .raw_init = init_syscall_trace, \ |
| 219 | .show_format = syscall_exit_format, \ | 171 | .show_format = syscall_exit_format, \ |
| 220 | .define_fields = syscall_exit_define_fields, \ | 172 | .define_fields = syscall_exit_define_fields, \ |
| 221 | .regfunc = reg_event_syscall_exit, \ | 173 | .regfunc = reg_event_syscall_exit, \ |
| 222 | .unregfunc = unreg_event_syscall_exit, \ | 174 | .unregfunc = unreg_event_syscall_exit, \ |
| 223 | .data = "sys"#sname, \ | 175 | .data = (void *)&__syscall_meta_##sname,\ |
| 224 | TRACE_SYS_EXIT_PROFILE_INIT(sname) \ | 176 | TRACE_SYS_EXIT_PROFILE_INIT(sname) \ |
| 225 | } | 177 | } |
| 226 | 178 | ||
| @@ -677,6 +629,9 @@ asmlinkage long sys_recv(int, void __user *, size_t, unsigned); | |||
| 677 | asmlinkage long sys_recvfrom(int, void __user *, size_t, unsigned, | 629 | asmlinkage long sys_recvfrom(int, void __user *, size_t, unsigned, |
| 678 | struct sockaddr __user *, int __user *); | 630 | struct sockaddr __user *, int __user *); |
| 679 | asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg, unsigned flags); | 631 | asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg, unsigned flags); |
| 632 | asmlinkage long sys_recvmmsg(int fd, struct mmsghdr __user *msg, | ||
| 633 | unsigned int vlen, unsigned flags, | ||
| 634 | struct timespec __user *timeout); | ||
| 680 | asmlinkage long sys_socket(int, int, int); | 635 | asmlinkage long sys_socket(int, int, int); |
| 681 | asmlinkage long sys_socketpair(int, int, int, int __user *); | 636 | asmlinkage long sys_socketpair(int, int, int, int __user *); |
| 682 | asmlinkage long sys_socketcall(int call, unsigned long __user *args); | 637 | asmlinkage long sys_socketcall(int call, unsigned long __user *args); |
| @@ -879,4 +834,8 @@ int kernel_execve(const char *filename, char *const argv[], char *const envp[]); | |||
| 879 | asmlinkage long sys_perf_event_open( | 834 | asmlinkage long sys_perf_event_open( |
| 880 | struct perf_event_attr __user *attr_uptr, | 835 | struct perf_event_attr __user *attr_uptr, |
| 881 | pid_t pid, int cpu, int group_fd, unsigned long flags); | 836 | pid_t pid, int cpu, int group_fd, unsigned long flags); |
| 837 | |||
| 838 | asmlinkage long sys_mmap_pgoff(unsigned long addr, unsigned long len, | ||
| 839 | unsigned long prot, unsigned long flags, | ||
| 840 | unsigned long fd, unsigned long pgoff); | ||
| 882 | #endif | 841 | #endif |
