xref: /openbmc/linux/arch/riscv/kernel/fpu.S (revision c95baf12f5077419db01313ab61c2aac007d40cd)
1e68ad867SAlan Kao/* SPDX-License-Identifier: GPL-2.0 */
2e68ad867SAlan Kao/*
3e68ad867SAlan Kao * Copyright (C) 2012 Regents of the University of California
4e68ad867SAlan Kao * Copyright (C) 2017 SiFive
5e68ad867SAlan Kao *
6e68ad867SAlan Kao *   This program is free software; you can redistribute it and/or
7e68ad867SAlan Kao *   modify it under the terms of the GNU General Public License
8e68ad867SAlan Kao *   as published by the Free Software Foundation, version 2.
9e68ad867SAlan Kao *
10e68ad867SAlan Kao *   This program is distributed in the hope that it will be useful,
11e68ad867SAlan Kao *   but WITHOUT ANY WARRANTY; without even the implied warranty of
12e68ad867SAlan Kao *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13e68ad867SAlan Kao *   GNU General Public License for more details.
14e68ad867SAlan Kao */
15e68ad867SAlan Kao
16e68ad867SAlan Kao#include <linux/linkage.h>
17e68ad867SAlan Kao
18e68ad867SAlan Kao#include <asm/asm.h>
19e68ad867SAlan Kao#include <asm/csr.h>
20e68ad867SAlan Kao#include <asm/asm-offsets.h>
21e68ad867SAlan Kao
22e68ad867SAlan KaoENTRY(__fstate_save)
23e68ad867SAlan Kao	li  a2,  TASK_THREAD_F0
24e68ad867SAlan Kao	add a0, a0, a2
25e68ad867SAlan Kao	li t1, SR_FS
26*a4c3733dSChristoph Hellwig	csrs CSR_STATUS, t1
27e68ad867SAlan Kao	frcsr t0
28e68ad867SAlan Kao	fsd f0,  TASK_THREAD_F0_F0(a0)
29e68ad867SAlan Kao	fsd f1,  TASK_THREAD_F1_F0(a0)
30e68ad867SAlan Kao	fsd f2,  TASK_THREAD_F2_F0(a0)
31e68ad867SAlan Kao	fsd f3,  TASK_THREAD_F3_F0(a0)
32e68ad867SAlan Kao	fsd f4,  TASK_THREAD_F4_F0(a0)
33e68ad867SAlan Kao	fsd f5,  TASK_THREAD_F5_F0(a0)
34e68ad867SAlan Kao	fsd f6,  TASK_THREAD_F6_F0(a0)
35e68ad867SAlan Kao	fsd f7,  TASK_THREAD_F7_F0(a0)
36e68ad867SAlan Kao	fsd f8,  TASK_THREAD_F8_F0(a0)
37e68ad867SAlan Kao	fsd f9,  TASK_THREAD_F9_F0(a0)
38e68ad867SAlan Kao	fsd f10, TASK_THREAD_F10_F0(a0)
39e68ad867SAlan Kao	fsd f11, TASK_THREAD_F11_F0(a0)
40e68ad867SAlan Kao	fsd f12, TASK_THREAD_F12_F0(a0)
41e68ad867SAlan Kao	fsd f13, TASK_THREAD_F13_F0(a0)
42e68ad867SAlan Kao	fsd f14, TASK_THREAD_F14_F0(a0)
43e68ad867SAlan Kao	fsd f15, TASK_THREAD_F15_F0(a0)
44e68ad867SAlan Kao	fsd f16, TASK_THREAD_F16_F0(a0)
45e68ad867SAlan Kao	fsd f17, TASK_THREAD_F17_F0(a0)
46e68ad867SAlan Kao	fsd f18, TASK_THREAD_F18_F0(a0)
47e68ad867SAlan Kao	fsd f19, TASK_THREAD_F19_F0(a0)
48e68ad867SAlan Kao	fsd f20, TASK_THREAD_F20_F0(a0)
49e68ad867SAlan Kao	fsd f21, TASK_THREAD_F21_F0(a0)
50e68ad867SAlan Kao	fsd f22, TASK_THREAD_F22_F0(a0)
51e68ad867SAlan Kao	fsd f23, TASK_THREAD_F23_F0(a0)
52e68ad867SAlan Kao	fsd f24, TASK_THREAD_F24_F0(a0)
53e68ad867SAlan Kao	fsd f25, TASK_THREAD_F25_F0(a0)
54e68ad867SAlan Kao	fsd f26, TASK_THREAD_F26_F0(a0)
55e68ad867SAlan Kao	fsd f27, TASK_THREAD_F27_F0(a0)
56e68ad867SAlan Kao	fsd f28, TASK_THREAD_F28_F0(a0)
57e68ad867SAlan Kao	fsd f29, TASK_THREAD_F29_F0(a0)
58e68ad867SAlan Kao	fsd f30, TASK_THREAD_F30_F0(a0)
59e68ad867SAlan Kao	fsd f31, TASK_THREAD_F31_F0(a0)
60e68ad867SAlan Kao	sw t0, TASK_THREAD_FCSR_F0(a0)
61*a4c3733dSChristoph Hellwig	csrc CSR_STATUS, t1
62e68ad867SAlan Kao	ret
63e68ad867SAlan KaoENDPROC(__fstate_save)
64e68ad867SAlan Kao
65e68ad867SAlan KaoENTRY(__fstate_restore)
66e68ad867SAlan Kao	li  a2,  TASK_THREAD_F0
67e68ad867SAlan Kao	add a0, a0, a2
68e68ad867SAlan Kao	li t1, SR_FS
69e68ad867SAlan Kao	lw t0, TASK_THREAD_FCSR_F0(a0)
70*a4c3733dSChristoph Hellwig	csrs CSR_STATUS, t1
71e68ad867SAlan Kao	fld f0,  TASK_THREAD_F0_F0(a0)
72e68ad867SAlan Kao	fld f1,  TASK_THREAD_F1_F0(a0)
73e68ad867SAlan Kao	fld f2,  TASK_THREAD_F2_F0(a0)
74e68ad867SAlan Kao	fld f3,  TASK_THREAD_F3_F0(a0)
75e68ad867SAlan Kao	fld f4,  TASK_THREAD_F4_F0(a0)
76e68ad867SAlan Kao	fld f5,  TASK_THREAD_F5_F0(a0)
77e68ad867SAlan Kao	fld f6,  TASK_THREAD_F6_F0(a0)
78e68ad867SAlan Kao	fld f7,  TASK_THREAD_F7_F0(a0)
79e68ad867SAlan Kao	fld f8,  TASK_THREAD_F8_F0(a0)
80e68ad867SAlan Kao	fld f9,  TASK_THREAD_F9_F0(a0)
81e68ad867SAlan Kao	fld f10, TASK_THREAD_F10_F0(a0)
82e68ad867SAlan Kao	fld f11, TASK_THREAD_F11_F0(a0)
83e68ad867SAlan Kao	fld f12, TASK_THREAD_F12_F0(a0)
84e68ad867SAlan Kao	fld f13, TASK_THREAD_F13_F0(a0)
85e68ad867SAlan Kao	fld f14, TASK_THREAD_F14_F0(a0)
86e68ad867SAlan Kao	fld f15, TASK_THREAD_F15_F0(a0)
87e68ad867SAlan Kao	fld f16, TASK_THREAD_F16_F0(a0)
88e68ad867SAlan Kao	fld f17, TASK_THREAD_F17_F0(a0)
89e68ad867SAlan Kao	fld f18, TASK_THREAD_F18_F0(a0)
90e68ad867SAlan Kao	fld f19, TASK_THREAD_F19_F0(a0)
91e68ad867SAlan Kao	fld f20, TASK_THREAD_F20_F0(a0)
92e68ad867SAlan Kao	fld f21, TASK_THREAD_F21_F0(a0)
93e68ad867SAlan Kao	fld f22, TASK_THREAD_F22_F0(a0)
94e68ad867SAlan Kao	fld f23, TASK_THREAD_F23_F0(a0)
95e68ad867SAlan Kao	fld f24, TASK_THREAD_F24_F0(a0)
96e68ad867SAlan Kao	fld f25, TASK_THREAD_F25_F0(a0)
97e68ad867SAlan Kao	fld f26, TASK_THREAD_F26_F0(a0)
98e68ad867SAlan Kao	fld f27, TASK_THREAD_F27_F0(a0)
99e68ad867SAlan Kao	fld f28, TASK_THREAD_F28_F0(a0)
100e68ad867SAlan Kao	fld f29, TASK_THREAD_F29_F0(a0)
101e68ad867SAlan Kao	fld f30, TASK_THREAD_F30_F0(a0)
102e68ad867SAlan Kao	fld f31, TASK_THREAD_F31_F0(a0)
103e68ad867SAlan Kao	fscsr t0
104*a4c3733dSChristoph Hellwig	csrc CSR_STATUS, t1
105e68ad867SAlan Kao	ret
106e68ad867SAlan KaoENDPROC(__fstate_restore)
107