mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-22 23:13:01 +02:00
When running the raid6 user-space test program on RISC-V QEMU, there's a
segmentation fault which seems caused by accessing a NULL pointer,
which is the pointer variable p/q in raid6_rvv*_gen/xor_syndrome_real(),
p/q should have been equal to dptr[x], but when I use GDB command to
see its value, which was 0x10 like below:
"
Program received signal SIGSEGV, Segmentation fault.
0x0000000000011062 in raid6_rvv2_xor_syndrome_real (disks=<optimized out>, start=0, stop=<optimized out>, bytes=4096, ptrs=<optimized out>) at rvv.c:386
(gdb) p p
$1 = (u8 *) 0x10 <error: Cannot access memory at address 0x10>
"
The issue was found to be related with:
1) Compile optimization
There's no segmentation fault if compiling the raid6test program with
the optimization flag -O0.
2) The RISC-V vector command vsetvli
If not used t0 as the first parameter in vsetvli, there's no
segmentation fault either.
This patch selects the 2nd solution to fix the issue.
[Palmer: The actual issue here is a missing clobber in the vsetvli code.
It's a little tricky: we've already probed for VLENB so we don't need to
look at the output register, we just need to have an X register in the
instruction as that's the form required to actually set VL. Thus we
clobber a register, and without describing that we end up breaking
compilers.]
Fixes:
|
||
|---|---|---|
| .. | ||
| test | ||
| .gitignore | ||
| algos.c | ||
| altivec.uc | ||
| avx2.c | ||
| avx512.c | ||
| int.uc | ||
| loongarch_simd.c | ||
| loongarch.h | ||
| Makefile | ||
| mktables.c | ||
| mmx.c | ||
| neon.c | ||
| neon.h | ||
| neon.uc | ||
| recov_avx2.c | ||
| recov_avx512.c | ||
| recov_loongarch_simd.c | ||
| recov_neon_inner.c | ||
| recov_neon.c | ||
| recov_rvv.c | ||
| recov_s390xc.c | ||
| recov_ssse3.c | ||
| recov.c | ||
| rvv.c | ||
| rvv.h | ||
| s390vx.uc | ||
| sse1.c | ||
| sse2.c | ||
| unroll.awk | ||
| vpermxor.uc | ||
| x86.h | ||