[PATCH v2] riscv: Fix alignment-ignorant memcpy implementation

Evan Green evan@rivosinc.com
Tue Mar 5 19:30:18 GMT 2024


On Tue, Mar 5, 2024 at 9:03 AM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
> The memcpy optimization (commit 587a1290a1af7bee6db) 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.
>
> ---

Thanks again for the quick fixup.

Reviewed-by: Evan Green <evan@rivosinc.com>


More information about the Libc-alpha mailing list