Bug 469097 - ppc64(be) doesn't support SCV syscall instruction
Summary: ppc64(be) doesn't support SCV syscall instruction
Status: RESOLVED FIXED
Alias: None
Product: valgrind
Classification: Developer tools
Component: general (show other bugs)
Version: 3.20.0
Platform: Other Linux
: NOR normal
Target Milestone: ---
Assignee: Julian Seward
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2023-04-28 10:50 UTC by Mark Wielaard
Modified: 2023-05-06 05:52 UTC (History)
2 users (show)

See Also:
Latest Commit:
Version Fixed In:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Mark Wielaard 2023-04-28 10:50:55 UTC
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)
Comment 1 Mark Wielaard 2023-04-28 10:57:27 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;
Comment 2 Mark Wielaard 2023-04-28 12:47:18 UTC
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 */
Comment 3 Mark Wielaard 2023-04-28 12:58:08 UTC
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)
Comment 4 Mark Wielaard 2023-04-28 13:11:27 UTC
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