mirror of
https://github.com/torvalds/linux.git
synced 2024-11-15 08:31:55 +00:00
a4c3733d32
Many of the privileged CSRs exist in a supervisor and machine version that are used very similarly. Provide versions of the CSR names and fields that map to either the S-mode or M-mode variant depending on a new CONFIG_RISCV_M_MODE kconfig symbol. Contains contributions from Damien Le Moal <Damien.LeMoal@wdc.com> and Paul Walmsley <paul.walmsley@sifive.com>. Signed-off-by: Christoph Hellwig <hch@lst.de> Acked-by: Thomas Gleixner <tglx@linutronix.de> # for drivers/clocksource, drivers/irqchip [paul.walmsley@sifive.com: updated to apply] Signed-off-by: Paul Walmsley <paul.walmsley@sifive.com>
107 lines
3.1 KiB
ArmAsm
107 lines
3.1 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright (C) 2012 Regents of the University of California
|
|
* Copyright (C) 2017 SiFive
|
|
*
|
|
* 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(__fstate_save)
|
|
li a2, TASK_THREAD_F0
|
|
add a0, a0, a2
|
|
li t1, SR_FS
|
|
csrs CSR_STATUS, t1
|
|
frcsr t0
|
|
fsd f0, TASK_THREAD_F0_F0(a0)
|
|
fsd f1, TASK_THREAD_F1_F0(a0)
|
|
fsd f2, TASK_THREAD_F2_F0(a0)
|
|
fsd f3, TASK_THREAD_F3_F0(a0)
|
|
fsd f4, TASK_THREAD_F4_F0(a0)
|
|
fsd f5, TASK_THREAD_F5_F0(a0)
|
|
fsd f6, TASK_THREAD_F6_F0(a0)
|
|
fsd f7, TASK_THREAD_F7_F0(a0)
|
|
fsd f8, TASK_THREAD_F8_F0(a0)
|
|
fsd f9, TASK_THREAD_F9_F0(a0)
|
|
fsd f10, TASK_THREAD_F10_F0(a0)
|
|
fsd f11, TASK_THREAD_F11_F0(a0)
|
|
fsd f12, TASK_THREAD_F12_F0(a0)
|
|
fsd f13, TASK_THREAD_F13_F0(a0)
|
|
fsd f14, TASK_THREAD_F14_F0(a0)
|
|
fsd f15, TASK_THREAD_F15_F0(a0)
|
|
fsd f16, TASK_THREAD_F16_F0(a0)
|
|
fsd f17, TASK_THREAD_F17_F0(a0)
|
|
fsd f18, TASK_THREAD_F18_F0(a0)
|
|
fsd f19, TASK_THREAD_F19_F0(a0)
|
|
fsd f20, TASK_THREAD_F20_F0(a0)
|
|
fsd f21, TASK_THREAD_F21_F0(a0)
|
|
fsd f22, TASK_THREAD_F22_F0(a0)
|
|
fsd f23, TASK_THREAD_F23_F0(a0)
|
|
fsd f24, TASK_THREAD_F24_F0(a0)
|
|
fsd f25, TASK_THREAD_F25_F0(a0)
|
|
fsd f26, TASK_THREAD_F26_F0(a0)
|
|
fsd f27, TASK_THREAD_F27_F0(a0)
|
|
fsd f28, TASK_THREAD_F28_F0(a0)
|
|
fsd f29, TASK_THREAD_F29_F0(a0)
|
|
fsd f30, TASK_THREAD_F30_F0(a0)
|
|
fsd f31, TASK_THREAD_F31_F0(a0)
|
|
sw t0, TASK_THREAD_FCSR_F0(a0)
|
|
csrc CSR_STATUS, t1
|
|
ret
|
|
ENDPROC(__fstate_save)
|
|
|
|
ENTRY(__fstate_restore)
|
|
li a2, TASK_THREAD_F0
|
|
add a0, a0, a2
|
|
li t1, SR_FS
|
|
lw t0, TASK_THREAD_FCSR_F0(a0)
|
|
csrs CSR_STATUS, t1
|
|
fld f0, TASK_THREAD_F0_F0(a0)
|
|
fld f1, TASK_THREAD_F1_F0(a0)
|
|
fld f2, TASK_THREAD_F2_F0(a0)
|
|
fld f3, TASK_THREAD_F3_F0(a0)
|
|
fld f4, TASK_THREAD_F4_F0(a0)
|
|
fld f5, TASK_THREAD_F5_F0(a0)
|
|
fld f6, TASK_THREAD_F6_F0(a0)
|
|
fld f7, TASK_THREAD_F7_F0(a0)
|
|
fld f8, TASK_THREAD_F8_F0(a0)
|
|
fld f9, TASK_THREAD_F9_F0(a0)
|
|
fld f10, TASK_THREAD_F10_F0(a0)
|
|
fld f11, TASK_THREAD_F11_F0(a0)
|
|
fld f12, TASK_THREAD_F12_F0(a0)
|
|
fld f13, TASK_THREAD_F13_F0(a0)
|
|
fld f14, TASK_THREAD_F14_F0(a0)
|
|
fld f15, TASK_THREAD_F15_F0(a0)
|
|
fld f16, TASK_THREAD_F16_F0(a0)
|
|
fld f17, TASK_THREAD_F17_F0(a0)
|
|
fld f18, TASK_THREAD_F18_F0(a0)
|
|
fld f19, TASK_THREAD_F19_F0(a0)
|
|
fld f20, TASK_THREAD_F20_F0(a0)
|
|
fld f21, TASK_THREAD_F21_F0(a0)
|
|
fld f22, TASK_THREAD_F22_F0(a0)
|
|
fld f23, TASK_THREAD_F23_F0(a0)
|
|
fld f24, TASK_THREAD_F24_F0(a0)
|
|
fld f25, TASK_THREAD_F25_F0(a0)
|
|
fld f26, TASK_THREAD_F26_F0(a0)
|
|
fld f27, TASK_THREAD_F27_F0(a0)
|
|
fld f28, TASK_THREAD_F28_F0(a0)
|
|
fld f29, TASK_THREAD_F29_F0(a0)
|
|
fld f30, TASK_THREAD_F30_F0(a0)
|
|
fld f31, TASK_THREAD_F31_F0(a0)
|
|
fscsr t0
|
|
csrc CSR_STATUS, t1
|
|
ret
|
|
ENDPROC(__fstate_restore)
|