• Leonid Yegoshin's avatar
    MIPS: MSA unaligned memory access support · e4aa1f15
    Leonid Yegoshin authored
    The MSA architecture specification allows for hardware to not implement
    unaligned vector memory accesses in some or all cases. A typical example
    of this is the I6400 core which does not implement unaligned vector
    memory access when the memory crosses a page boundary. The architecture
    also requires that such memory accesses complete successfully as far as
    userland is concerned, so the kernel is required to emulate them.
    
    This patch implements support for emulating unaligned MSA ld & st
    instructions by copying between the user memory & the tasks FP context
    in struct thread_struct, updating hardware registers from there as
    appropriate in order to avoid saving & restoring the entire vector
    context for each unaligned memory access.
    
    Tested both using an I6400 CPU and with a QEMU build hacked to produce
    AdEL exceptions for unaligned vector memory accesses.
    
    [paul.burton@imgtec.com:
      - Remove #ifdef's
      - Move msa_op into enum major_op rather than #define
      - Replace msa_{to,from}_wd with {read,write}_msa_wr_{b,h,w,l} and the
        format-agnostic wrappers, removing the custom endian mangling for
        big endian systems.
      - Restructure the msa_op case in emulate_load_store_insn to share
        more code between the load & store cases.
      - Avoid the need for a temporary union fpureg on the stack by simply
        reusing the already suitably aligned context in struct
        thread_struct.
      - Use sizeof(*fpr) rather than hardcoding 16 as the size for user
        memory checks & copies.
      - Stop recalculating the address of the unaligned vector memory access
        and rely upon the value read from BadVAddr as we do for other
        unaligned memory access instructions.
      - Drop the now unused val8 & val16 fields in union fpureg.
      - Rewrite commit message.
      - General formatting cleanups.]
    Signed-off-by: default avatarPaul Burton <paul.burton@imgtec.com>
    Cc: linux-mips@linux-mips.org
    Cc: Leonid Yegoshin <Leonid.Yegoshin@imgtec.com>
    Cc: Huacai Chen <chenhc@lemote.com>
    Cc: Maciej W. Rozycki <macro@linux-mips.org>
    Cc: linux-kernel@vger.kernel.org
    Cc: Jie Chen <chenj@lemote.com>
    Cc: Markos Chandras <markos.chandras@imgtec.com>
    Patchwork: https://patchwork.linux-mips.org/patch/10573/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    e4aa1f15
unaligned.c 59.5 KB