Files
thead-kernel/arch/riscv/kernel/vector.S
thead_admin d4c68ef2c1 Linux_SDK_V1.4.2
Signed-off-by: thead_admin <occ_thead@service.alibaba.com>
2024-01-31 22:09:29 +08:00

85 lines
2.2 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)
.word 0x003072d7 /* vsetvli t0, x0, e8,m8 */
.word 0x02050027 /* vsb.v v0, (a0) */
addi a0, a0, RISCV_VECTOR_VLENB*8
.word 0x02050427 /* vsb.v v8, (a0) */
addi a0, a0, RISCV_VECTOR_VLENB*8
.word 0x02050827 /* vsb.v v16, (a0) */
addi a0, a0, RISCV_VECTOR_VLENB*8
.word 0x02050c27 /* 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
.word 0x003072d7 /* vsetvli t0, x0, e8,m8 */
.word 0x12050007 /* vlb.v v0, (a0) */
addi a0, a0, RISCV_VECTOR_VLENB*8
.word 0x12050407 /* vlb.v v8, (a0) */
addi a0, a0, RISCV_VECTOR_VLENB*8
.word 0x12050807 /* vlb.v v16, (a0) */
addi a0, a0, RISCV_VECTOR_VLENB*8
.word 0x12050c07 /* vlb.v v24, (a0) */
mv a0, t2
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)
.word 0x8072fe57 /* vsetvl t3, t0, t2 */
/* vsetvl & vsetvli would reset vstart to zero */
ld t0, TASK_THREAD_VSTART_V0(a0)
csrw CSR_VSTART, t0
csrc sstatus, t1
ret
ENDPROC(__vstate_restore)