Bug 456200 - Valgrind should not require neon (simd) on armhf
Summary: Valgrind should not require neon (simd) on armhf
Status: REPORTED
Alias: None
Product: valgrind
Classification: Developer tools
Component: general (other bugs)
Version First Reported In: 3.20 GIT
Platform: Other Linux
: NOR normal
Target Milestone: ---
Assignee: Julian Seward
URL: https://bugs.debian.org/cgi-bin/bugre...
Keywords:
Depends on:
Blocks:
 
Reported: 2022-07-01 09:49 UTC by Mathieu Malaterre
Modified: 2023-11-13 10:23 UTC (History)
2 users (show)

See Also:
Latest Commit:
Version Fixed In:
Sentry Crash Report:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Mathieu Malaterre 2022-07-01 09:49:43 UTC
SUMMARY

valgrind is currently configured to build with: -mcpu=cortex-a8
Since gcc-11 (and above) this means the compiler is free to include simd (neon) instruction. Since neon is not stricly required to run valgrind on armhf, please reduce requirement.



STEPS TO REPRODUCE

% git clone 
% ./autogen.sh && ./configure && make
% ./vg-in-place
Illegal instruction.

OBSERVED RESULT

neon instructions is present in the binaries.

Program received signal SIGILL, Illegal instruction.
vgPlain_am_startup (sp_at_startup=3204445696) at
m_aspacemgr/aspacemgr-linux.c:1626
1626       init_nsegment(&seg);
(gdb) x/i $pc
=> 0x58071090 <vgPlain_am_startup+20>:  vmov.i32        d16, #0 ; 0x00000000

EXPECTED RESULT

valgrind should run on neon-less armhf.

SOFTWARE/OS VERSIONS

% cat /proc/cpuinfo
model name      : ARMv7 Processor rev 2 (v7l)
Features        : half thumb fastmult vfp edsp thumbee vfpv3 tls idiva idivt vfpd32 lpae

ADDITIONAL INFORMATION

Complete thread on valgrind-users

https://sourceforge.net/p/valgrind/mailman/valgrind-users/thread/CA%2B7wUsyP0aTmfQMi3ro0AeXvRW8v2G1UYsLoFxpvi_RCUrbdJQ%40mail.gmail.com/#msg37673816
Comment 1 Mathieu Malaterre 2022-07-01 09:50:04 UTC
Here is a suggested patch:

 % sed -i -e 's/cortex-a8/generic-armv7-a+vfpv3-d16/g' Makefile.all.am
Comment 2 Mathieu Malaterre 2022-07-01 10:49:07 UTC
Correction, the actual patch should be:

sed -i -e 's/cortex-a8/generic-armv7-a/g' Makefile.all.am

There's no need for the fpu selection to be specified as generic-armv7-a
defaults to vfpv3-d16.

Credits:
Richard Earnshaw 
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=928224#60
Comment 3 Mark Wielaard 2023-10-18 10:06:32 UTC
The original reason for using -mcpu=cortex-a8 was:

commit 68f57d0181acae56adf05e0987990c2b41081f48
Author: Julian Seward <jseward@acm.org>
Date:   Tue May 31 07:17:54 2011 +0000

    On arm-linux, give gcc "-mcpu=cortex-a8" so as to persuade it to
    accept the armv6t2 (I think) insns (movt, movw) in
    dispatch-arm-linux.S.  Some older gccs apparently think they are
    compiling for armv6 by default and reject them (gcc 4.4.1 on Ubuntu
    9.10, for one.)
    
    
    
    git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11793

So I think generic-armv7-a would be fine too.

Have to find an 32bit arm machine to double check. But given that Debian apparently already made this change it is probably correct.
Comment 4 Mark Wielaard 2023-10-18 14:52:58 UTC
I tried on an armbian 23.02.2 Buster, based on Debian 10.13, so fairly old.
And with 6.1.11-rockchip, which has half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm.
So it "worked" before already. It seems to also "work" with the patch.

But, at least none/tests/arm/v6intThumb doesn't build (before/after the patch). And with that commented out, the make regtest results don't look very good (although the results are identical):

