54 lines
1.1 KiB
ArmAsm
54 lines
1.1 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
|
|
#include <linux/linkage.h>
|
|
#include <asm-generic/export.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)
|