From 94dfd85b0cc8d2271b9d1aedeb75d43123a94e85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 28 Apr 2021 03:18:05 +0800 Subject: [PATCH 1/5] basic/missing-syscalls: only emit one warning about missing numbers The ifdef pattern is the same for all syscalls, so most of the time, if one is not defined, all others will too. So let's reduce the noise a bit and emit one warning in case the support for the architecture is fully missing. (Current template was copied over from before when we added numbers for each syscall by hand and stopped making sense when we started generating the header from a table that is expected to have all syscall numbers.) --- src/basic/missing_syscall_def.h | 54 +++++++++++++++++++++++++-------- src/basic/missing_syscalls.py | 34 ++++++++++++++++----- 2 files changed, 68 insertions(+), 20 deletions(-) diff --git a/src/basic/missing_syscall_def.h b/src/basic/missing_syscall_def.h index a66977cfec..753596f97d 100644 --- a/src/basic/missing_syscall_def.h +++ b/src/basic/missing_syscall_def.h @@ -1,6 +1,34 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later * This file is generated. Do not edit! */ +/* Note: if this code looks strange, this is because it is derived from the same + * template as the per-syscall blocks below. */ +# if defined(__aarch64__) +# elif defined(__alpha__) +# elif defined(__arc__) || defined(__tilegx__) +# elif defined(__arm__) +# elif defined(__i386__) +# elif defined(__ia64__) +# elif defined(__m68k__) +# elif defined(_MIPS_SIM) +# if _MIPS_SIM == _MIPS_SIM_ABI32 +# elif _MIPS_SIM == _MIPS_SIM_NABI32 +# elif _MIPS_SIM == _MIPS_SIM_ABI64 +# else +# error "Unknown MIPS ABI" +# endif +# elif defined(__powerpc__) +# elif defined(__s390__) +# elif defined(__sparc__) +# elif defined(__x86_64__) +# if defined(__ILP32__) +# else +# endif +# elif !defined(missing_arch_template) +# warning "Current architecture is missing from the template" +# define missing_arch_template 1 +# endif + #ifndef __IGNORE_bpf # if defined(__aarch64__) # define systemd_NR_bpf 280 @@ -38,7 +66,7 @@ # else # define systemd_NR_bpf 321 # endif -# else +# elif !defined(missing_arch_template) # warning "bpf() syscall number is unknown for your architecture" # endif @@ -94,7 +122,7 @@ assert_cc(__NR_bpf == systemd_NR_bpf); # else # define systemd_NR_close_range 436 # endif -# else +# elif !defined(missing_arch_template) # warning "close_range() syscall number is unknown for your architecture" # endif @@ -150,7 +178,7 @@ assert_cc(__NR_close_range == systemd_NR_close_range); # else # define systemd_NR_copy_file_range 326 # endif -# else +# elif !defined(missing_arch_template) # warning "copy_file_range() syscall number is unknown for your architecture" # endif @@ -206,7 +234,7 @@ assert_cc(__NR_copy_file_range == systemd_NR_copy_file_range); # else # define systemd_NR_getrandom 318 # endif -# else +# elif !defined(missing_arch_template) # warning "getrandom() syscall number is unknown for your architecture" # endif @@ -262,7 +290,7 @@ assert_cc(__NR_getrandom == systemd_NR_getrandom); # else # define systemd_NR_memfd_create 319 # endif -# else +# elif !defined(missing_arch_template) # warning "memfd_create() syscall number is unknown for your architecture" # endif @@ -318,7 +346,7 @@ assert_cc(__NR_memfd_create == systemd_NR_memfd_create); # else # define systemd_NR_name_to_handle_at 303 # endif -# else +# elif !defined(missing_arch_template) # warning "name_to_handle_at() syscall number is unknown for your architecture" # endif @@ -374,7 +402,7 @@ assert_cc(__NR_name_to_handle_at == systemd_NR_name_to_handle_at); # else # define systemd_NR_pidfd_open 434 # endif -# else +# elif !defined(missing_arch_template) # warning "pidfd_open() syscall number is unknown for your architecture" # endif @@ -430,7 +458,7 @@ assert_cc(__NR_pidfd_open == systemd_NR_pidfd_open); # else # define systemd_NR_pidfd_send_signal 424 # endif -# else +# elif !defined(missing_arch_template) # warning "pidfd_send_signal() syscall number is unknown for your architecture" # endif @@ -486,7 +514,7 @@ assert_cc(__NR_pidfd_send_signal == systemd_NR_pidfd_send_signal); # else # define systemd_NR_pkey_mprotect 329 # endif -# else +# elif !defined(missing_arch_template) # warning "pkey_mprotect() syscall number is unknown for your architecture" # endif @@ -542,7 +570,7 @@ assert_cc(__NR_pkey_mprotect == systemd_NR_pkey_mprotect); # else # define systemd_NR_renameat2 316 # endif -# else +# elif !defined(missing_arch_template) # warning "renameat2() syscall number is unknown for your architecture" # endif @@ -598,7 +626,7 @@ assert_cc(__NR_renameat2 == systemd_NR_renameat2); # else # define systemd_NR_setns 308 # endif -# else +# elif !defined(missing_arch_template) # warning "setns() syscall number is unknown for your architecture" # endif @@ -654,7 +682,7 @@ assert_cc(__NR_setns == systemd_NR_setns); # else # define systemd_NR_statx 332 # endif -# else +# elif !defined(missing_arch_template) # warning "statx() syscall number is unknown for your architecture" # endif @@ -710,7 +738,7 @@ assert_cc(__NR_statx == systemd_NR_statx); # else # define systemd_NR_epoll_pwait2 441 # endif -# else +# elif !defined(missing_arch_template) # warning "epoll_pwait2() syscall number is unknown for your architecture" # endif diff --git a/src/basic/missing_syscalls.py b/src/basic/missing_syscalls.py index 550be48cf4..e83a17b59a 100644 --- a/src/basic/missing_syscalls.py +++ b/src/basic/missing_syscalls.py @@ -37,8 +37,12 @@ def parse_syscall_tables(filenames): return {filename.split('-')[-1][:-4]: parse_syscall_table(filename) for filename in filenames} -DEF_TEMPLATE = ''' +DEF_TEMPLATE_A = '''\ + #ifndef __IGNORE_{syscall} +''' + +DEF_TEMPLATE_B = '''\ # if defined(__aarch64__) # define systemd_NR_{syscall} {nr_arm64} # elif defined(__alpha__) @@ -75,9 +79,12 @@ DEF_TEMPLATE = ''' # else # define systemd_NR_{syscall} {nr_x86_64} # endif -# else -# warning "{syscall}() syscall number is unknown for your architecture" +# elif !defined(missing_arch_template) +%s # endif +''' + +DEF_TEMPLATE_C = '''\ /* may be an (invalid) negative number due to libseccomp, see PR 13319 */ # if defined __NR_{syscall} && __NR_{syscall} >= 0 @@ -92,20 +99,33 @@ assert_cc(__NR_{syscall} == systemd_NR_{syscall}); # define __NR_{syscall} systemd_NR_{syscall} # endif # endif -#endif -''' +#endif''' + +DEF_TEMPLATE = (DEF_TEMPLATE_A + + DEF_TEMPLATE_B % '# warning "{syscall}() syscall number is unknown for your architecture"' + + DEF_TEMPLATE_C) + +ARCH_CHECK = '''\ +/* Note: if this code looks strange, this is because it is derived from the same + * template as the per-syscall blocks below. */ +''' + '\n'.join(line for line in DEF_TEMPLATE_B.splitlines() + if ' define ' not in line) % '''\ +# warning "Current architecture is missing from the template" +# define missing_arch_template 1''' def print_syscall_def(syscall, tables, out): mappings = {f'nr_{arch}':t.get(syscall, -1) for arch, t in tables.items()} print(DEF_TEMPLATE.format(syscall=syscall, **mappings), - file=out, end='') + file=out) def print_syscall_defs(syscalls, tables, out): print('''\ /* SPDX-License-Identifier: LGPL-2.1-or-later * This file is generated. Do not edit! */ -''' , file=out, end='') +''', + file=out) + print(ARCH_CHECK, file=out) for syscall in syscalls: print_syscall_def(syscall, tables, out) From 302beee342e388b771085bb4d19f271af9cbb235 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 28 Apr 2021 03:34:38 +0800 Subject: [PATCH 2/5] basic/missing-syscall: add numbers for riscv (64-bit) --- src/basic/meson.build | 1 + src/basic/missing_syscall_def.h | 27 ++ src/basic/missing_syscalls.py | 2 + src/basic/syscalls-riscv64.txt | 594 ++++++++++++++++++++++++++++++++ 4 files changed, 624 insertions(+) create mode 100644 src/basic/syscalls-riscv64.txt diff --git a/src/basic/meson.build b/src/basic/meson.build index a7b8be26ac..18084875bd 100644 --- a/src/basic/meson.build +++ b/src/basic/meson.build @@ -358,6 +358,7 @@ arch_list = [ 'mipso32', 'powerpc', 'powerpc64', + 'riscv64', 's390', 's390x', 'sparc', diff --git a/src/basic/missing_syscall_def.h b/src/basic/missing_syscall_def.h index 753596f97d..de2528216e 100644 --- a/src/basic/missing_syscall_def.h +++ b/src/basic/missing_syscall_def.h @@ -18,6 +18,7 @@ # error "Unknown MIPS ABI" # endif # elif defined(__powerpc__) +# elif defined(__riscv) && defined(__LP64__) # elif defined(__s390__) # elif defined(__sparc__) # elif defined(__x86_64__) @@ -56,6 +57,8 @@ # endif # elif defined(__powerpc__) # define systemd_NR_bpf 361 +# elif defined(__riscv) && defined(__LP64__) +# define systemd_NR_bpf 280 # elif defined(__s390__) # define systemd_NR_bpf 351 # elif defined(__sparc__) @@ -112,6 +115,8 @@ assert_cc(__NR_bpf == systemd_NR_bpf); # endif # elif defined(__powerpc__) # define systemd_NR_close_range 436 +# elif defined(__riscv) && defined(__LP64__) +# define systemd_NR_close_range 436 # elif defined(__s390__) # define systemd_NR_close_range 436 # elif defined(__sparc__) @@ -168,6 +173,8 @@ assert_cc(__NR_close_range == systemd_NR_close_range); # endif # elif defined(__powerpc__) # define systemd_NR_copy_file_range 379 +# elif defined(__riscv) && defined(__LP64__) +# define systemd_NR_copy_file_range 285 # elif defined(__s390__) # define systemd_NR_copy_file_range 375 # elif defined(__sparc__) @@ -224,6 +231,8 @@ assert_cc(__NR_copy_file_range == systemd_NR_copy_file_range); # endif # elif defined(__powerpc__) # define systemd_NR_getrandom 359 +# elif defined(__riscv) && defined(__LP64__) +# define systemd_NR_getrandom 278 # elif defined(__s390__) # define systemd_NR_getrandom 349 # elif defined(__sparc__) @@ -280,6 +289,8 @@ assert_cc(__NR_getrandom == systemd_NR_getrandom); # endif # elif defined(__powerpc__) # define systemd_NR_memfd_create 360 +# elif defined(__riscv) && defined(__LP64__) +# define systemd_NR_memfd_create 279 # elif defined(__s390__) # define systemd_NR_memfd_create 350 # elif defined(__sparc__) @@ -336,6 +347,8 @@ assert_cc(__NR_memfd_create == systemd_NR_memfd_create); # endif # elif defined(__powerpc__) # define systemd_NR_name_to_handle_at 345 +# elif defined(__riscv) && defined(__LP64__) +# define systemd_NR_name_to_handle_at 264 # elif defined(__s390__) # define systemd_NR_name_to_handle_at 335 # elif defined(__sparc__) @@ -392,6 +405,8 @@ assert_cc(__NR_name_to_handle_at == systemd_NR_name_to_handle_at); # endif # elif defined(__powerpc__) # define systemd_NR_pidfd_open 434 +# elif defined(__riscv) && defined(__LP64__) +# define systemd_NR_pidfd_open 434 # elif defined(__s390__) # define systemd_NR_pidfd_open 434 # elif defined(__sparc__) @@ -448,6 +463,8 @@ assert_cc(__NR_pidfd_open == systemd_NR_pidfd_open); # endif # elif defined(__powerpc__) # define systemd_NR_pidfd_send_signal 424 +# elif defined(__riscv) && defined(__LP64__) +# define systemd_NR_pidfd_send_signal 424 # elif defined(__s390__) # define systemd_NR_pidfd_send_signal 424 # elif defined(__sparc__) @@ -504,6 +521,8 @@ assert_cc(__NR_pidfd_send_signal == systemd_NR_pidfd_send_signal); # endif # elif defined(__powerpc__) # define systemd_NR_pkey_mprotect 386 +# elif defined(__riscv) && defined(__LP64__) +# define systemd_NR_pkey_mprotect 288 # elif defined(__s390__) # define systemd_NR_pkey_mprotect 384 # elif defined(__sparc__) @@ -560,6 +579,8 @@ assert_cc(__NR_pkey_mprotect == systemd_NR_pkey_mprotect); # endif # elif defined(__powerpc__) # define systemd_NR_renameat2 357 +# elif defined(__riscv) && defined(__LP64__) +# define systemd_NR_renameat2 276 # elif defined(__s390__) # define systemd_NR_renameat2 347 # elif defined(__sparc__) @@ -616,6 +637,8 @@ assert_cc(__NR_renameat2 == systemd_NR_renameat2); # endif # elif defined(__powerpc__) # define systemd_NR_setns 350 +# elif defined(__riscv) && defined(__LP64__) +# define systemd_NR_setns 268 # elif defined(__s390__) # define systemd_NR_setns 339 # elif defined(__sparc__) @@ -672,6 +695,8 @@ assert_cc(__NR_setns == systemd_NR_setns); # endif # elif defined(__powerpc__) # define systemd_NR_statx 383 +# elif defined(__riscv) && defined(__LP64__) +# define systemd_NR_statx 291 # elif defined(__s390__) # define systemd_NR_statx 379 # elif defined(__sparc__) @@ -728,6 +753,8 @@ assert_cc(__NR_statx == systemd_NR_statx); # endif # elif defined(__powerpc__) # define systemd_NR_epoll_pwait2 441 +# elif defined(__riscv) && defined(__LP64__) +# define systemd_NR_epoll_pwait2 441 # elif defined(__s390__) # define systemd_NR_epoll_pwait2 441 # elif defined(__sparc__) diff --git a/src/basic/missing_syscalls.py b/src/basic/missing_syscalls.py index e83a17b59a..adfe53d025 100644 --- a/src/basic/missing_syscalls.py +++ b/src/basic/missing_syscalls.py @@ -69,6 +69,8 @@ DEF_TEMPLATE_B = '''\ # endif # elif defined(__powerpc__) # define systemd_NR_{syscall} {nr_powerpc} +# elif defined(__riscv) && defined(__LP64__) +# define systemd_NR_{syscall} {nr_riscv64} # elif defined(__s390__) # define systemd_NR_{syscall} {nr_s390} # elif defined(__sparc__) diff --git a/src/basic/syscalls-riscv64.txt b/src/basic/syscalls-riscv64.txt new file mode 100644 index 0000000000..60445d0c99 --- /dev/null +++ b/src/basic/syscalls-riscv64.txt @@ -0,0 +1,594 @@ +_llseek +_newselect +_sysctl +accept 202 +accept4 242 +access +acct 89 +add_key 217 +adjtimex 171 +alarm +arc_gettls +arc_settls +arc_usr_cmpxchg +arch_prctl +arm_fadvise64_64 +atomic_barrier +atomic_cmpxchg_32 +bdflush +bind 200 +bpf 280 +brk 214 +cachectl +cacheflush +capget 90 +capset 91 +chdir 49 +chmod +chown +chown32 +chroot 51 +clock_adjtime 266 +clock_adjtime64 +clock_getres 114 +clock_getres_time64 +clock_gettime 113 +clock_gettime64 +clock_nanosleep 115 +clock_nanosleep_time64 +clock_settime 112 +clock_settime64 +clone 220 +clone2 +clone3 435 +close 57 +close_range 436 +connect 203 +copy_file_range 285 +creat +create_module +delete_module 106 +dipc +dup 23 +dup2 +dup3 24 +epoll_create +epoll_create1 20 +epoll_ctl 21 +epoll_ctl_old +epoll_pwait 22 +epoll_pwait2 441 +epoll_wait +epoll_wait_old +eventfd +eventfd2 19 +exec_with_loader +execv +execve 221 +execveat 281 +exit 93 +exit_group 94 +faccessat 48 +faccessat2 439 +fadvise64 223 +fadvise64_64 +fallocate 47 +fanotify_init 262 +fanotify_mark 263 +fchdir 50 +fchmod 52 +fchmodat 53 +fchown 55 +fchown32 +fchownat 54 +fcntl 25 +fcntl64 +fdatasync 83 +fgetxattr 10 +finit_module 273 +flistxattr 13 +flock 32 +fork +fp_udfiex_crtl +fremovexattr 16 +fsconfig 431 +fsetxattr 7 +fsmount 432 +fsopen 430 +fspick 433 +fstat 80 +fstat64 +fstatat64 +fstatfs 44 +fstatfs64 +fsync 82 +ftruncate 46 +ftruncate64 +futex 98 +futex_time64 +futimesat +get_kernel_syms +get_mempolicy 236 +get_robust_list 100 +get_thread_area +getcpu 168 +getcwd 17 +getdents +getdents64 61 +getdomainname +getdtablesize +getegid 177 +getegid32 +geteuid 175 +geteuid32 +getgid 176 +getgid32 +getgroups 158 +getgroups32 +gethostname +getitimer 102 +getpagesize +getpeername 205 +getpgid 155 +getpgrp +getpid 172 +getpmsg +getppid 173 +getpriority 141 +getrandom 278 +getresgid 150 +getresgid32 +getresuid 148 +getresuid32 +getrlimit 163 +getrusage 165 +getsid 156 +getsockname 204 +getsockopt 209 +gettid 178 +gettimeofday 169 +getuid 174 +getuid32 +getunwind +getxattr 8 +getxgid +getxpid +getxuid +idle +init_module 105 +inotify_add_watch 27 +inotify_init +inotify_init1 26 +inotify_rm_watch 28 +io_cancel 3 +io_destroy 1 +io_getevents 4 +io_pgetevents 292 +io_pgetevents_time64 +io_setup 0 +io_submit 2 +io_uring_enter 426 +io_uring_register 427 +io_uring_setup 425 +ioctl 29 +ioperm +iopl +ioprio_get 31 +ioprio_set 30 +ipc +kcmp 272 +kern_features +kexec_file_load 294 +kexec_load 104 +keyctl 219 +kill 129 +lchown +lchown32 +lgetxattr 9 +link +linkat 37 +listen 201 +listxattr 11 +llistxattr 12 +lookup_dcookie 18 +lremovexattr 15 +lseek 62 +lsetxattr 6 +lstat +lstat64 +madvise 233 +mbind 235 +membarrier 283 +memfd_create 279 +memory_ordering +migrate_pages 238 +mincore 232 +mkdir +mkdirat 34 +mknod +mknodat 33 +mlock 228 +mlock2 284 +mlockall 230 +mmap 222 +mmap2 +modify_ldt +mount 40 +mount_setattr 442 +move_mount 429 +move_pages 239 +mprotect 226 +mq_getsetattr 185 +mq_notify 184 +mq_open 180 +mq_timedreceive 183 +mq_timedreceive_time64 +mq_timedsend 182 +mq_timedsend_time64 +mq_unlink 181 +mremap 216 +msgctl 187 +msgget 186 +msgrcv 188 +msgsnd 189 +msync 227 +multiplexer +munlock 229 +munlockall 231 +munmap 215 +name_to_handle_at 264 +nanosleep 101 +newfstatat 79 +nfsservctl 42 +nice +old_adjtimex +old_getpagesize +oldfstat +oldlstat +oldolduname +oldstat +oldumount +olduname +open +open_by_handle_at 265 +open_tree 428 +openat 56 +openat2 437 +or1k_atomic +osf_adjtime +osf_afs_syscall +osf_alt_plock +osf_alt_setsid +osf_alt_sigpending +osf_asynch_daemon +osf_audcntl +osf_audgen +osf_chflags +osf_execve +osf_exportfs +osf_fchflags +osf_fdatasync +osf_fpathconf +osf_fstat +osf_fstatfs +osf_fstatfs64 +osf_fuser +osf_getaddressconf +osf_getdirentries +osf_getdomainname +osf_getfh +osf_getfsstat +osf_gethostid +osf_getitimer +osf_getlogin +osf_getmnt +osf_getrusage +osf_getsysinfo +osf_gettimeofday +osf_kloadcall +osf_kmodcall +osf_lstat +osf_memcntl +osf_mincore +osf_mount +osf_mremap +osf_msfs_syscall +osf_msleep +osf_mvalid +osf_mwakeup +osf_naccept +osf_nfssvc +osf_ngetpeername +osf_ngetsockname +osf_nrecvfrom +osf_nrecvmsg +osf_nsendmsg +osf_ntp_adjtime +osf_ntp_gettime +osf_old_creat +osf_old_fstat +osf_old_getpgrp +osf_old_killpg +osf_old_lstat +osf_old_open +osf_old_sigaction +osf_old_sigblock +osf_old_sigreturn +osf_old_sigsetmask +osf_old_sigvec +osf_old_stat +osf_old_vadvise +osf_old_vtrace +osf_old_wait +osf_oldquota +osf_pathconf +osf_pid_block +osf_pid_unblock +osf_plock +osf_priocntlset +osf_profil +osf_proplist_syscall +osf_reboot +osf_revoke +osf_sbrk +osf_security +osf_select +osf_set_program_attributes +osf_set_speculative +osf_sethostid +osf_setitimer +osf_setlogin +osf_setsysinfo +osf_settimeofday +osf_shmat +osf_signal +osf_sigprocmask +osf_sigsendset +osf_sigstack +osf_sigwaitprim +osf_sstk +osf_stat +osf_statfs +osf_statfs64 +osf_subsys_info +osf_swapctl +osf_swapon +osf_syscall +osf_sysinfo +osf_table +osf_uadmin +osf_usleep_thread +osf_uswitch +osf_utc_adjtime +osf_utc_gettime +osf_utimes +osf_utsname +osf_wait4 +osf_waitid +pause +pciconfig_iobase +pciconfig_read +pciconfig_write +perf_event_open 241 +perfctr +perfmonctl +personality 92 +pidfd_getfd 438 +pidfd_open 434 +pidfd_send_signal 424 +pipe +pipe2 59 +pivot_root 41 +pkey_alloc 289 +pkey_free 290 +pkey_mprotect 288 +poll +ppoll 73 +ppoll_time64 +prctl 167 +pread64 67 +preadv 69 +preadv2 286 +prlimit64 261 +process_madvise 440 +process_vm_readv 270 +process_vm_writev 271 +pselect6 72 +pselect6_time64 +ptrace 117 +pwrite64 68 +pwritev 70 +pwritev2 287 +query_module +quotactl 60 +read 63 +readahead 213 +readdir +readlink +readlinkat 78 +readv 65 +reboot 142 +recv +recvfrom 207 +recvmmsg 243 +recvmmsg_time64 +recvmsg 212 +remap_file_pages 234 +removexattr 14 +rename +renameat +renameat2 276 +request_key 218 +restart_syscall 128 +riscv_flush_icache 259 +rmdir +rseq 293 +rt_sigaction 134 +rt_sigpending 136 +rt_sigprocmask 135 +rt_sigqueueinfo 138 +rt_sigreturn 139 +rt_sigsuspend 133 +rt_sigtimedwait 137 +rt_sigtimedwait_time64 +rt_tgsigqueueinfo 240 +rtas +s390_guarded_storage +s390_pci_mmio_read +s390_pci_mmio_write +s390_runtime_instr +s390_sthyi +sched_get_affinity +sched_get_priority_max 125 +sched_get_priority_min 126 +sched_getaffinity 123 +sched_getattr 275 +sched_getparam 121 +sched_getscheduler 120 +sched_rr_get_interval 127 +sched_rr_get_interval_time64 +sched_set_affinity +sched_setaffinity 122 +sched_setattr 274 +sched_setparam 118 +sched_setscheduler 119 +sched_yield 124 +seccomp 277 +select +semctl 191 +semget 190 +semop 193 +semtimedop 192 +semtimedop_time64 +send +sendfile 71 +sendfile64 +sendmmsg 269 +sendmsg 211 +sendto 206 +set_mempolicy 237 +set_robust_list 99 +set_thread_area +set_tid_address 96 +setdomainname 162 +setfsgid 152 +setfsgid32 +setfsuid 151 +setfsuid32 +setgid 144 +setgid32 +setgroups 159 +setgroups32 +sethae +sethostname 161 +setitimer 103 +setns 268 +setpgid 154 +setpgrp +setpriority 140 +setregid 143 +setregid32 +setresgid 149 +setresgid32 +setresuid 147 +setresuid32 +setreuid 145 +setreuid32 +setrlimit 164 +setsid 157 +setsockopt 208 +settimeofday 170 +setuid 146 +setuid32 +setxattr 5 +sgetmask +shmat 196 +shmctl 195 +shmdt 197 +shmget 194 +shutdown 210 +sigaction +sigaltstack 132 +signal +signalfd +signalfd4 74 +sigpending +sigprocmask +sigreturn +sigsuspend +socket 198 +socketcall +socketpair 199 +splice 76 +spu_create +spu_run +ssetmask +stat +stat64 +statfs 43 +statfs64 +statx 291 +stime +subpage_prot +swapcontext +swapoff 225 +swapon 224 +switch_endian +symlink +symlinkat 36 +sync 81 +sync_file_range 84 +sync_file_range2 +syncfs 267 +sys_debug_setcontext +syscall +sysfs +sysinfo 179 +syslog 116 +sysmips +tee 77 +tgkill 131 +time +timer_create 107 +timer_delete 111 +timer_getoverrun 109 +timer_gettime 108 +timer_gettime64 +timer_settime 110 +timer_settime64 +timerfd +timerfd_create 85 +timerfd_gettime 87 +timerfd_gettime64 +timerfd_settime 86 +timerfd_settime64 +times 153 +tkill 130 +truncate 45 +truncate64 +ugetrlimit +umask 166 +umount +umount2 39 +uname 160 +unlink +unlinkat 35 +unshare 97 +uselib +userfaultfd 282 +ustat +utime +utimensat 88 +utimensat_time64 +utimes +utrap_install +vfork +vhangup 58 +vm86 +vm86old +vmsplice 75 +wait4 260 +waitid 95 +waitpid +write 64 +writev 66 From 9899580a586522330bdb657bf228402638b6dbc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 28 Apr 2021 10:46:48 +0200 Subject: [PATCH 3/5] basic/missing-syscall: sort syscalls alphabetically and add numbers for mount_setattr, move_mount, open_tree --- src/basic/missing_syscall_def.h | 290 +++++++++++++++++++++++++------- src/basic/missing_syscalls.py | 6 +- 2 files changed, 237 insertions(+), 59 deletions(-) diff --git a/src/basic/missing_syscall_def.h b/src/basic/missing_syscall_def.h index de2528216e..f36c55abc3 100644 --- a/src/basic/missing_syscall_def.h +++ b/src/basic/missing_syscall_def.h @@ -204,6 +204,64 @@ assert_cc(__NR_copy_file_range == systemd_NR_copy_file_range); # endif #endif +#ifndef __IGNORE_epoll_pwait2 +# if defined(__aarch64__) +# define systemd_NR_epoll_pwait2 441 +# elif defined(__alpha__) +# define systemd_NR_epoll_pwait2 551 +# elif defined(__arc__) || defined(__tilegx__) +# define systemd_NR_epoll_pwait2 441 +# elif defined(__arm__) +# define systemd_NR_epoll_pwait2 441 +# elif defined(__i386__) +# define systemd_NR_epoll_pwait2 441 +# elif defined(__ia64__) +# define systemd_NR_epoll_pwait2 1465 +# elif defined(__m68k__) +# define systemd_NR_epoll_pwait2 441 +# elif defined(_MIPS_SIM) +# if _MIPS_SIM == _MIPS_SIM_ABI32 +# define systemd_NR_epoll_pwait2 4441 +# elif _MIPS_SIM == _MIPS_SIM_NABI32 +# define systemd_NR_epoll_pwait2 6441 +# elif _MIPS_SIM == _MIPS_SIM_ABI64 +# define systemd_NR_epoll_pwait2 5441 +# else +# error "Unknown MIPS ABI" +# endif +# elif defined(__powerpc__) +# define systemd_NR_epoll_pwait2 441 +# elif defined(__riscv) && defined(__LP64__) +# define systemd_NR_epoll_pwait2 441 +# elif defined(__s390__) +# define systemd_NR_epoll_pwait2 441 +# elif defined(__sparc__) +# define systemd_NR_epoll_pwait2 441 +# elif defined(__x86_64__) +# if defined(__ILP32__) +# define systemd_NR_epoll_pwait2 (441 | /* __X32_SYSCALL_BIT */ 0x40000000) +# else +# define systemd_NR_epoll_pwait2 441 +# endif +# elif !defined(missing_arch_template) +# warning "epoll_pwait2() syscall number is unknown for your architecture" +# endif + +/* may be an (invalid) negative number due to libseccomp, see PR 13319 */ +# if defined __NR_epoll_pwait2 && __NR_epoll_pwait2 >= 0 +# if defined systemd_NR_epoll_pwait2 +assert_cc(__NR_epoll_pwait2 == systemd_NR_epoll_pwait2); +# endif +# else +# if defined __NR_epoll_pwait2 +# undef __NR_epoll_pwait2 +# endif +# if defined systemd_NR_epoll_pwait2 && systemd_NR_epoll_pwait2 >= 0 +# define __NR_epoll_pwait2 systemd_NR_epoll_pwait2 +# endif +# endif +#endif + #ifndef __IGNORE_getrandom # if defined(__aarch64__) # define systemd_NR_getrandom 278 @@ -320,6 +378,122 @@ assert_cc(__NR_memfd_create == systemd_NR_memfd_create); # endif #endif +#ifndef __IGNORE_mount_setattr +# if defined(__aarch64__) +# define systemd_NR_mount_setattr 442 +# elif defined(__alpha__) +# define systemd_NR_mount_setattr 552 +# elif defined(__arc__) || defined(__tilegx__) +# define systemd_NR_mount_setattr 442 +# elif defined(__arm__) +# define systemd_NR_mount_setattr 442 +# elif defined(__i386__) +# define systemd_NR_mount_setattr 442 +# elif defined(__ia64__) +# define systemd_NR_mount_setattr 1466 +# elif defined(__m68k__) +# define systemd_NR_mount_setattr 442 +# elif defined(_MIPS_SIM) +# if _MIPS_SIM == _MIPS_SIM_ABI32 +# define systemd_NR_mount_setattr 4442 +# elif _MIPS_SIM == _MIPS_SIM_NABI32 +# define systemd_NR_mount_setattr 6442 +# elif _MIPS_SIM == _MIPS_SIM_ABI64 +# define systemd_NR_mount_setattr 5442 +# else +# error "Unknown MIPS ABI" +# endif +# elif defined(__powerpc__) +# define systemd_NR_mount_setattr 442 +# elif defined(__riscv) && defined(__LP64__) +# define systemd_NR_mount_setattr 442 +# elif defined(__s390__) +# define systemd_NR_mount_setattr 442 +# elif defined(__sparc__) +# define systemd_NR_mount_setattr 442 +# elif defined(__x86_64__) +# if defined(__ILP32__) +# define systemd_NR_mount_setattr (442 | /* __X32_SYSCALL_BIT */ 0x40000000) +# else +# define systemd_NR_mount_setattr 442 +# endif +# elif !defined(missing_arch_template) +# warning "mount_setattr() syscall number is unknown for your architecture" +# endif + +/* may be an (invalid) negative number due to libseccomp, see PR 13319 */ +# if defined __NR_mount_setattr && __NR_mount_setattr >= 0 +# if defined systemd_NR_mount_setattr +assert_cc(__NR_mount_setattr == systemd_NR_mount_setattr); +# endif +# else +# if defined __NR_mount_setattr +# undef __NR_mount_setattr +# endif +# if defined systemd_NR_mount_setattr && systemd_NR_mount_setattr >= 0 +# define __NR_mount_setattr systemd_NR_mount_setattr +# endif +# endif +#endif + +#ifndef __IGNORE_move_mount +# if defined(__aarch64__) +# define systemd_NR_move_mount 429 +# elif defined(__alpha__) +# define systemd_NR_move_mount 539 +# elif defined(__arc__) || defined(__tilegx__) +# define systemd_NR_move_mount 429 +# elif defined(__arm__) +# define systemd_NR_move_mount 429 +# elif defined(__i386__) +# define systemd_NR_move_mount 429 +# elif defined(__ia64__) +# define systemd_NR_move_mount 1453 +# elif defined(__m68k__) +# define systemd_NR_move_mount 429 +# elif defined(_MIPS_SIM) +# if _MIPS_SIM == _MIPS_SIM_ABI32 +# define systemd_NR_move_mount 4429 +# elif _MIPS_SIM == _MIPS_SIM_NABI32 +# define systemd_NR_move_mount 6429 +# elif _MIPS_SIM == _MIPS_SIM_ABI64 +# define systemd_NR_move_mount 5429 +# else +# error "Unknown MIPS ABI" +# endif +# elif defined(__powerpc__) +# define systemd_NR_move_mount 429 +# elif defined(__riscv) && defined(__LP64__) +# define systemd_NR_move_mount 429 +# elif defined(__s390__) +# define systemd_NR_move_mount 429 +# elif defined(__sparc__) +# define systemd_NR_move_mount 429 +# elif defined(__x86_64__) +# if defined(__ILP32__) +# define systemd_NR_move_mount (429 | /* __X32_SYSCALL_BIT */ 0x40000000) +# else +# define systemd_NR_move_mount 429 +# endif +# elif !defined(missing_arch_template) +# warning "move_mount() syscall number is unknown for your architecture" +# endif + +/* may be an (invalid) negative number due to libseccomp, see PR 13319 */ +# if defined __NR_move_mount && __NR_move_mount >= 0 +# if defined systemd_NR_move_mount +assert_cc(__NR_move_mount == systemd_NR_move_mount); +# endif +# else +# if defined __NR_move_mount +# undef __NR_move_mount +# endif +# if defined systemd_NR_move_mount && systemd_NR_move_mount >= 0 +# define __NR_move_mount systemd_NR_move_mount +# endif +# endif +#endif + #ifndef __IGNORE_name_to_handle_at # if defined(__aarch64__) # define systemd_NR_name_to_handle_at 264 @@ -378,6 +552,64 @@ assert_cc(__NR_name_to_handle_at == systemd_NR_name_to_handle_at); # endif #endif +#ifndef __IGNORE_open_tree +# if defined(__aarch64__) +# define systemd_NR_open_tree 428 +# elif defined(__alpha__) +# define systemd_NR_open_tree 538 +# elif defined(__arc__) || defined(__tilegx__) +# define systemd_NR_open_tree 428 +# elif defined(__arm__) +# define systemd_NR_open_tree 428 +# elif defined(__i386__) +# define systemd_NR_open_tree 428 +# elif defined(__ia64__) +# define systemd_NR_open_tree 1452 +# elif defined(__m68k__) +# define systemd_NR_open_tree 428 +# elif defined(_MIPS_SIM) +# if _MIPS_SIM == _MIPS_SIM_ABI32 +# define systemd_NR_open_tree 4428 +# elif _MIPS_SIM == _MIPS_SIM_NABI32 +# define systemd_NR_open_tree 6428 +# elif _MIPS_SIM == _MIPS_SIM_ABI64 +# define systemd_NR_open_tree 5428 +# else +# error "Unknown MIPS ABI" +# endif +# elif defined(__powerpc__) +# define systemd_NR_open_tree 428 +# elif defined(__riscv) && defined(__LP64__) +# define systemd_NR_open_tree 428 +# elif defined(__s390__) +# define systemd_NR_open_tree 428 +# elif defined(__sparc__) +# define systemd_NR_open_tree 428 +# elif defined(__x86_64__) +# if defined(__ILP32__) +# define systemd_NR_open_tree (428 | /* __X32_SYSCALL_BIT */ 0x40000000) +# else +# define systemd_NR_open_tree 428 +# endif +# elif !defined(missing_arch_template) +# warning "open_tree() syscall number is unknown for your architecture" +# endif + +/* may be an (invalid) negative number due to libseccomp, see PR 13319 */ +# if defined __NR_open_tree && __NR_open_tree >= 0 +# if defined systemd_NR_open_tree +assert_cc(__NR_open_tree == systemd_NR_open_tree); +# endif +# else +# if defined __NR_open_tree +# undef __NR_open_tree +# endif +# if defined systemd_NR_open_tree && systemd_NR_open_tree >= 0 +# define __NR_open_tree systemd_NR_open_tree +# endif +# endif +#endif + #ifndef __IGNORE_pidfd_open # if defined(__aarch64__) # define systemd_NR_pidfd_open 434 @@ -725,61 +957,3 @@ assert_cc(__NR_statx == systemd_NR_statx); # endif # endif #endif - -#ifndef __IGNORE_epoll_pwait2 -# if defined(__aarch64__) -# define systemd_NR_epoll_pwait2 441 -# elif defined(__alpha__) -# define systemd_NR_epoll_pwait2 551 -# elif defined(__arc__) || defined(__tilegx__) -# define systemd_NR_epoll_pwait2 441 -# elif defined(__arm__) -# define systemd_NR_epoll_pwait2 441 -# elif defined(__i386__) -# define systemd_NR_epoll_pwait2 441 -# elif defined(__ia64__) -# define systemd_NR_epoll_pwait2 1465 -# elif defined(__m68k__) -# define systemd_NR_epoll_pwait2 441 -# elif defined(_MIPS_SIM) -# if _MIPS_SIM == _MIPS_SIM_ABI32 -# define systemd_NR_epoll_pwait2 4441 -# elif _MIPS_SIM == _MIPS_SIM_NABI32 -# define systemd_NR_epoll_pwait2 6441 -# elif _MIPS_SIM == _MIPS_SIM_ABI64 -# define systemd_NR_epoll_pwait2 5441 -# else -# error "Unknown MIPS ABI" -# endif -# elif defined(__powerpc__) -# define systemd_NR_epoll_pwait2 441 -# elif defined(__riscv) && defined(__LP64__) -# define systemd_NR_epoll_pwait2 441 -# elif defined(__s390__) -# define systemd_NR_epoll_pwait2 441 -# elif defined(__sparc__) -# define systemd_NR_epoll_pwait2 441 -# elif defined(__x86_64__) -# if defined(__ILP32__) -# define systemd_NR_epoll_pwait2 (441 | /* __X32_SYSCALL_BIT */ 0x40000000) -# else -# define systemd_NR_epoll_pwait2 441 -# endif -# elif !defined(missing_arch_template) -# warning "epoll_pwait2() syscall number is unknown for your architecture" -# endif - -/* may be an (invalid) negative number due to libseccomp, see PR 13319 */ -# if defined __NR_epoll_pwait2 && __NR_epoll_pwait2 >= 0 -# if defined systemd_NR_epoll_pwait2 -assert_cc(__NR_epoll_pwait2 == systemd_NR_epoll_pwait2); -# endif -# else -# if defined __NR_epoll_pwait2 -# undef __NR_epoll_pwait2 -# endif -# if defined systemd_NR_epoll_pwait2 && systemd_NR_epoll_pwait2 >= 0 -# define __NR_epoll_pwait2 systemd_NR_epoll_pwait2 -# endif -# endif -#endif diff --git a/src/basic/missing_syscalls.py b/src/basic/missing_syscalls.py index adfe53d025..0234e6fc44 100644 --- a/src/basic/missing_syscalls.py +++ b/src/basic/missing_syscalls.py @@ -9,16 +9,20 @@ SYSCALLS = [ 'bpf', 'close_range', 'copy_file_range', + 'epoll_pwait2', 'getrandom', 'memfd_create', + 'mount_setattr', + 'move_mount', 'name_to_handle_at', + 'open_tree', 'pidfd_open', 'pidfd_send_signal', 'pkey_mprotect', 'renameat2', 'setns', 'statx', - 'epoll_pwait2'] +] def dictify(f): def wrap(*args, **kwargs): From 84e8edec308dd157a013c811c3fa351fc0340f63 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 27 Apr 2021 14:16:06 +0200 Subject: [PATCH 4/5] missing: add syscall wrappers for new mount API --- meson.build | 6 +++ src/basic/missing_syscall.h | 95 +++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) diff --git a/meson.build b/meson.build index 93d3c26a22..f30b7eef79 100644 --- a/meson.build +++ b/meson.build @@ -480,11 +480,14 @@ conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include +#include #include +#include ''' foreach decl : ['char16_t', 'char32_t', + 'struct mount_attr', 'struct statx', ] @@ -555,6 +558,9 @@ foreach ident : [ ['execveat', '''#include '''], ['close_range', '''#include '''], ['epoll_pwait2', '''#include '''], + ['mount_setattr', '''#include '''], + ['move_mount', '''#include '''], + ['open_tree', '''#include '''], ] have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE') diff --git a/src/basic/missing_syscall.h b/src/basic/missing_syscall.h index 1384324804..9e3a165857 100644 --- a/src/basic/missing_syscall.h +++ b/src/basic/missing_syscall.h @@ -425,3 +425,98 @@ static inline int missing_epoll_pwait2( # define epoll_pwait2 missing_epoll_pwait2 #endif + +/* ======================================================================= */ + +#if !HAVE_MOUNT_SETATTR + +#if !HAVE_STRUCT_MOUNT_ATTR +struct mount_attr { + uint64_t attr_set; + uint64_t attr_clr; + uint64_t propagation; + uint64_t userns_fd; +}; +#else +struct mount_attr; +#endif + +#ifndef MOUNT_ATTR_IDMAP +#define MOUNT_ATTR_IDMAP 0x00100000 +#endif + +#ifndef AT_RECURSIVE +#define AT_RECURSIVE 0x8000 +#endif + +static inline int missing_mount_setattr( + int dfd, + const char *path, + unsigned flags, + struct mount_attr *attr, + size_t size) { + +# if defined __NR_mount_setattr && __NR_mount_setattr >= 0 + return syscall(__NR_mount_setattr, dfd, path, flags, attr, size); +# else + errno = ENOSYS; + return -1; +# endif +} + +# define mount_setattr missing_mount_setattr +#endif + +/* ======================================================================= */ + +#if !HAVE_OPEN_TREE + +#ifndef OPEN_TREE_CLONE +#define OPEN_TREE_CLONE 1 +#endif + +#ifndef OPEN_TREE_CLOEXEC +#define OPEN_TREE_CLOEXEC O_CLOEXEC +#endif + +static inline int missing_open_tree( + int dfd, + const char *filename, + unsigned flags) { + +# if defined __NR_open_tree && __NR_open_tree >= 0 + return syscall(__NR_open_tree, dfd, filename, flags); +# else + errno = ENOSYS; + return -1; +# endif +} + +# define open_tree missing_open_tree +#endif + +/* ======================================================================= */ + +#if !HAVE_MOVE_MOUNT + +#ifndef MOVE_MOUNT_F_EMPTY_PATH +#define MOVE_MOUNT_F_EMPTY_PATH 0x00000004 /* Empty from path permitted */ +#endif + +static inline int missing_move_mount( + int from_dfd, + const char *from_pathname, + int to_dfd, + const char *to_pathname, + unsigned flags) { + +# if defined __NR_move_mount && __NR_move_mount >= 0 + return syscall(__NR_move_mount, from_dfd, from_pathname, to_dfd, to_pathname, flags); +# else + errno = ENOSYS; + return -1; +# endif +} + +# define move_mount missing_move_mount +#endif From e7702c20aa9d58efa03ea4a0baad65b01da7f3e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 28 Apr 2021 15:35:44 +0200 Subject: [PATCH 5/5] basic/missing-syscall: add regen instructions --- src/basic/missing_syscall_def.h | 6 +++++- src/basic/missing_syscalls.py | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/basic/missing_syscall_def.h b/src/basic/missing_syscall_def.h index f36c55abc3..84b79ecc09 100644 --- a/src/basic/missing_syscall_def.h +++ b/src/basic/missing_syscall_def.h @@ -1,5 +1,9 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later - * This file is generated. Do not edit! */ + * This file is generated by src/basic/missing_syscalls.py. Do not edit! + * + * Use 'ninja -C build update-syscall-tables' to download new syscall tables, + * and 'ninja -C build update-syscall-header' to regenerate this file. + */ /* Note: if this code looks strange, this is because it is derived from the same * template as the per-syscall blocks below. */ diff --git a/src/basic/missing_syscalls.py b/src/basic/missing_syscalls.py index 0234e6fc44..d3c68dc067 100644 --- a/src/basic/missing_syscalls.py +++ b/src/basic/missing_syscalls.py @@ -128,7 +128,11 @@ def print_syscall_def(syscall, tables, out): def print_syscall_defs(syscalls, tables, out): print('''\ /* SPDX-License-Identifier: LGPL-2.1-or-later - * This file is generated. Do not edit! */ + * This file is generated by src/basic/missing_syscalls.py. Do not edit! + * + * Use 'ninja -C build update-syscall-tables' to download new syscall tables, + * and 'ninja -C build update-syscall-header' to regenerate this file. + */ ''', file=out) print(ARCH_CHECK, file=out)