linuxOS_D21X/source/linux-5.10/arch/riscv/kernel/vector.S
2024-11-29 16:13:46 +08:00

93 lines
2.1 KiB
ArmAsm

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (C) 2012 Regents of the University of California
* Copyright (C) 2017 SiFive
* Copyright (C) 2019 T-HEAD
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, version 2.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <linux/linkage.h>
#include <asm/asm.h>
#include <asm/csr.h>
#include <asm/asm-offsets.h>
ENTRY(__vstate_save)
li a2, TASK_THREAD_V0
add a0, a0, a2
li t1, (SR_VS | SR_FS)
csrs sstatus, t1
csrr t0, CSR_VSTART
sd t0, TASK_THREAD_VSTART_V0(a0)
csrr t0, CSR_VXSAT
sd t0, TASK_THREAD_VXSAT_V0(a0)
csrr t0, CSR_VXRM
sd t0, TASK_THREAD_VXRM_V0(a0)
csrr t0, CSR_VL
sd t0, TASK_THREAD_VL_V0(a0)
csrr t0, CSR_VTYPE
sd t0, TASK_THREAD_VTYPE_V0(a0)
vsetvli t0, x0, e8,m8
vsb.v v0, (a0)
addi a0, a0, RISCV_VECTOR_VLENB*8
vsb.v v8, (a0)
addi a0, a0, RISCV_VECTOR_VLENB*8
vsb.v v16, (a0)
addi a0, a0, RISCV_VECTOR_VLENB*8
vsb.v v24, (a0)
csrc sstatus, t1
ret
ENDPROC(__vstate_save)
ENTRY(__vstate_restore)
li a2, TASK_THREAD_V0
add a0, a0, a2
mv t2, a0
li t1, (SR_VS | SR_FS)
csrs sstatus, t1
vsetvli t0, x0, e8,m8
vlb.v v0, (a0)
addi a0, a0, RISCV_VECTOR_VLENB*8
vlb.v v8, (a0)
addi a0, a0, RISCV_VECTOR_VLENB*8
vlb.v v16, (a0)
addi a0, a0, RISCV_VECTOR_VLENB*8
vlb.v v24, (a0)
mv a0, t2
ld t0, TASK_THREAD_VSTART_V0(a0)
csrw CSR_VSTART, t0
ld t0, TASK_THREAD_VXSAT_V0(a0)
csrw CSR_VXSAT, t0
ld t0, TASK_THREAD_VXRM_V0(a0)
csrw CSR_VXRM, t0
ld t0, TASK_THREAD_VL_V0(a0)
ld t2, TASK_THREAD_VTYPE_V0(a0)
#ifdef CONFIG_VECTOR_EMU
srli t3, t2, 63
bne t3,zero,1f
#endif
vsetvl t3, t0, t2
#ifdef CONFIG_VECTOR_EMU
j 2f
1: vsetvli zero,zero,e64,m2,d1
2:
#endif
csrc sstatus, t1
ret
ENDPROC(__vstate_restore)