|
@@ -0,0 +1,106 @@
|
|
|
+/* 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 sstatus, 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 sstatus, 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 sstatus, 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 sstatus, t1
|
|
|
+ ret
|
|
|
+ENDPROC(__fstate_restore)
|