== 717 tests, 74 stderr failures, 8 stdout failures, 3 stderrB failures, 2 stdoutB failures, 15 post failures ==
gdbserver_tests/mcblocklistsearch        (stderrB)
gdbserver_tests/mcinfcallWSRU            (stderrB)
gdbserver_tests/nlcontrolc               (stdoutB)
gdbserver_tests/nlgone_exit              (stderrB)
gdbserver_tests/nlvgdbsigqueue           (stdoutB)
memcheck/tests/dw4                       (stderr)
memcheck/tests/err_disable3              (stderr)
memcheck/tests/err_disable4              (stderr)
memcheck/tests/leak-cases-full           (stderr)
memcheck/tests/leak-cases-summary        (stderr)
memcheck/tests/leak-cycle                (stderr)
memcheck/tests/leak-segv-jmp             (stderr)
memcheck/tests/leak-tree                 (stderr)
memcheck/tests/leak_cpp_interior         (stderr)
memcheck/tests/lks                       (stderr)
memcheck/tests/new_aligned_delete_default (stderr)
memcheck/tests/partiallydefinedeq        (stderr)
memcheck/tests/sem                       (stderr)
memcheck/tests/sendmsg                   (stderr)
memcheck/tests/supp_unknown              (stderr)
memcheck/tests/threadname                (stderr)
memcheck/tests/threadname_xml            (stderr)
memcheck/tests/varinfo2                  (stderr)
memcheck/tests/varinfo3                  (stderr)
memcheck/tests/varinfo4                  (stderr)
memcheck/tests/varinfo5                  (stderr)
memcheck/tests/varinfo6                  (stderr)
memcheck/tests/varinforestrict           (stderr)
memcheck/tests/vbit-test/vbit-test       (stderr)
helgrind/tests/annotate_rwlock           (stderr)
helgrind/tests/bar_bad                   (stderr)
helgrind/tests/bug392331                 (stderr)
helgrind/tests/free_is_write             (stderr)
helgrind/tests/hg02_deadlock             (stderr)
helgrind/tests/hg03_inherit              (stderr)
helgrind/tests/hg04_race                 (stderr)
helgrind/tests/hg04_race_h9              (stderr)
helgrind/tests/hg05_race2                (stderr)
helgrind/tests/locked_vs_unlocked1_fwd   (stderr)
helgrind/tests/locked_vs_unlocked1_rev   (stderr)
helgrind/tests/locked_vs_unlocked2       (stderr)
helgrind/tests/locked_vs_unlocked3       (stderr)
helgrind/tests/pth_barrier1              (stderr)
helgrind/tests/pth_barrier2              (stderr)
helgrind/tests/pth_barrier3              (stderr)
helgrind/tests/pth_destroy_cond          (stderr)
helgrind/tests/rwlock_race               (stderr)
helgrind/tests/tc01_simple_race          (stderr)
helgrind/tests/tc05_simple_race          (stderr)
helgrind/tests/tc06_two_races            (stderr)
helgrind/tests/tc06_two_races_xml        (stderr)
helgrind/tests/tc09_bad_unlock           (stderr)
helgrind/tests/tc14_laog_dinphils        (stderr)
helgrind/tests/tc16_byterace             (stderr)
helgrind/tests/tc19_shadowmem            (stderr)
helgrind/tests/tc20_verifywrap           (stderr)
helgrind/tests/tc21_pthonce              (stderr)
helgrind/tests/tc22_exit_w_lock          (stderr)
drd/tests/annotate_trace_memory          (stderr)
drd/tests/annotate_trace_memory_xml      (stderr)
drd/tests/atomic_var                     (stderr)
drd/tests/hg03_inherit                   (stderr)
drd/tests/hg05_race2                     (stderr)
drd/tests/pth_detached                   (stderr)
drd/tests/pth_detached2                  (stderr)
drd/tests/pth_detached_sem               (stderr)
drd/tests/rwlock_race                    (stderr)
drd/tests/tc19_shadowmem                 (stderr)
drd/tests/tc21_pthonce                   (stderr)
massif/tests/bug469146                   (post)
massif/tests/mmapunmap                   (post)
massif/tests/new-cpp                     (post)
massif/tests/overloaded-new              (post)
none/tests/arm/v6intThumb                (stdout)
none/tests/arm/v6intThumb                (stderr)
none/tests/arm/v8crypto_a                (stdout)
none/tests/arm/v8crypto_a                (stderr)
none/tests/arm/v8crypto_t                (stdout)
none/tests/arm/v8crypto_t                (stderr)
none/tests/arm/v8fpsimd_a                (stdout)
none/tests/arm/v8fpsimd_a                (stderr)
none/tests/arm/v8fpsimd_t                (stdout)
none/tests/arm/v8fpsimd_t                (stderr)
none/tests/arm/v8memory_a                (stdout)
none/tests/arm/v8memory_a                (stderr)
none/tests/arm/v8memory_t                (stdout)
none/tests/arm/v8memory_t                (stderr)
none/tests/bigcode                       (stdout)
none/tests/bigcode                       (stderr)
exp-bbv/tests/arm-linux/ll               (stderr)
exp-bbv/tests/arm-linux/ll               (post)
exp-bbv/tests/arm-linux/million          (stderr)
exp-bbv/tests/arm-linux/million          (post)