diff options
Diffstat (limited to 'include/linux/syscalls.h')
-rw-r--r-- | include/linux/syscalls.h | 132 |
1 files changed, 50 insertions, 82 deletions
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index a990ace1a838..057929b0a651 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
@@ -23,16 +23,21 @@ struct kexec_segment; | |||
23 | struct linux_dirent; | 23 | struct linux_dirent; |
24 | struct linux_dirent64; | 24 | struct linux_dirent64; |
25 | struct list_head; | 25 | struct list_head; |
26 | struct mmap_arg_struct; | ||
26 | struct msgbuf; | 27 | struct msgbuf; |
27 | struct msghdr; | 28 | struct msghdr; |
29 | struct mmsghdr; | ||
28 | struct msqid_ds; | 30 | struct msqid_ds; |
29 | struct new_utsname; | 31 | struct new_utsname; |
30 | struct nfsctl_arg; | 32 | struct nfsctl_arg; |
31 | struct __old_kernel_stat; | 33 | struct __old_kernel_stat; |
34 | struct oldold_utsname; | ||
35 | struct old_utsname; | ||
32 | struct pollfd; | 36 | struct pollfd; |
33 | struct rlimit; | 37 | struct rlimit; |
34 | struct rusage; | 38 | struct rusage; |
35 | struct sched_param; | 39 | struct sched_param; |
40 | struct sel_arg_struct; | ||
36 | struct semaphore; | 41 | struct semaphore; |
37 | struct sembuf; | 42 | struct sembuf; |
38 | struct shmid_ds; | 43 | struct shmid_ds; |
@@ -98,44 +103,21 @@ struct perf_event_attr; | |||
98 | #define __SC_TEST5(t5, a5, ...) __SC_TEST(t5); __SC_TEST4(__VA_ARGS__) | 103 | #define __SC_TEST5(t5, a5, ...) __SC_TEST(t5); __SC_TEST4(__VA_ARGS__) |
99 | #define __SC_TEST6(t6, a6, ...) __SC_TEST(t6); __SC_TEST5(__VA_ARGS__) | 104 | #define __SC_TEST6(t6, a6, ...) __SC_TEST(t6); __SC_TEST5(__VA_ARGS__) |
100 | 105 | ||
101 | #ifdef CONFIG_EVENT_PROFILE | 106 | #ifdef CONFIG_PERF_EVENTS |
102 | #define TRACE_SYS_ENTER_PROFILE(sname) \ | 107 | |
103 | static int prof_sysenter_enable_##sname(void) \ | 108 | #define TRACE_SYS_ENTER_PERF_INIT(sname) \ |
104 | { \ | 109 | .perf_event_enable = perf_sysenter_enable, \ |
105 | return reg_prof_syscall_enter("sys"#sname); \ | 110 | .perf_event_disable = perf_sysenter_disable, |
106 | } \ | 111 | |
107 | \ | 112 | #define TRACE_SYS_EXIT_PERF_INIT(sname) \ |
108 | static void prof_sysenter_disable_##sname(void) \ | 113 | .perf_event_enable = perf_sysexit_enable, \ |
109 | { \ | 114 | .perf_event_disable = perf_sysexit_disable, |
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 | |||
124 | #define TRACE_SYS_ENTER_PROFILE_INIT(sname) \ | ||
125 | .profile_count = ATOMIC_INIT(-1), \ | ||
126 | .profile_enable = prof_sysenter_enable_##sname, \ | ||
127 | .profile_disable = prof_sysenter_disable_##sname, | ||
128 | |||
129 | #define TRACE_SYS_EXIT_PROFILE_INIT(sname) \ | ||
130 | .profile_count = ATOMIC_INIT(-1), \ | ||
131 | .profile_enable = prof_sysexit_enable_##sname, \ | ||
132 | .profile_disable = prof_sysexit_disable_##sname, | ||
133 | #else | 115 | #else |
134 | #define TRACE_SYS_ENTER_PROFILE(sname) | 116 | #define TRACE_SYS_ENTER_PERF(sname) |
135 | #define TRACE_SYS_ENTER_PROFILE_INIT(sname) | 117 | #define TRACE_SYS_ENTER_PERF_INIT(sname) |
136 | #define TRACE_SYS_EXIT_PROFILE(sname) | 118 | #define TRACE_SYS_EXIT_PERF(sname) |
137 | #define TRACE_SYS_EXIT_PROFILE_INIT(sname) | 119 | #define TRACE_SYS_EXIT_PERF_INIT(sname) |
138 | #endif | 120 | #endif /* CONFIG_PERF_EVENTS */ |
139 | 121 | ||
140 | #ifdef CONFIG_FTRACE_SYSCALLS | 122 | #ifdef CONFIG_FTRACE_SYSCALLS |
141 | #define __SC_STR_ADECL1(t, a) #a | 123 | #define __SC_STR_ADECL1(t, a) #a |
@@ -153,75 +135,47 @@ static void prof_sysexit_disable_##sname(void) \ | |||
153 | #define __SC_STR_TDECL6(t, a, ...) #t, __SC_STR_TDECL5(__VA_ARGS__) | 135 | #define __SC_STR_TDECL6(t, a, ...) #t, __SC_STR_TDECL5(__VA_ARGS__) |
154 | 136 | ||
155 | #define SYSCALL_TRACE_ENTER_EVENT(sname) \ | 137 | #define SYSCALL_TRACE_ENTER_EVENT(sname) \ |
156 | static struct ftrace_event_call event_enter_##sname; \ | 138 | static const struct syscall_metadata __syscall_meta_##sname; \ |
157 | struct trace_event enter_syscall_print_##sname = { \ | 139 | static struct ftrace_event_call \ |
140 | __attribute__((__aligned__(4))) event_enter_##sname; \ | ||
141 | static struct trace_event enter_syscall_print_##sname = { \ | ||
158 | .trace = print_syscall_enter, \ | 142 | .trace = print_syscall_enter, \ |
159 | }; \ | 143 | }; \ |
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 \ | 144 | static struct ftrace_event_call __used \ |
176 | __attribute__((__aligned__(4))) \ | 145 | __attribute__((__aligned__(4))) \ |
177 | __attribute__((section("_ftrace_events"))) \ | 146 | __attribute__((section("_ftrace_events"))) \ |
178 | event_enter_##sname = { \ | 147 | event_enter_##sname = { \ |
179 | .name = "sys_enter"#sname, \ | 148 | .name = "sys_enter"#sname, \ |
180 | .system = "syscalls", \ | 149 | .system = "syscalls", \ |
181 | .event = &event_syscall_enter, \ | 150 | .event = &enter_syscall_print_##sname, \ |
182 | .raw_init = init_enter_##sname, \ | 151 | .raw_init = init_syscall_trace, \ |
183 | .show_format = syscall_enter_format, \ | ||
184 | .define_fields = syscall_enter_define_fields, \ | 152 | .define_fields = syscall_enter_define_fields, \ |
185 | .regfunc = reg_event_syscall_enter, \ | 153 | .regfunc = reg_event_syscall_enter, \ |
186 | .unregfunc = unreg_event_syscall_enter, \ | 154 | .unregfunc = unreg_event_syscall_enter, \ |
187 | .data = "sys"#sname, \ | 155 | .data = (void *)&__syscall_meta_##sname,\ |
188 | TRACE_SYS_ENTER_PROFILE_INIT(sname) \ | 156 | TRACE_SYS_ENTER_PERF_INIT(sname) \ |
189 | } | 157 | } |
190 | 158 | ||
191 | #define SYSCALL_TRACE_EXIT_EVENT(sname) \ | 159 | #define SYSCALL_TRACE_EXIT_EVENT(sname) \ |
192 | static struct ftrace_event_call event_exit_##sname; \ | 160 | static const struct syscall_metadata __syscall_meta_##sname; \ |
193 | struct trace_event exit_syscall_print_##sname = { \ | 161 | static struct ftrace_event_call \ |
162 | __attribute__((__aligned__(4))) event_exit_##sname; \ | ||
163 | static struct trace_event exit_syscall_print_##sname = { \ | ||
194 | .trace = print_syscall_exit, \ | 164 | .trace = print_syscall_exit, \ |
195 | }; \ | 165 | }; \ |
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 \ | 166 | static struct ftrace_event_call __used \ |
212 | __attribute__((__aligned__(4))) \ | 167 | __attribute__((__aligned__(4))) \ |
213 | __attribute__((section("_ftrace_events"))) \ | 168 | __attribute__((section("_ftrace_events"))) \ |
214 | event_exit_##sname = { \ | 169 | event_exit_##sname = { \ |
215 | .name = "sys_exit"#sname, \ | 170 | .name = "sys_exit"#sname, \ |
216 | .system = "syscalls", \ | 171 | .system = "syscalls", \ |
217 | .event = &event_syscall_exit, \ | 172 | .event = &exit_syscall_print_##sname, \ |
218 | .raw_init = init_exit_##sname, \ | 173 | .raw_init = init_syscall_trace, \ |
219 | .show_format = syscall_exit_format, \ | ||
220 | .define_fields = syscall_exit_define_fields, \ | 174 | .define_fields = syscall_exit_define_fields, \ |
221 | .regfunc = reg_event_syscall_exit, \ | 175 | .regfunc = reg_event_syscall_exit, \ |
222 | .unregfunc = unreg_event_syscall_exit, \ | 176 | .unregfunc = unreg_event_syscall_exit, \ |
223 | .data = "sys"#sname, \ | 177 | .data = (void *)&__syscall_meta_##sname,\ |
224 | TRACE_SYS_EXIT_PROFILE_INIT(sname) \ | 178 | TRACE_SYS_EXIT_PERF_INIT(sname) \ |
225 | } | 179 | } |
226 | 180 | ||
227 | #define SYSCALL_METADATA(sname, nb) \ | 181 | #define SYSCALL_METADATA(sname, nb) \ |
@@ -245,7 +199,7 @@ static void prof_sysexit_disable_##sname(void) \ | |||
245 | static const struct syscall_metadata __used \ | 199 | static const struct syscall_metadata __used \ |
246 | __attribute__((__aligned__(4))) \ | 200 | __attribute__((__aligned__(4))) \ |
247 | __attribute__((section("__syscalls_metadata"))) \ | 201 | __attribute__((section("__syscalls_metadata"))) \ |
248 | __syscall_meta_##sname = { \ | 202 | __syscall_meta__##sname = { \ |
249 | .name = "sys_"#sname, \ | 203 | .name = "sys_"#sname, \ |
250 | .nb_args = 0, \ | 204 | .nb_args = 0, \ |
251 | .enter_event = &event_enter__##sname, \ | 205 | .enter_event = &event_enter__##sname, \ |
@@ -677,6 +631,9 @@ asmlinkage long sys_recv(int, void __user *, size_t, unsigned); | |||
677 | asmlinkage long sys_recvfrom(int, void __user *, size_t, unsigned, | 631 | asmlinkage long sys_recvfrom(int, void __user *, size_t, unsigned, |
678 | struct sockaddr __user *, int __user *); | 632 | struct sockaddr __user *, int __user *); |
679 | asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg, unsigned flags); | 633 | asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg, unsigned flags); |
634 | asmlinkage long sys_recvmmsg(int fd, struct mmsghdr __user *msg, | ||
635 | unsigned int vlen, unsigned flags, | ||
636 | struct timespec __user *timeout); | ||
680 | asmlinkage long sys_socket(int, int, int); | 637 | asmlinkage long sys_socket(int, int, int); |
681 | asmlinkage long sys_socketpair(int, int, int, int __user *); | 638 | asmlinkage long sys_socketpair(int, int, int, int __user *); |
682 | asmlinkage long sys_socketcall(int call, unsigned long __user *args); | 639 | asmlinkage long sys_socketcall(int call, unsigned long __user *args); |
@@ -685,6 +642,7 @@ asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds, | |||
685 | long timeout); | 642 | long timeout); |
686 | asmlinkage long sys_select(int n, fd_set __user *inp, fd_set __user *outp, | 643 | asmlinkage long sys_select(int n, fd_set __user *inp, fd_set __user *outp, |
687 | fd_set __user *exp, struct timeval __user *tvp); | 644 | fd_set __user *exp, struct timeval __user *tvp); |
645 | asmlinkage long sys_old_select(struct sel_arg_struct __user *arg); | ||
688 | asmlinkage long sys_epoll_create(int size); | 646 | asmlinkage long sys_epoll_create(int size); |
689 | asmlinkage long sys_epoll_create1(int flags); | 647 | asmlinkage long sys_epoll_create1(int flags); |
690 | asmlinkage long sys_epoll_ctl(int epfd, int op, int fd, | 648 | asmlinkage long sys_epoll_ctl(int epfd, int op, int fd, |
@@ -699,6 +657,8 @@ asmlinkage long sys_gethostname(char __user *name, int len); | |||
699 | asmlinkage long sys_sethostname(char __user *name, int len); | 657 | asmlinkage long sys_sethostname(char __user *name, int len); |
700 | asmlinkage long sys_setdomainname(char __user *name, int len); | 658 | asmlinkage long sys_setdomainname(char __user *name, int len); |
701 | asmlinkage long sys_newuname(struct new_utsname __user *name); | 659 | asmlinkage long sys_newuname(struct new_utsname __user *name); |
660 | asmlinkage long sys_uname(struct old_utsname __user *); | ||
661 | asmlinkage long sys_olduname(struct oldold_utsname __user *); | ||
702 | 662 | ||
703 | asmlinkage long sys_getrlimit(unsigned int resource, | 663 | asmlinkage long sys_getrlimit(unsigned int resource, |
704 | struct rlimit __user *rlim); | 664 | struct rlimit __user *rlim); |
@@ -728,6 +688,8 @@ asmlinkage long sys_shmat(int shmid, char __user *shmaddr, int shmflg); | |||
728 | asmlinkage long sys_shmget(key_t key, size_t size, int flag); | 688 | asmlinkage long sys_shmget(key_t key, size_t size, int flag); |
729 | asmlinkage long sys_shmdt(char __user *shmaddr); | 689 | asmlinkage long sys_shmdt(char __user *shmaddr); |
730 | asmlinkage long sys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf); | 690 | asmlinkage long sys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf); |
691 | asmlinkage long sys_ipc(unsigned int call, int first, unsigned long second, | ||
692 | unsigned long third, void __user *ptr, long fifth); | ||
731 | 693 | ||
732 | asmlinkage long sys_mq_open(const char __user *name, int oflag, mode_t mode, struct mq_attr __user *attr); | 694 | asmlinkage long sys_mq_open(const char __user *name, int oflag, mode_t mode, struct mq_attr __user *attr); |
733 | asmlinkage long sys_mq_unlink(const char __user *name); | 695 | asmlinkage long sys_mq_unlink(const char __user *name); |
@@ -879,4 +841,10 @@ int kernel_execve(const char *filename, char *const argv[], char *const envp[]); | |||
879 | asmlinkage long sys_perf_event_open( | 841 | asmlinkage long sys_perf_event_open( |
880 | struct perf_event_attr __user *attr_uptr, | 842 | struct perf_event_attr __user *attr_uptr, |
881 | pid_t pid, int cpu, int group_fd, unsigned long flags); | 843 | pid_t pid, int cpu, int group_fd, unsigned long flags); |
844 | |||
845 | asmlinkage long sys_mmap_pgoff(unsigned long addr, unsigned long len, | ||
846 | unsigned long prot, unsigned long flags, | ||
847 | unsigned long fd, unsigned long pgoff); | ||
848 | asmlinkage long sys_old_mmap(struct mmap_arg_struct __user *arg); | ||
849 | |||
882 | #endif | 850 | #endif |