riscv: Fixed misaligned memory access. Fixed pointer comparison.
authorMichael T. Kloos <michael@michaelkloos.com>
Tue, 8 Mar 2022 01:03:21 +0000 (20:03 -0500)
committerPalmer Dabbelt <palmer@rivosinc.com>
Thu, 10 Mar 2022 18:24:04 +0000 (10:24 -0800)
commit9d1f0ec9f71780e69ceb9d91697600c747d6e02e
treee46cec56e99efb70885b556a4b8aab1180a94a87
parentfeeb38685523c50bb08657bb0ff36cfac9f31100
riscv: Fixed misaligned memory access. Fixed pointer comparison.

Rewrote the RISC-V memmove() assembly implementation.  The
previous implementation did not check memory alignment and it
compared 2 pointers with a signed comparison.  The misaligned
memory access would cause the kernel to crash on systems that
did not emulate it in firmware and did not support it in hardware.
Firmware emulation is slow and may not exist.  The RISC-V spec
does not guarantee that support for misaligned memory accesses
will exist.  It should not be depended on.

This patch now checks for XLEN granularity of co-alignment between
the pointers.  Failing that, copying is done by loading from the 2
contiguous and naturally aligned XLEN memory locations containing
the overlapping XLEN sized data to be copied.  The data is shifted
into the correct place and binary or'ed together on each
iteration.  The result is then stored into the corresponding
naturally aligned XLEN sized location in the destination.  For
unaligned data at the terminations of the regions to be copied
or for copies less than (2 * XLEN) in size, byte copy is used.

This patch also now uses unsigned comparison for the pointers and
migrates to the newer assembler annotations from the now deprecated
ones.

Signed-off-by: Michael T. Kloos <michael@michaelkloos.com>
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/lib/memmove.S