| Summary: | ppc64(be) doesn't support SCV syscall instruction | ||
|---|---|---|---|
| Product: | [Developer tools] valgrind | Reporter: | Mark Wielaard <mark> |
| Component: | general | Assignee: | Julian Seward <jseward> |
| Status: | RESOLVED FIXED | ||
| Severity: | normal | CC: | pjfloyd, sam |
| Priority: | NOR | ||
| Version First Reported In: | 3.20.0 | ||
| Target Milestone: | --- | ||
| Platform: | Other | ||
| OS: | Linux | ||
| Latest Commit: | Version Fixed/Implemented In: | ||
| Sentry Crash Report: | |||
|
Description
Mark Wielaard
2023-04-28 10:50:55 UTC
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 |