diff options
author | Alan Kao <alankao@andestech.com> | 2018-10-08 22:18:30 -0400 |
---|---|---|
committer | Palmer Dabbelt <palmer@sifive.com> | 2018-10-22 20:02:22 -0400 |
commit | e68ad867f77e1a839ad496ffcbd88b9c96769b5b (patch) | |
tree | 927c07682cae899cd635236d24252a52099b2f67 | |
parent | 84df9525b0c27f3ebc2ebb1864fa62a97fdedb7d (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/Makefile | 1 | ||||
-rw-r--r-- | arch/riscv/kernel/entry.S | 87 | ||||
-rw-r--r-- | arch/riscv/kernel/fpu.S | 106 |
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 | |||
13 | obj-y += cpu.o | 13 | obj-y += cpu.o |
14 | obj-y += cpufeature.o | 14 | obj-y += cpufeature.o |
15 | obj-y += entry.o | 15 | obj-y += entry.o |
16 | obj-y += fpu.o | ||
16 | obj-y += irq.o | 17 | obj-y += irq.o |
17 | obj-y += process.o | 18 | obj-y += process.o |
18 | obj-y += ptrace.o | 19 | obj-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 |
358 | ENDPROC(__switch_to) | 358 | ENDPROC(__switch_to) |
359 | 359 | ||
360 | ENTRY(__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 | ||
401 | ENDPROC(__fstate_save) | ||
402 | |||
403 | ENTRY(__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 | ||
444 | ENDPROC(__fstate_restore) | ||
445 | |||
446 | |||
447 | .section ".rodata" | 360 | .section ".rodata" |
448 | /* Exception vector table */ | 361 | /* Exception vector table */ |
449 | ENTRY(excp_vect_table) | 362 | ENTRY(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 | |||
22 | ENTRY(__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 | ||
63 | ENDPROC(__fstate_save) | ||
64 | |||
65 | ENTRY(__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 | ||
106 | ENDPROC(__fstate_restore) | ||