/* SPDX-License-Identifier: GPL-2.0-only */ #include #include #include #include #include #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)