| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- /* SPDX-License-Identifier: GPL-2.0-only */
- #include <linux/linkage.h>
- #include <asm/asm.h>
- #include <asm/asm-extable.h>
- #include <asm/csr.h>
- #define pDst a0
- #define pSrc a1
- #define iNum a2
- #define iVL a3
- #define ELEM_LMUL_SETTING m8
- #define vData v0
- .macro fixup op reg addr lbl
- 100:
- \op \reg, \addr
- _asm_extable 100b, \lbl
- .endm
- SYM_FUNC_START(__asm_vector_usercopy)
- /* Enable access to user memory */
- li t6, SR_SUM
- csrs CSR_STATUS, t6
- loop:
- vsetvli iVL, iNum, e8, ELEM_LMUL_SETTING, ta, ma
- fixup vle8.v vData, (pSrc), 10f
- sub iNum, iNum, iVL
- add pSrc, pSrc, iVL
- fixup vse8.v vData, (pDst), 11f
- add pDst, pDst, iVL
- bnez iNum, loop
- /* Exception fixup for vector load is shared with normal exit */
- 10:
- /* Disable access to user memory */
- csrc CSR_STATUS, t6
- mv a0, iNum
- ret
- /* Exception fixup code for vector store. */
- 11:
- /* Undo the subtraction after vle8.v */
- add iNum, iNum, iVL
- /* Make sure the scalar fallback skip already processed bytes */
- csrr t2, CSR_VSTART
- sub iNum, iNum, t2
- j 10b
- SYM_FUNC_END(__asm_vector_usercopy)
|