Running on a kernel that supports the SCV instruction (sets PPC_FEATURE2_SCV in auxv AT_HWCAPS2) valgrind will assert: valgrind: m_syswrap/syswrap-main.c:549 (getSyscallArgsFromGuestState): Assertion 'gst->guest_syscall_flag == SC_FLAG' failed. See also https://bugs.kde.org/show_bug.cgi?id=469049 comments #1 and #2 (this is a separate bug though)
At first I thought filtering out PPC_FEATURE2_SCV on ppc64be was the way to go (that works). But we it seems we can just remove the assert. Running regtest now. mjw@debian-ppc64-builder:~/valgrind$ git diff diff --git a/coregrind/m_syswrap/syswrap-main.c b/coregrind/m_syswrap/syswrap-main.c index abd8472e9..4f8c0fe1c 100644 --- a/coregrind/m_syswrap/syswrap-main.c +++ b/coregrind/m_syswrap/syswrap-main.c @@ -544,11 +544,6 @@ void getSyscallArgsFromGuestState ( /*OUT*/SyscallArgs* canonical, canonical->arg7 = gst->guest_syscall_flag; canonical->arg8 = 0; -#if defined(VGP_ppc64be_linux) - /* The sc instruction is currently only supported on LE systems. */ - vg_assert(gst->guest_syscall_flag == SC_FLAG); -#endif - #elif defined(VGP_x86_freebsd) VexGuestX86State* gst = (VexGuestX86State*)gst_vanilla; UWord *stack = (UWord *)gst->guest_ESP;
Just disabling the assert does get most things working, but there were some hangs and various failing regtests == 706 tests, 38 stderr failures, 10 stdout failures, 0 stderrB failures, 0 stdoutB failures, 2 post failures == memcheck/tests/buflen_check (stderr) memcheck/tests/bug340392 (stderr) memcheck/tests/erringfds (stdout) memcheck/tests/erringfds (stderr) memcheck/tests/file_locking (stderr) memcheck/tests/leak_cpp_interior (stderr) memcheck/tests/linux/memfd_create (stderr) memcheck/tests/linux/rfcomm (stderr) memcheck/tests/linux/sys-preadv_pwritev (stderr) memcheck/tests/linux/timerfd-syscall (stderr) memcheck/tests/null_socket (stdout) memcheck/tests/post-syscall (stderr) memcheck/tests/writev1 (stderr) helgrind/tests/cond_timedwait_test (stderr) helgrind/tests/tls_threads (stderr) helgrind/tests/tls_threads2 (stderr) drd/tests/annotate_sem (stderr) drd/tests/bar_bad (stderr) drd/tests/concurrent_close (stderr) drd/tests/matinv (stdout) drd/tests/matinv (stderr) drd/tests/pth_barrier_thr_cr (stderr) drd/tests/pth_broadcast (stderr) drd/tests/pth_cancel_locked (stderr) drd/tests/pth_mutex_signal (stderr) drd/tests/pth_spinlock (stderr) drd/tests/sem_open (stderr) drd/tests/sem_open2 (stderr) drd/tests/sem_open3 (stderr) drd/tests/sem_open_traced (stderr) drd/tests/std_list (stderr) drd/tests/std_thread2 (stderr) massif/tests/new-cpp (post) massif/tests/overloaded-new (post) none/tests/fdleak_cmsg (stderr) none/tests/fdleak_ipv4 (stdout) none/tests/fdleak_ipv4 (stderr) none/tests/manythreads (stdout) none/tests/manythreads (stderr) none/tests/ppc64/test_darn_inst (stdout) none/tests/ppc64/test_isa_3_0_altivec (stdout) none/tests/ppc64/test_isa_3_0_other (stdout) none/tests/pselect_alarm (stderr) none/tests/pth_cancel2 (stderr) none/tests/scripts/shell (stdout) none/tests/scripts/shell (stderr) none/tests/scripts/shell_valid4 (stderr) none/tests/syscall-restart1 (stderr) none/tests/syscall-restart2 (stderr) none/tests/threadederrno (stdout) Now trying to simply filter out PPC_FEATURE2_SCV if not on ppc64le_linux: mjw@debian-ppc64-builder:~/valgrind$ git diff diff --git a/coregrind/m_initimg/initimg-linux.c b/coregrind/m_initimg/initimg-linux.c index 4da9a8b97..7a7d45335 100644 --- a/coregrind/m_initimg/initimg-linux.c +++ b/coregrind/m_initimg/initimg-linux.c @@ -852,7 +852,11 @@ Addr setup_client_stack( void* init_sp, | 0x04000000ULL /* TAR */ | 0x04000000ULL /* VEC_CRYPTO */ | 0x00800000ULL /* ARCH_3_00 */ +#if defined(VGP_ppc64le_linux) + /* Should also be supported on ppc64be, + but see https://bugs.kde.org/show_bug.cgi?id=469097 */ | 0x00100000ULL /* PPC_FEATURE2_SCV */ +#endif | 0x00400000ULL /* HAS_IEEE128 */ | 0x00200000ULL /* PPC_FEATURE2_DARN */ | 0x00040000ULL /* ARCH_3_1 */
With filtering out PPC_FEATURE2_SCV the regtest results look much more reasonable: == 706 tests, 7 stderr failures, 3 stdout failures, 0 stderrB failures, 2 stdoutB failures, 2 post failures == gdbserver_tests/nlgone_abrt (stdoutB) gdbserver_tests/nlpasssigalrm (stdoutB) memcheck/tests/bug340392 (stderr) memcheck/tests/leak_cpp_interior (stderr) memcheck/tests/linux/rfcomm (stderr) memcheck/tests/linux/sys-execveat (stderr) helgrind/tests/tls_threads (stderr) helgrind/tests/tls_threads2 (stderr) drd/tests/std_thread2 (stderr) massif/tests/new-cpp (post) massif/tests/overloaded-new (post) none/tests/ppc64/test_darn_inst (stdout) none/tests/ppc64/test_isa_3_0_altivec (stdout) none/tests/ppc64/test_isa_3_0_other (stdout)
commit b4ec6a6ff767098714ffa8c4e3e3081d98fd2d66 (HEAD -> master) Author: Mark Wielaard <mark@klomp.org> Date: Fri Apr 28 13:34:48 2023 +0200 Support SCV_FLAG also on VGP_ppc64be_linux Running on a kernel that supports the SCV instruction (sets PPC_FEATURE2_SCV in auxv AT_HWCAPS2) valgrind will assert: valgrind: m_syswrap/syswrap-main.c:549 (getSyscallArgsFromGuestState): Assertion 'gst->guest_syscall_flag == SC_FLAG' failed. Removing that assert makes most things work. But also filter out PPC_FEATURE2_SCV from AT_HWCAPS2 for the client, so it shouldn't try using the SCV instruction. https://bugs.kde.org/show_bug.cgi?id=469097