3434
3535#include <stddef.h>
3636#include <syscall.h>
37+ #include <fcntl.h>
3738
3839#define SARGS (name , r , ...) \
3940 [SYS_##name] = {#name, r, {__VA_ARGS__, }}
4041
42+ /* Linux syscalls on X86_64 */
4143static const struct syscall_desc table [] = {
4244 SARGS (read , rdec , arg_fd , arg_ , arg_ ),
4345 SARGS (write , rdec , arg_fd , arg_ , arg_ ),
44- SARGS (open , rdec , arg_cstr , arg_ , arg_ ),
46+ SARGS (open , rdec , arg_cstr , arg_open_flags , arg_mode ),
4547 SARGS (close , rdec , arg_fd ),
4648 SARGS (stat , rdec , arg_cstr , arg_ ),
4749 SARGS (fstat , rdec , arg_fd , arg_ ),
@@ -54,13 +56,13 @@ static const struct syscall_desc table[] = {
5456 SARGS (brk , rdec , arg_ ),
5557 SARGS (rt_sigaction , rdec , arg_ , arg_ , arg_ ),
5658 SARGS (rt_sigprocmask , rdec , arg_ , arg_ , arg_ , arg_ ),
57- SARGS (rt_sigreturn , rdec , arg_none ),
59+ SARGS (rt_sigreturn , rnoreturn , arg_none ),
5860 SARGS (ioctl , rdec , arg_fd , arg_ , arg_ ),
5961 SARGS (pread64 , rdec , arg_fd , arg_ , arg_ , arg_ ),
6062 SARGS (pwrite64 , rdec , arg_fd , arg_ , arg_ , arg_ ),
6163 SARGS (readv , rdec , arg_fd , arg_ , arg_ ),
6264 SARGS (writev , rdec , arg_fd , arg_ , arg_ ),
63- SARGS (access , rdec , arg_cstr , arg_ ),
65+ SARGS (access , rdec , arg_cstr , arg_mode ),
6466 SARGS (pipe , rdec , arg_ ),
6567 SARGS (select , rdec , arg_ , arg_ , arg_ , arg_ , arg_ ),
6668 SARGS (sched_yield , rdec , arg_none ),
@@ -99,7 +101,7 @@ static const struct syscall_desc table[] = {
99101 SARGS (fork , rdec , arg_none ),
100102 SARGS (vfork , rdec , arg_none ),
101103 SARGS (execve , rdec , arg_ , arg_ , arg_ ),
102- SARGS (exit , rdec , arg_ ),
104+ SARGS (exit , rnoreturn , arg_ ),
103105 SARGS (wait4 , rdec , arg_ , arg_ , arg_ , arg_ ),
104106 SARGS (kill , rdec , arg_ , arg_ ),
105107 SARGS (uname , rdec , arg_ ),
@@ -122,19 +124,19 @@ static const struct syscall_desc table[] = {
122124 SARGS (chdir , rdec , arg_cstr ),
123125 SARGS (fchdir , rdec , arg_fd ),
124126 SARGS (rename , rdec , arg_cstr , arg_cstr ),
125- SARGS (mkdir , rdec , arg_cstr , arg_ ),
127+ SARGS (mkdir , rdec , arg_cstr , arg_mode ),
126128 SARGS (rmdir , rdec , arg_cstr ),
127- SARGS (creat , rdec , arg_cstr , arg_ ),
129+ SARGS (creat , rdec , arg_cstr , arg_mode ),
128130 SARGS (link , rdec , arg_cstr , arg_cstr ),
129131 SARGS (unlink , rdec , arg_cstr ),
130132 SARGS (symlink , rdec , arg_cstr , arg_cstr ),
131133 SARGS (readlink , rdec , arg_cstr , arg_ , arg_ ),
132- SARGS (chmod , rdec , arg_cstr , arg_ ),
133- SARGS (fchmod , rdec , arg_fd , arg_ ),
134+ SARGS (chmod , rdec , arg_cstr , arg_mode ),
135+ SARGS (fchmod , rdec , arg_fd , arg_mode ),
134136 SARGS (chown , rdec , arg_cstr , arg_ , arg_ ),
135137 SARGS (fchown , rdec , arg_fd , arg_ , arg_ ),
136138 SARGS (lchown , rdec , arg_cstr , arg_ , arg_ ),
137- SARGS (umask , roct , arg_ ),
139+ SARGS (umask , rmode , arg_mode ),
138140 SARGS (gettimeofday , rdec , arg_ , arg_ ),
139141 SARGS (getrlimit , rdec , arg_ , arg_ ),
140142 SARGS (getrusage , rdec , arg_ , arg_ ),
@@ -248,20 +250,177 @@ static const struct syscall_desc table[] = {
248250 SARGS (timer_settime , rdec , arg_ , arg_ , arg_ , arg_ ),
249251 SARGS (timer_gettime , rdec , arg_ , arg_ ),
250252 SARGS (timer_getoverrun , rdec , arg_ ),
251- SARGS (timer_delete , rdec , arg_ )
252- /* to be continued... at this point I got tired */
253+ SARGS (timer_delete , rdec , arg_ ),
254+ SARGS (clock_settime , rdec , arg_ , arg_ ),
255+ SARGS (clock_gettime , rdec , arg_ , arg_ ),
256+ SARGS (clock_getres , rdec , arg_ , arg_ ),
257+ SARGS (clock_nanosleep , rdec , arg_ , arg_ , arg_ , arg_ ),
258+ SARGS (exit_group , rnoreturn , arg_ ),
259+ SARGS (epoll_wait , rdec , arg_fd , arg_ , arg_ , arg_ ),
260+ SARGS (epoll_ctl , rdec , arg_fd , arg_ , arg_fd , arg_ ),
261+ SARGS (tgkill , rdec , arg_ , arg_ , arg_ ),
262+ SARGS (utimes , rdec , arg_cstr , arg_ ),
263+ SARGS (mbind , rdec , arg_ , arg_ , arg_ , arg_ , arg_ ),
264+ SARGS (set_mempolicy , rdec , arg_ , arg_ , arg_ ),
265+ SARGS (get_mempolicy , rdec , arg_ , arg_ , arg_ , arg_ , arg_ ),
266+ SARGS (mq_open , rdec , arg_cstr , arg_ , arg_ , arg_ , arg_ ),
267+ SARGS (mq_unlink , rdec , arg_cstr ),
268+ SARGS (mq_timedsend , rdec , arg_ , arg_ , arg_ , arg_ , arg_ ),
269+ SARGS (mq_timedreceive , rdec , arg_ , arg_ , arg_ , arg_ , arg_ ),
270+ SARGS (mq_notify , rdec , arg_ , arg_ ),
271+ SARGS (mq_getsetattr , rdec , arg_ , arg_ , arg_ ),
272+ SARGS (kexec_load , rdec , arg_ , arg_ , arg_ , arg_ ),
273+ SARGS (waitid , rdec , arg_ , arg_ , arg_ , arg_ ),
274+ SARGS (add_key , rdec , arg_ , arg_ , arg_ , arg_ , arg_ ),
275+ SARGS (request_key , rdec , arg_ , arg_ , arg_ , arg_ ),
276+ SARGS (keyctl , rdec , arg_ , arg_ , arg_ , arg_ , arg_ ),
277+ SARGS (ioprio_set , rdec , arg_ , arg_ , arg_ ),
278+ SARGS (ioprio_get , rdec , arg_ , arg_ ),
279+ SARGS (inotify_init , rdec , arg_none ),
280+ SARGS (inotify_add_watch , rdec , arg_fd , arg_cstr , arg_ ),
281+ SARGS (inotify_rm_watch , rdec , arg_fd , arg_ ),
282+ SARGS (migrate_pages , rdec , arg_ , arg_ , arg_ , arg_ ),
283+ SARGS (openat , rdec , arg_atfd , arg_cstr , arg_open_flags , arg_mode ),
284+ SARGS (mkdirat , rdec , arg_atfd , arg_cstr , arg_mode ),
285+ SARGS (mknodat , rdec , arg_atfd , arg_cstr , arg_mode , arg_ ),
286+ SARGS (fchownat , rdec , arg_atfd , arg_cstr , arg_ , arg_ , arg_ ),
287+ SARGS (futimesat , rdec , arg_atfd , arg_cstr , arg_ ),
288+ SARGS (newfstatat , rdec , arg_atfd , arg_cstr , arg_ , arg_ ),
289+ SARGS (unlinkat , rdec , arg_atfd , arg_cstr , arg_ ),
290+ SARGS (renameat , rdec , arg_atfd , arg_cstr , arg_atfd , arg_cstr ),
291+ SARGS (linkat , rdec , arg_atfd , arg_cstr , arg_atfd , arg_cstr , arg_ ),
292+ SARGS (symlinkat , rdec , arg_atfd , arg_cstr , arg_cstr ),
293+ SARGS (readlinkat , rdec , arg_atfd , arg_cstr , arg_ , arg_ ),
294+ SARGS (fchmodat , rdec , arg_atfd , arg_cstr , arg_mode ),
295+ SARGS (faccessat , rdec , arg_atfd , arg_cstr , arg_mode ),
296+ SARGS (pselect6 , rdec , arg_ , arg_ , arg_ , arg_ , arg_ , arg_ ),
297+ SARGS (ppoll , rdec , arg_ , arg_ , arg_ , arg_ , arg_ ),
298+ SARGS (unshare , rdec , arg_ ),
299+ SARGS (set_robust_list , rdec , arg_ , arg_ ),
300+ SARGS (get_robust_list , rdec , arg_ , arg_ , arg_ ),
301+ SARGS (splice , rdec , arg_fd , arg_ , arg_fd , arg_ , arg_ , arg_ ),
302+ SARGS (tee , rdec , arg_fd , arg_fd , arg_ , arg_ ),
303+ SARGS (sync_file_range , rdec , arg_fd , arg_ , arg_ , arg_ ),
304+ SARGS (vmsplice , rdec , arg_fd , arg_ , arg_ , arg_ ),
305+ SARGS (move_pages , rdec , arg_ , arg_ , arg_ , arg_ , arg_ , arg_ ),
306+ SARGS (utimensat , rdec , arg_atfd , arg_cstr , arg_ , arg_ ),
307+ SARGS (epoll_pwait , rdec , arg_fd , arg_ , arg_ , arg_ , arg_ , arg_ ),
308+ SARGS (signalfd , rdec , arg_fd , arg_ , arg_ ),
309+ SARGS (timerfd_create , rdec , arg_ , arg_ ),
310+ SARGS (eventfd , rdec , arg_ ),
311+ SARGS (fallocate , rdec , arg_fd , arg_ , arg_ , arg_ ),
312+ SARGS (timerfd_settime , rdec , arg_fd , arg_ , arg_ , arg_ ),
313+ SARGS (timerfd_gettime , rdec , arg_fd , arg_ ),
314+ SARGS (accept4 , rdec , arg_fd , arg_ , arg_ , arg_ , arg_ ),
315+ SARGS (signalfd4 , rdec , arg_fd , arg_ , arg_ , arg_ , arg_ ),
316+ SARGS (eventfd2 , rdec , arg_ , arg_ ),
317+ SARGS (epoll_create1 , rdec , arg_ ),
318+ SARGS (dup3 , rdec , arg_fd , arg_fd , arg_ ),
319+ SARGS (pipe2 , rdec , arg_ , arg_ ),
320+ SARGS (inotify_init1 , rdec , arg_ ),
321+ SARGS (preadv , rdec , arg_fd , arg_ , arg_ , arg_ ),
322+ SARGS (pwritev , rdec , arg_fd , arg_ , arg_ , arg_ ),
323+ SARGS (rt_tgsigqueueinfo , rdec , arg_ , arg_ , arg_ , arg_ ),
324+ SARGS (perf_event_open , rdec , arg_ , arg_ , arg_ , arg_ , arg_ ),
325+ SARGS (recvmmsg , rdec , arg_fd , arg_ , arg_ , arg_ , arg_ ),
326+ SARGS (fanotify_init , rdec , arg_ , arg_ ),
327+ SARGS (fanotify_mark , rdec , arg_ , arg_ , arg_ , arg_ , arg_ ),
328+ SARGS (prlimit64 , rdec , arg_ , arg_ , arg_ , arg_ ),
329+ SARGS (name_to_handle_at , rdec , arg_atfd , arg_cstr , arg_ , arg_ , arg_ ),
330+ SARGS (open_by_handle_at , rdec , arg_atfd , arg_cstr , arg_ ),
331+ SARGS (clock_adjtime , rdec , arg_ , arg_ ),
332+ SARGS (syncfs , rdec , arg_fd ),
333+ SARGS (sendmmsg , rdec , arg_fd , arg_ , arg_ , arg_ ),
334+ SARGS (setns , rdec , arg_fd , arg_ ),
335+ SARGS (getcpu , rdec , arg_ , arg_ , arg_ ),
336+ SARGS (process_vm_readv , rdec , arg_ , arg_ , arg_ , arg_ , arg_ , arg_ ),
337+ SARGS (process_vm_writev , rdec , arg_ , arg_ , arg_ , arg_ , arg_ , arg_ ),
338+ SARGS (kcmp , rdec , arg_ , arg_ , arg_ , arg_ , arg_ ),
339+ SARGS (finit_module , rdec , arg_fd , arg_ , arg_ ),
340+ #ifdef SYS_sched_setattr
341+ SARGS (sched_setattr , rdec , arg_ , arg_ , arg_ ),
342+ #endif
343+ #ifdef SYS_sched_getattr
344+ SARGS (sched_getattr , rdec , arg_ , arg_ , arg_ , arg_ ),
345+ #endif
346+ #ifdef SYS_renameat2
347+ SARGS (renameat2 , rdec , arg_atfd , arg_cstr , arg_atfd , arg_cstr , arg_ ),
348+ #endif
349+ #ifdef SYS_seccomp
350+ SARGS (seccomp , rdec , arg_ , arg_ , arg_ ),
351+ #endif
352+ #ifdef SYS_getrandom
353+ SARGS (getrandom , rdec , arg_ , arg_ , arg_ ),
354+ #endif
355+ #ifdef SYS_memfd_create
356+ SARGS (memfd_create , rdec , arg_cstr , arg_ ),
357+ #endif
358+ #ifdef SYS_kexec_file_load
359+ SARGS (kexec_file_load , rdec , arg_ , arg_ , arg_ , arg_ , arg_ ),
360+ #endif
361+ #ifdef SYS_bpf
362+ SARGS (bpf , rdec , arg_ , arg_ , arg_ ),
363+ #endif
364+ #ifdef SYS_execveat
365+ SARGS (execveat , rdec , arg_atfd , arg_cstr , arg_ , arg_ , arg_ ),
366+ #endif
367+ #ifdef SYS_userfaultfd
368+ SARGS (userfaultfd , rdec , arg_ ),
369+ #endif
370+ #ifdef SYS_membarrier
371+ SARGS (membarrier , rdec , arg_ , arg_ ),
372+ #endif
373+ #ifdef SYS_mlock2
374+ SARGS (mlock2 , rdec , arg_ , arg_ , arg_ ),
375+ #endif
376+ #ifdef SYS_copy_file_range
377+ SARGS (copy_file_range , rdec , arg_fd , arg_ , arg_fd , arg_ , arg_ , arg_ ),
378+ #endif
379+ #ifdef SYS_preadv2
380+ SARGS (preadv2 , rdec , arg_fd , arg_ , arg_ , arg_ , arg_ ),
381+ #endif
382+ #ifdef SYS_pwritev2
383+ SARGS (pwritev2 , rdec , arg_fd , arg_ , arg_ , arg_ , arg_ ),
384+ #endif
385+ #ifdef SYS_pkey_mprotect
386+ SARGS (pkey_mprotect , rdec , arg_ , arg_ , arg_ , arg_ ),
387+ #endif
388+ #ifdef SYS_pkey_alloc
389+ SARGS (pkey_alloc , rdec , arg_ , arg_ ),
390+ #endif
391+ #ifdef SYS_pkey_free
392+ SARGS (pkey_free , rdec , arg_ ),
393+ #endif
253394};
254395
255396#undef SARGS
256397
398+ static const struct syscall_desc open_without_mode = {
399+ .name = "open" ,
400+ .return_type = rdec ,
401+ .args = {arg_cstr , arg_open_flags , }
402+ };
403+
404+ static const struct syscall_desc openat_without_mode = {
405+ .name = "openat" ,
406+ .return_type = rdec ,
407+ .args = {arg_atfd , arg_cstr , arg_open_flags , }
408+ };
409+
257410const struct syscall_desc *
258- get_syscall_desc (long syscall_number )
411+ get_syscall_desc (long syscall_number , const long args [ 6 ] )
259412{
260413 if (syscall_number < 0 )
261414 return NULL ;
262415
263416 if ((size_t )syscall_number >= (sizeof (table ) / sizeof (table [0 ])))
264417 return NULL ;
265418
419+ if (syscall_number == SYS_open && (args [1 ] & O_CREAT ) == 0 )
420+ return & open_without_mode ;
421+
422+ if (syscall_number == SYS_openat && (args [2 ] & O_CREAT ) == 0 )
423+ return & openat_without_mode ;
424+
266425 return table + syscall_number ;
267426}
0 commit comments