aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Kao <alankao@andestech.com>2018-10-08 22:18:30 -0400
committerPalmer Dabbelt <palmer@sifive.com>2018-10-22 20:02:22 -0400
commite68ad867f77e1a839ad496ffcbd88b9c96769b5b (patch)
tree927c07682cae899cd635236d24252a52099b2f67
parent84df9525b0c27f3ebc2ebb1864fa62a97fdedb7d (diff)
Extract FPU context operations from entry.S
We move __fstate_save and __fstate_restore to a new source file, fpu.S. Signed-off-by: Alan Kao <alankao@andestech.com> Cc: Greentime Hu <greentime@andestech.com> Cc: Vincent Chen <vincentc@andestech.com> Cc: Zong Li <zong@andestech.com> Cc: Nick Hu <nickhu@andestech.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Palmer Dabbelt <palmer@sifive.com>
-rw-r--r--arch/riscv/kernel/Makefile1
-rw-r--r--arch/riscv/kernel/entry.S87
-rw-r--r--arch/riscv/kernel/fpu.S106
3 files changed, 107 insertions, 87 deletions
diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile
index e1274fc03af4..bd433efd915e 100644
--- a/arch/riscv/kernel/Makefile
+++ b/arch/riscv/kernel/Makefile
@@ -13,6 +13,7 @@ extra-y += vmlinux.lds
13obj-y += cpu.o 13obj-y += cpu.o
14obj-y += cpufeature.o 14obj-y += cpufeature.o
15obj-y += entry.o 15obj-y += entry.o
16obj-y += fpu.o
16obj-y += irq.o 17obj-y += irq.o
17obj-y += process.o 18obj-y += process.o
18obj-y += ptrace.o 19obj-y += ptrace.o
diff --git a/arch/riscv/kernel/entry.S b/arch/riscv/kernel/entry.S
index fa2c08e3c05e..59c02e2bf739 100644
--- a/arch/riscv/kernel/entry.S
+++ b/arch/riscv/kernel/entry.S
@@ -357,93 +357,6 @@ ENTRY(__switch_to)
357 ret 357 ret
358ENDPROC(__switch_to) 358ENDPROC(__switch_to)
359 359
360ENTRY(__fstate_save)
361 li a2, TASK_THREAD_F0
362 add a0, a0, a2
363 li t1, SR_FS
364 csrs sstatus, t1
365 frcsr t0
366 fsd f0, TASK_THREAD_F0_F0(a0)
367 fsd f1, TASK_THREAD_F1_F0(a0)
368 fsd f2, TASK_THREAD_F2_F0(a0)
369 fsd f3, TASK_THREAD_F3_F0(a0)
370 fsd f4, TASK_THREAD_F4_F0(a0)
371 fsd f5, TASK_THREAD_F5_F0(a0)
372 fsd f6, TASK_THREAD_F6_F0(a0)
373 fsd f7, TASK_THREAD_F7_F0(a0)
374 fsd f8, TASK_THREAD_F8_F0(a0)
375 fsd f9, TASK_THREAD_F9_F0(a0)
376 fsd f10, TASK_THREAD_F10_F0(a0)
377 fsd f11, TASK_THREAD_F11_F0(a0)
378 fsd f12, TASK_THREAD_F12_F0(a0)
379 fsd f13, TASK_THREAD_F13_F0(a0)
380 fsd f14, TASK_THREAD_F14_F0(a0)
381 fsd f15, TASK_THREAD_F15_F0(a0)
382 fsd f16, TASK_THREAD_F16_F0(a0)
383 fsd f17, TASK_THREAD_F17_F0(a0)
384 fsd f18, TASK_THREAD_F18_F0(a0)
385 fsd f19, TASK_THREAD_F19_F0(a0)
386 fsd f20, TASK_THREAD_F20_F0(a0)
387 fsd f21, TASK_THREAD_F21_F0(a0)
388 fsd f22, TASK_THREAD_F22_F0(a0)
389 fsd f23, TASK_THREAD_F23_F0(a0)
390 fsd f24, TASK_THREAD_F24_F0(a0)
391 fsd f25, TASK_THREAD_F25_F0(a0)
392 fsd f26, TASK_THREAD_F26_F0(a0)
393 fsd f27, TASK_THREAD_F27_F0(a0)
394 fsd f28, TASK_THREAD_F28_F0(a0)
395 fsd f29, TASK_THREAD_F29_F0(a0)
396 fsd f30, TASK_THREAD_F30_F0(a0)
397 fsd f31, TASK_THREAD_F31_F0(a0)
398 sw t0, TASK_THREAD_FCSR_F0(a0)
399 csrc sstatus, t1
400 ret
401ENDPROC(__fstate_save)
402
403ENTRY(__fstate_restore)
404 li a2, TASK_THREAD_F0
405 add a0, a0, a2
406 li t1, SR_FS
407 lw t0, TASK_THREAD_FCSR_F0(a0)
408 csrs sstatus, t1
409 fld f0, TASK_THREAD_F0_F0(a0)
410 fld f1, TASK_THREAD_F1_F0(a0)
411 fld f2, TASK_THREAD_F2_F0(a0)
412 fld f3, TASK_THREAD_F3_F0(a0)
413 fld f4, TASK_THREAD_F4_F0(a0)
414 fld f5, TASK_THREAD_F5_F0(a0)
415 fld f6, TASK_THREAD_F6_F0(a0)
416 fld f7, TASK_THREAD_F7_F0(a0)
417 fld f8, TASK_THREAD_F8_F0(a0)
418 fld f9, TASK_THREAD_F9_F0(a0)
419 fld f10, TASK_THREAD_F10_F0(a0)
420 fld f11, TASK_THREAD_F11_F0(a0)
421 fld f12, TASK_THREAD_F12_F0(a0)
422 fld f13, TASK_THREAD_F13_F0(a0)
423 fld f14, TASK_THREAD_F14_F0(a0)
424 fld f15, TASK_THREAD_F15_F0(a0)
425 fld f16, TASK_THREAD_F16_F0(a0)
426 fld f17, TASK_THREAD_F17_F0(a0)
427 fld f18, TASK_THREAD_F18_F0(a0)
428 fld f19, TASK_THREAD_F19_F0(a0)
429 fld f20, TASK_THREAD_F20_F0(a0)
430 fld f21, TASK_THREAD_F21_F0(a0)
431 fld f22, TASK_THREAD_F22_F0(a0)
432 fld f23, TASK_THREAD_F23_F0(a0)
433 fld f24, TASK_THREAD_F24_F0(a0)
434 fld f25, TASK_THREAD_F25_F0(a0)
435 fld f26, TASK_THREAD_F26_F0(a0)
436 fld f27, TASK_THREAD_F27_F0(a0)
437 fld f28, TASK_THREAD_F28_F0(a0)
438 fld f29, TASK_THREAD_F29_F0(a0)
439 fld f30, TASK_THREAD_F30_F0(a0)
440 fld f31, TASK_THREAD_F31_F0(a0)
441 fscsr t0
442 csrc sstatus, t1
443 ret
444ENDPROC(__fstate_restore)
445
446
447 .section ".rodata" 360 .section ".rodata"
448 /* Exception vector table */ 361 /* Exception vector table */
449ENTRY(excp_vect_table) 362ENTRY(excp_vect_table)
diff --git a/arch/riscv/kernel/fpu.S b/arch/riscv/kernel/fpu.S
new file mode 100644
index 000000000000..1defb0618aff
--- /dev/null
+++ b/arch/riscv/kernel/fpu.S
@@ -0,0 +1,106 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright (C) 2012 Regents of the University of California
4 * Copyright (C) 2017 SiFive
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation, version 2.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 */
15
16#include <linux/linkage.h>
17
18#include <asm/asm.h>
19#include <asm/csr.h>
20#include <asm/asm-offsets.h>
21
22ENTRY(__fstate_save)
23 li a2, TASK_THREAD_F0
24 add a0, a0, a2
25 li t1, SR_FS
26 csrs sstatus, t1
27 frcsr t0
28 fsd f0, TASK_THREAD_F0_F0(a0)
29 fsd f1, TASK_THREAD_F1_F0(a0)
30 fsd f2, TASK_THREAD_F2_F0(a0)
31 fsd f3, TASK_THREAD_F3_F0(a0)
32 fsd f4, TASK_THREAD_F4_F0(a0)
33 fsd f5, TASK_THREAD_F5_F0(a0)
34 fsd f6, TASK_THREAD_F6_F0(a0)
35 fsd f7, TASK_THREAD_F7_F0(a0)
36 fsd f8, TASK_THREAD_F8_F0(a0)
37 fsd f9, TASK_THREAD_F9_F0(a0)
38 fsd f10, TASK_THREAD_F10_F0(a0)
39 fsd f11, TASK_THREAD_F11_F0(a0)
40 fsd f12, TASK_THREAD_F12_F0(a0)
41 fsd f13, TASK_THREAD_F13_F0(a0)
42 fsd f14, TASK_THREAD_F14_F0(a0)
43 fsd f15, TASK_THREAD_F15_F0(a0)
44 fsd f16, TASK_THREAD_F16_F0(a0)
45 fsd f17, TASK_THREAD_F17_F0(a0)
46 fsd f18, TASK_THREAD_F18_F0(a0)
47 fsd f19, TASK_THREAD_F19_F0(a0)
48 fsd f20, TASK_THREAD_F20_F0(a0)
49 fsd f21, TASK_THREAD_F21_F0(a0)
50 fsd f22, TASK_THREAD_F22_F0(a0)
51 fsd f23, TASK_THREAD_F23_F0(a0)
52 fsd f24, TASK_THREAD_F24_F0(a0)
53 fsd f25, TASK_THREAD_F25_F0(a0)
54 fsd f26, TASK_THREAD_F26_F0(a0)
55 fsd f27, TASK_THREAD_F27_F0(a0)
56 fsd f28, TASK_THREAD_F28_F0(a0)
57 fsd f29, TASK_THREAD_F29_F0(a0)
58 fsd f30, TASK_THREAD_F30_F0(a0)
59 fsd f31, TASK_THREAD_F31_F0(a0)
60 sw t0, TASK_THREAD_FCSR_F0(a0)
61 csrc sstatus, t1
62 ret
63ENDPROC(__fstate_save)
64
65ENTRY(__fstate_restore)
66 li a2, TASK_THREAD_F0
67 add a0, a0, a2
68 li t1, SR_FS
69 lw t0, TASK_THREAD_FCSR_F0(a0)
70 csrs sstatus, t1
71 fld f0, TASK_THREAD_F0_F0(a0)
72 fld f1, TASK_THREAD_F1_F0(a0)
73 fld f2, TASK_THREAD_F2_F0(a0)
74 fld f3, TASK_THREAD_F3_F0(a0)
75 fld f4, TASK_THREAD_F4_F0(a0)
76 fld f5, TASK_THREAD_F5_F0(a0)
77 fld f6, TASK_THREAD_F6_F0(a0)
78 fld f7, TASK_THREAD_F7_F0(a0)
79 fld f8, TASK_THREAD_F8_F0(a0)
80 fld f9, TASK_THREAD_F9_F0(a0)
81 fld f10, TASK_THREAD_F10_F0(a0)
82 fld f11, TASK_THREAD_F11_F0(a0)
83 fld f12, TASK_THREAD_F12_F0(a0)
84 fld f13, TASK_THREAD_F13_F0(a0)
85 fld f14, TASK_THREAD_F14_F0(a0)
86 fld f15, TASK_THREAD_F15_F0(a0)
87 fld f16, TASK_THREAD_F16_F0(a0)
88 fld f17, TASK_THREAD_F17_F0(a0)
89 fld f18, TASK_THREAD_F18_F0(a0)
90 fld f19, TASK_THREAD_F19_F0(a0)
91 fld f20, TASK_THREAD_F20_F0(a0)
92 fld f21, TASK_THREAD_F21_F0(a0)
93 fld f22, TASK_THREAD_F22_F0(a0)
94 fld f23, TASK_THREAD_F23_F0(a0)
95 fld f24, TASK_THREAD_F24_F0(a0)
96 fld f25, TASK_THREAD_F25_F0(a0)
97 fld f26, TASK_THREAD_F26_F0(a0)
98 fld f27, TASK_THREAD_F27_F0(a0)
99 fld f28, TASK_THREAD_F28_F0(a0)
100 fld f29, TASK_THREAD_F29_F0(a0)
101 fld f30, TASK_THREAD_F30_F0(a0)
102 fld f31, TASK_THREAD_F31_F0(a0)
103 fscsr t0
104 csrc sstatus, t1
105 ret
106ENDPROC(__fstate_restore)