]> git.baikalelectronics.ru Git - kernel.git/commit
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)
commita93756d666d8c064b1ae0d4f47f1b0c4d909db48
treee46cec56e99efb70885b556a4b8aab1180a94a87
parente0899b530b7024d26027368a585451c56df6f1c1
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