• Michael T. Kloos's avatar
    riscv: Fixed misaligned memory access. Fixed pointer comparison. · 9d1f0ec9
    Michael T. Kloos authored
    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: default avatarMichael T. Kloos <michael@michaelkloos.com>
    Signed-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
    9d1f0ec9
memmove.S 7.84 KB