mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-06 20:58:33 +01:00
The memcpy optimization (commit 587a1290a1
) has a series
of mistakes:
- The implementation is wrong: the chunk size calculation is wrong
leading to invalid memory access.
- It adds ifunc supports as default, so --disable-multi-arch does
not work as expected for riscv.
- It mixes Linux files (memcpy ifunc selection which requires the
vDSO/syscall mechanism) with generic support (the memcpy
optimization itself).
- There is no __libc_ifunc_impl_list, which makes testing only
check the selected implementation instead of all supported
by the system.
This patch also simplifies the required bits to enable ifunc: there
is no need to memcopy.h; nor to add Linux-specific files.
The __memcpy_noalignment tail handling now uses a branchless strategy
similar to aarch64 (overlap 32-bits copies for sizes 4..7 and byte
copies for size 1..3).
Checked on riscv64 and riscv32 by explicitly enabling the function
on __libc_ifunc_impl_list on qemu-system.
Changes from v1:
* Implement the memcpy in assembly to correctly handle RISCV
strict-alignment.
Reviewed-by: Evan Green <evan@rivosinc.com>
Acked-by: Palmer Dabbelt <palmer@rivosinc.com>
37 lines
1.3 KiB
C
37 lines
1.3 KiB
C
/* RISC-V hardware feature probing support on Linux
|
|
Copyright (C) 2024 Free Software Foundation, Inc.
|
|
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public License as
|
|
published by the Free Software Foundation; either version 2.1 of the
|
|
License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, see
|
|
<https://www.gnu.org/licenses/>. */
|
|
|
|
#include <sys/syscall.h>
|
|
#include <sys/hwprobe.h>
|
|
#include <sysdep.h>
|
|
#include <sysdep-vdso.h>
|
|
|
|
int __riscv_hwprobe (struct riscv_hwprobe *pairs, size_t pair_count,
|
|
size_t cpu_count, unsigned long int *cpus,
|
|
unsigned int flags)
|
|
{
|
|
int r;
|
|
|
|
r = INTERNAL_VSYSCALL (riscv_hwprobe, 5, pairs, pair_count,
|
|
cpu_count, cpus, flags);
|
|
|
|
/* Negate negative errno values to match pthreads API. */
|
|
return -r;
|
|
}
|
|
libc_hidden_def (__riscv_hwprobe)
|