diff --git a/.github/workflows/ci-x86.yml b/.github/workflows/ci-x86.yml index 48a98bc5c20..4d8e385e713 100644 --- a/.github/workflows/ci-x86.yml +++ b/.github/workflows/ci-x86.yml @@ -55,8 +55,7 @@ defaults: jobs: # 32-bit Linux build with gcc and run tests: x86-32: - # TODO i#4953: Upgrade to ubuntu-20.04, same as other CI jobs. - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 # When checking out the repository that triggered a workflow, actions/checkout@v2 # defaults to the reference or SHA for that event. See documentation for ref at diff --git a/core/unix/include/syscall_linux_x86.h b/core/unix/include/syscall_linux_x86.h index 6d601f29355..b928d6ed4d1 100644 --- a/core/unix/include/syscall_linux_x86.h +++ b/core/unix/include/syscall_linux_x86.h @@ -20,7 +20,9 @@ #ifdef X64 -/* From FC 27's /usr/include/asm/unistd_64.h */ +/* From Debian GLIBC 2.31-13 on kernel 5.10.46 + * /usr/include/{x86_64-linux-gnu,i386-linux-gnu}/asm/unistd_64.h + */ # define __NR_read 0 # define __NR_write 1 # define __NR_open 2 @@ -356,10 +358,29 @@ # define __NR_statx 332 # define __NR_io_pgetevents 333 # define __NR_rseq 334 +# define __NR_pidfd_send_signal 424 +# define __NR_io_uring_setup 425 +# define __NR_io_uring_enter 426 +# define __NR_io_uring_register 427 +# define __NR_open_tree 428 +# define __NR_move_mount 429 +# define __NR_fsopen 430 +# define __NR_fsconfig 431 +# define __NR_fsmount 432 +# define __NR_fspick 433 +# define __NR_pidfd_open 434 +# define __NR_clone3 435 +# define __NR_close_range 436 +# define __NR_openat2 437 +# define __NR_pidfd_getfd 438 +# define __NR_faccessat2 439 +# define __NR_process_madvise 440 #else -/* From FC 27's /usr/include/asm/unistd_32.h */ +/* From Debian GLIBC 2.31-13 on kernel 5.10.46 + * /usr/include/{x86_64-linux-gnu,i386-linux-gnu}/asm/unistd_32.h + */ # define __NR_restart_syscall 0 # define __NR_exit 1 # define __NR_fork 2 @@ -743,10 +764,58 @@ # define __NR_arch_prctl 384 # define __NR_io_pgetevents 385 # define __NR_rseq 386 -#endif - -/* From FC 27's /usr/include/bits/syscall.h */ -/* The system call list corresponds to kernel 4.12. */ +# define __NR_semget 393 +# define __NR_semctl 394 +# define __NR_shmget 395 +# define __NR_shmctl 396 +# define __NR_shmat 397 +# define __NR_shmdt 398 +# define __NR_msgget 399 +# define __NR_msgsnd 400 +# define __NR_msgrcv 401 +# define __NR_msgctl 402 +# define __NR_clock_gettime64 403 +# define __NR_clock_settime64 404 +# define __NR_clock_adjtime64 405 +# define __NR_clock_getres_time64 406 +# define __NR_clock_nanosleep_time64 407 +# define __NR_timer_gettime64 408 +# define __NR_timer_settime64 409 +# define __NR_timerfd_gettime64 410 +# define __NR_timerfd_settime64 411 +# define __NR_utimensat_time64 412 +# define __NR_pselect6_time64 413 +# define __NR_ppoll_time64 414 +# define __NR_io_pgetevents_time64 416 +# define __NR_recvmmsg_time64 417 +# define __NR_mq_timedsend_time64 418 +# define __NR_mq_timedreceive_time64 419 +# define __NR_semtimedop_time64 420 +# define __NR_rt_sigtimedwait_time64 421 +# define __NR_futex_time64 422 +# define __NR_sched_rr_get_interval_time64 423 +# define __NR_pidfd_send_signal 424 +# define __NR_io_uring_setup 425 +# define __NR_io_uring_enter 426 +# define __NR_io_uring_register 427 +# define __NR_open_tree 428 +# define __NR_move_mount 429 +# define __NR_fsopen 430 +# define __NR_fsconfig 431 +# define __NR_fsmount 432 +# define __NR_fspick 433 +# define __NR_pidfd_open 434 +# define __NR_clone3 435 +# define __NR_close_range 436 +# define __NR_openat2 437 +# define __NR_pidfd_getfd 438 +# define __NR_faccessat2 439 +# define __NR_process_madvise 440 +#endif + +/* From Debian GLIBC 2.31-13 on kernel 5.10.46 + * /usr/include/x86_64-linux-gnu/bits/syscall.h + */ #ifdef __NR_FAST_atomic_update # define SYS_FAST_atomic_update __NR_FAST_atomic_update @@ -856,6 +925,10 @@ # define SYS_break __NR_break #endif +#ifdef __NR_breakpoint +# define SYS_breakpoint __NR_breakpoint +#endif + #ifdef __NR_brk # define SYS_brk __NR_brk #endif @@ -900,22 +973,42 @@ # define SYS_clock_adjtime __NR_clock_adjtime #endif +#ifdef __NR_clock_adjtime64 +# define SYS_clock_adjtime64 __NR_clock_adjtime64 +#endif + #ifdef __NR_clock_getres # define SYS_clock_getres __NR_clock_getres #endif +#ifdef __NR_clock_getres_time64 +# define SYS_clock_getres_time64 __NR_clock_getres_time64 +#endif + #ifdef __NR_clock_gettime # define SYS_clock_gettime __NR_clock_gettime #endif +#ifdef __NR_clock_gettime64 +# define SYS_clock_gettime64 __NR_clock_gettime64 +#endif + #ifdef __NR_clock_nanosleep # define SYS_clock_nanosleep __NR_clock_nanosleep #endif +#ifdef __NR_clock_nanosleep_time64 +# define SYS_clock_nanosleep_time64 __NR_clock_nanosleep_time64 +#endif + #ifdef __NR_clock_settime # define SYS_clock_settime __NR_clock_settime #endif +#ifdef __NR_clock_settime64 +# define SYS_clock_settime64 __NR_clock_settime64 +#endif + #ifdef __NR_clone # define SYS_clone __NR_clone #endif @@ -924,6 +1017,10 @@ # define SYS_clone2 __NR_clone2 #endif +#ifdef __NR_clone3 +# define SYS_clone3 __NR_clone3 +#endif + #ifdef __NR_close # define SYS_close __NR_close #endif @@ -1108,6 +1205,10 @@ # define SYS_fork __NR_fork #endif +#ifdef __NR_fp_udfiex_crtl +# define SYS_fp_udfiex_crtl __NR_fp_udfiex_crtl +#endif + #ifdef __NR_free_hugepages # define SYS_free_hugepages __NR_free_hugepages #endif @@ -1116,10 +1217,26 @@ # define SYS_fremovexattr __NR_fremovexattr #endif +#ifdef __NR_fsconfig +# define SYS_fsconfig __NR_fsconfig +#endif + #ifdef __NR_fsetxattr # define SYS_fsetxattr __NR_fsetxattr #endif +#ifdef __NR_fsmount +# define SYS_fsmount __NR_fsmount +#endif + +#ifdef __NR_fsopen +# define SYS_fsopen __NR_fsopen +#endif + +#ifdef __NR_fspick +# define SYS_fspick __NR_fspick +#endif + #ifdef __NR_fstat # define SYS_fstat __NR_fstat #endif @@ -1160,6 +1277,10 @@ # define SYS_futex __NR_futex #endif +#ifdef __NR_futex_time64 +# define SYS_futex_time64 __NR_futex_time64 +#endif + #ifdef __NR_futimesat # define SYS_futimesat __NR_futimesat #endif @@ -1180,6 +1301,10 @@ # define SYS_get_thread_area __NR_get_thread_area #endif +#ifdef __NR_get_tls +# define SYS_get_tls __NR_get_tls +#endif + #ifdef __NR_getcpu # define SYS_getcpu __NR_getcpu #endif @@ -1392,6 +1517,14 @@ # define SYS_io_getevents __NR_io_getevents #endif +#ifdef __NR_io_pgetevents +# define SYS_io_pgetevents __NR_io_pgetevents +#endif + +#ifdef __NR_io_pgetevents_time64 +# define SYS_io_pgetevents_time64 __NR_io_pgetevents_time64 +#endif + #ifdef __NR_io_setup # define SYS_io_setup __NR_io_setup #endif @@ -1400,6 +1533,18 @@ # define SYS_io_submit __NR_io_submit #endif +#ifdef __NR_io_uring_enter +# define SYS_io_uring_enter __NR_io_uring_enter +#endif + +#ifdef __NR_io_uring_register +# define SYS_io_uring_register __NR_io_uring_register +#endif + +#ifdef __NR_io_uring_setup +# define SYS_io_uring_setup __NR_io_uring_setup +#endif + #ifdef __NR_ioctl # define SYS_ioctl __NR_ioctl #endif @@ -1584,6 +1729,10 @@ # define SYS_mount __NR_mount #endif +#ifdef __NR_move_mount +# define SYS_move_mount __NR_move_mount +#endif + #ifdef __NR_move_pages # define SYS_move_pages __NR_move_pages #endif @@ -1612,10 +1761,18 @@ # define SYS_mq_timedreceive __NR_mq_timedreceive #endif +#ifdef __NR_mq_timedreceive_time64 +# define SYS_mq_timedreceive_time64 __NR_mq_timedreceive_time64 +#endif + #ifdef __NR_mq_timedsend # define SYS_mq_timedsend __NR_mq_timedsend #endif +#ifdef __NR_mq_timedsend_time64 +# define SYS_mq_timedsend_time64 __NR_mq_timedsend_time64 +#endif + #ifdef __NR_mq_unlink # define SYS_mq_unlink __NR_mq_unlink #endif @@ -1688,6 +1845,10 @@ # define SYS_old_adjtimex __NR_old_adjtimex #endif +#ifdef __NR_old_getpagesize +# define SYS_old_getpagesize __NR_old_getpagesize +#endif + #ifdef __NR_oldfstat # define SYS_oldfstat __NR_oldfstat #endif @@ -1720,6 +1881,10 @@ # define SYS_open_by_handle_at __NR_open_by_handle_at #endif +#ifdef __NR_open_tree +# define SYS_open_tree __NR_open_tree +#endif + #ifdef __NR_openat # define SYS_openat __NR_openat #endif @@ -2196,6 +2361,14 @@ # define SYS_personality __NR_personality #endif +#ifdef __NR_pidfd_open +# define SYS_pidfd_open __NR_pidfd_open +#endif + +#ifdef __NR_pidfd_send_signal +# define SYS_pidfd_send_signal __NR_pidfd_send_signal +#endif + #ifdef __NR_pipe # define SYS_pipe __NR_pipe #endif @@ -2228,6 +2401,10 @@ # define SYS_ppoll __NR_ppoll #endif +#ifdef __NR_ppoll_time64 +# define SYS_ppoll_time64 __NR_ppoll_time64 +#endif + #ifdef __NR_prctl # define SYS_prctl __NR_prctl #endif @@ -2268,6 +2445,10 @@ # define SYS_pselect6 __NR_pselect6 #endif +#ifdef __NR_pselect6_time64 +# define SYS_pselect6_time64 __NR_pselect6_time64 +#endif + #ifdef __NR_ptrace # define SYS_ptrace __NR_ptrace #endif @@ -2336,6 +2517,10 @@ # define SYS_recvmmsg __NR_recvmmsg #endif +#ifdef __NR_recvmmsg_time64 +# define SYS_recvmmsg_time64 __NR_recvmmsg_time64 +#endif + #ifdef __NR_recvmsg # define SYS_recvmsg __NR_recvmsg #endif @@ -2368,10 +2553,18 @@ # define SYS_restart_syscall __NR_restart_syscall #endif +#ifdef __NR_riscv_flush_icache +# define SYS_riscv_flush_icache __NR_riscv_flush_icache +#endif + #ifdef __NR_rmdir # define SYS_rmdir __NR_rmdir #endif +#ifdef __NR_rseq +# define SYS_rseq __NR_rseq +#endif + #ifdef __NR_rt_sigaction # define SYS_rt_sigaction __NR_rt_sigaction #endif @@ -2396,6 +2589,10 @@ # define SYS_rt_sigsuspend __NR_rt_sigsuspend #endif +#ifdef __NR_rt_sigtimedwait_time64 +# define SYS_rt_sigtimedwait_time64 __NR_rt_sigtimedwait_time64 +#endif + #ifdef __NR_rt_sigtimedwait # define SYS_rt_sigtimedwait __NR_rt_sigtimedwait #endif @@ -2424,6 +2621,10 @@ # define SYS_s390_runtime_instr __NR_s390_runtime_instr #endif +#ifdef __NR_s390_sthyi +# define SYS_s390_sthyi __NR_s390_sthyi +#endif + #ifdef __NR_sched_get_affinity # define SYS_sched_get_affinity __NR_sched_get_affinity #endif @@ -2456,6 +2657,10 @@ # define SYS_sched_rr_get_interval __NR_sched_rr_get_interval #endif +#ifdef __NR_sched_rr_get_interval_time64 +# define SYS_sched_rr_get_interval_time64 __NR_sched_rr_get_interval_time64 +#endif + #ifdef __NR_sched_set_affinity # define SYS_sched_set_affinity __NR_sched_set_affinity #endif @@ -2508,6 +2713,10 @@ # define SYS_semtimedop __NR_semtimedop #endif +#ifdef __NR_semtimedop_time64 +# define SYS_semtimedop_time64 __NR_semtimedop_time64 +#endif + #ifdef __NR_send # define SYS_send __NR_send #endif @@ -2548,6 +2757,10 @@ # define SYS_set_tid_address __NR_set_tid_address #endif +#ifdef __NR_set_tls +# define SYS_set_tls __NR_set_tls +#endif + #ifdef __NR_setdomainname # define SYS_setdomainname __NR_setdomainname #endif @@ -2896,10 +3109,18 @@ # define SYS_timer_gettime __NR_timer_gettime #endif +#ifdef __NR_timer_gettime64 +# define SYS_timer_gettime64 __NR_timer_gettime64 +#endif + #ifdef __NR_timer_settime # define SYS_timer_settime __NR_timer_settime #endif +#ifdef __NR_timer_settime64 +# define SYS_timer_settime64 __NR_timer_settime64 +#endif + #ifdef __NR_timerfd # define SYS_timerfd __NR_timerfd #endif @@ -2912,10 +3133,18 @@ # define SYS_timerfd_gettime __NR_timerfd_gettime #endif +#ifdef __NR_timerfd_gettime64 +# define SYS_timerfd_gettime64 __NR_timerfd_gettime64 +#endif + #ifdef __NR_timerfd_settime # define SYS_timerfd_settime __NR_timerfd_settime #endif +#ifdef __NR_timerfd_settime64 +# define SYS_timerfd_settime64 __NR_timerfd_settime64 +#endif + #ifdef __NR_times # define SYS_times __NR_times #endif @@ -2936,6 +3165,10 @@ # define SYS_tuxcall __NR_tuxcall #endif +#ifdef __NR_udftrap +# define SYS_udftrap __NR_udftrap +#endif + #ifdef __NR_ugetrlimit # define SYS_ugetrlimit __NR_ugetrlimit #endif @@ -2980,6 +3213,14 @@ # define SYS_userfaultfd __NR_userfaultfd #endif +#ifdef __NR_usr26 +# define SYS_usr26 __NR_usr26 +#endif + +#ifdef __NR_usr32 +# define SYS_usr32 __NR_usr32 +#endif + #ifdef __NR_ustat # define SYS_ustat __NR_ustat #endif @@ -2992,6 +3233,10 @@ # define SYS_utimensat __NR_utimensat #endif +#ifdef __NR_utimensat_time64 +# define SYS_utimensat_time64 __NR_utimensat_time64 +#endif + #ifdef __NR_utimes # define SYS_utimes __NR_utimes #endif @@ -3044,8 +3289,4 @@ # define SYS_writev __NR_writev #endif -#ifdef __NR_rseq -# define SYS_rseq __NR_rseq -#endif - #endif /* _SYSCALL_LINUX_X86_H_ */ diff --git a/core/unix/os.c b/core/unix/os.c index 774c6a08707..48d42c18e32 100644 --- a/core/unix/os.c +++ b/core/unix/os.c @@ -4901,6 +4901,9 @@ ignorable_system_call_normalized(int num) #endif case SYS_execve: #ifdef LINUX +# ifdef SYS_clone3 + case SYS_clone3: +# endif case SYS_clone: #elif defined(MACOS) case SYS_bsdthread_create: @@ -4933,6 +4936,9 @@ ignorable_system_call_normalized(int num) case SYS_sigprocmask: #endif #ifdef LINUX +# ifdef SYS_rt_sigtimedwait_time64 + case SYS_rt_sigtimedwait_time64: +# endif case SYS_rt_sigreturn: case SYS_rt_sigaction: case SYS_rt_sigprocmask: @@ -4954,6 +4960,9 @@ ignorable_system_call_normalized(int num) case SYS_getitimer: #ifdef MACOS case SYS_close_nocancel: +#endif +#ifdef SYS_close_range + case SYS_close_range: #endif case SYS_close: #ifdef SYS_dup2 @@ -4997,8 +5006,14 @@ ignorable_system_call_normalized(int num) case SYS_cacheflush: #endif #if defined(LINUX) - /* syscalls change procsigmask */ +/* syscalls change procsigmask */ +# ifdef SYS_pselect6_time64 + case SYS_pselect6_time64: +# endif case SYS_pselect6: +# ifdef SYS_ppoll_time64 + case SYS_ppoll_time64: +# endif case SYS_ppoll: case SYS_epoll_pwait: /* Used as a lazy trigger. */ @@ -5019,6 +5034,9 @@ ignorable_system_call_normalized(int num) # endif case SYS_readlinkat: return !DYNAMO_OPTION(early_inject); #endif +#ifdef SYS_openat2 + case SYS_openat2: return IS_STRING_OPTION_EMPTY(xarch_root); +#endif #ifdef SYS_openat case SYS_openat: return IS_STRING_OPTION_EMPTY(xarch_root); #endif @@ -7307,6 +7325,9 @@ pre_system_call(dcontext_t *dcontext) break; } #ifdef LINUX +# ifdef SYS_ppoll_time64 + case SYS_ppoll_time64: +# endif case SYS_ppoll: { kernel_sigset_t *sigmask = (kernel_sigset_t *)sys_param(dcontext, 3); dcontext->sys_param3 = (reg_t)sigmask; @@ -7734,6 +7755,36 @@ pre_system_call(dcontext_t *dcontext) break; #endif +#ifdef SYS_openat2 + case SYS_openat2: + SYSLOG_INTERNAL_WARNING_ONCE( + "WARNING i#5131: possibly unhandled system call openat2"); + break; +#endif +#ifdef SYS_close_range + case SYS_close_range: + SYSLOG_INTERNAL_WARNING_ONCE( + "WARNING i#5131: possibly unhandled system call close_range"); + break; +#endif +#ifdef SYS_clone3 + case SYS_clone3: + SYSLOG_INTERNAL_WARNING_ONCE( + "WARNING i#5131: possibly unhandled system call clone3"); + break; +#endif +#ifdef SYS_pselect6_time64 + case SYS_pselect6_time64: + SYSLOG_INTERNAL_WARNING_ONCE( + "WARNING i#5131: possibly unhandled system call pselect6_time64"); + break; +#endif +#ifdef SYS_rt_sigtimedwait_time64 + case SYS_rt_sigtimedwait_time64: + SYSLOG_INTERNAL_WARNING_ONCE( + "WARNING i#5131: possibly unhandled system call rt_sigtimedwait_time64"); + break; +#endif default: { #ifdef VMX86_SERVER if (is_vmkuw_sysnum(dcontext->sys_num)) { @@ -8637,6 +8688,9 @@ post_system_call(dcontext_t *dcontext) } #endif #ifdef LINUX +# ifdef SYS_ppoll_time64 + case SYS_ppoll_time64: +# endif case SYS_ppoll: { if (dcontext->sys_param3 == (reg_t)NULL) break; @@ -8644,6 +8698,9 @@ post_system_call(dcontext_t *dcontext) set_syscall_param(dcontext, 3, dcontext->sys_param3); break; } +# ifdef SYS_pselect6_time64 + case SYS_pselect6_time64: +# endif case SYS_pselect6: { if (dcontext->sys_param4 == (reg_t)NULL) break; @@ -8784,7 +8841,18 @@ post_system_call(dcontext_t *dcontext) } break; #endif - +#ifdef SYS_openat2 + case SYS_openat2: + SYSLOG_INTERNAL_WARNING_ONCE( + "WARNING i#5131: possibly unhandled system call openat2"); + break; +#endif +#ifdef SYS_clone3 + case SYS_clone3: + SYSLOG_INTERNAL_WARNING_ONCE( + "WARNING i#5131: possibly unhandled system call clone3"); + break; +#endif default: #ifdef VMX86_SERVER if (is_vmkuw_sysnum(sysnum)) { diff --git a/suite/tests/linux/syscall_pwait.cpp b/suite/tests/linux/syscall_pwait.cpp index 6150e707a0a..c24b59789cc 100644 --- a/suite/tests/linux/syscall_pwait.cpp +++ b/suite/tests/linux/syscall_pwait.cpp @@ -160,6 +160,18 @@ execute_subtest(pthread_t main_thread, sigset_t *test_set, } } +#ifdef SYS_ppoll_time64 +static void +test_raw_ppoll_time64(pthread_t main_thread, sigset_t *test_set) +{ + auto psyscall_raw_ppoll_time64 = [](bool nullsigmask) -> int { + return syscall(SYS_ppoll_time64, nullptr, nullptr, nullptr, nullptr); + }; + print("Testing raw ppoll_time64 with NULL sigmask\n"); + execute_subtest(main_thread, test_set, psyscall_raw_ppoll_time64, true); +} +#endif + int main(int argc, char *argv[]) { @@ -521,7 +533,14 @@ main(int argc, char *argv[]) execute_subtest(main_thread, &test_set, psyscall_raw_ppoll, true); +#ifdef SYS_ppoll_time64 + test_raw_ppoll_time64(main_thread, &test_set); +#else + print("Testing raw ppoll_time64 with NULL sigmask\n"); + print("Signal received: 10\n"); + print("Signal received: 12\n"); +#endif destroy_cond_var(ready_to_listen); - + print("Done\n"); return 0; } diff --git a/suite/tests/linux/syscall_pwait.template b/suite/tests/linux/syscall_pwait.template index 0b60c52dff3..86211c9172e 100644 --- a/suite/tests/linux/syscall_pwait.template +++ b/suite/tests/linux/syscall_pwait.template @@ -58,3 +58,7 @@ Signal received: 12 Testing raw ppoll with NULL sigmask Signal received: 10 Signal received: 12 +Testing raw ppoll_time64 with NULL sigmask +Signal received: 10 +Signal received: 12 +Done