diff options
author | Marc Zyngier <marc.zyngier@arm.com> | 2012-11-12 08:24:27 -0500 |
---|---|---|
committer | Catalin Marinas <catalin.marinas@arm.com> | 2012-12-05 06:26:50 -0500 |
commit | cfc5180e5a1b5f41f4936c4945a395f4d8885d66 (patch) | |
tree | c6a76b685652345861e43d86e20aa1925825eabe | |
parent | 7dbfbe5b2f5fc01fb0a19a0d58820ba4ebb07884 (diff) |
arm64: move FP-SIMD save/restore code to a macro
In order to be able to reuse the save-restore code in KVM, move
it to a pair of macros, similar to what the 32bit code does.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
-rw-r--r-- | arch/arm64/include/asm/fpsimdmacros.h | 64 | ||||
-rw-r--r-- | arch/arm64/kernel/entry-fpsimd.S | 43 |
2 files changed, 67 insertions, 40 deletions
diff --git a/arch/arm64/include/asm/fpsimdmacros.h b/arch/arm64/include/asm/fpsimdmacros.h new file mode 100644 index 000000000000..bbec599c96bd --- /dev/null +++ b/arch/arm64/include/asm/fpsimdmacros.h | |||
@@ -0,0 +1,64 @@ | |||
1 | /* | ||
2 | * FP/SIMD state saving and restoring macros | ||
3 | * | ||
4 | * Copyright (C) 2012 ARM Ltd. | ||
5 | * Author: Catalin Marinas <catalin.marinas@arm.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
18 | */ | ||
19 | |||
20 | .macro fpsimd_save state, tmpnr | ||
21 | stp q0, q1, [\state, #16 * 0] | ||
22 | stp q2, q3, [\state, #16 * 2] | ||
23 | stp q4, q5, [\state, #16 * 4] | ||
24 | stp q6, q7, [\state, #16 * 6] | ||
25 | stp q8, q9, [\state, #16 * 8] | ||
26 | stp q10, q11, [\state, #16 * 10] | ||
27 | stp q12, q13, [\state, #16 * 12] | ||
28 | stp q14, q15, [\state, #16 * 14] | ||
29 | stp q16, q17, [\state, #16 * 16] | ||
30 | stp q18, q19, [\state, #16 * 18] | ||
31 | stp q20, q21, [\state, #16 * 20] | ||
32 | stp q22, q23, [\state, #16 * 22] | ||
33 | stp q24, q25, [\state, #16 * 24] | ||
34 | stp q26, q27, [\state, #16 * 26] | ||
35 | stp q28, q29, [\state, #16 * 28] | ||
36 | stp q30, q31, [\state, #16 * 30]! | ||
37 | mrs x\tmpnr, fpsr | ||
38 | str w\tmpnr, [\state, #16 * 2] | ||
39 | mrs x\tmpnr, fpcr | ||
40 | str w\tmpnr, [\state, #16 * 2 + 4] | ||
41 | .endm | ||
42 | |||
43 | .macro fpsimd_restore state, tmpnr | ||
44 | ldp q0, q1, [\state, #16 * 0] | ||
45 | ldp q2, q3, [\state, #16 * 2] | ||
46 | ldp q4, q5, [\state, #16 * 4] | ||
47 | ldp q6, q7, [\state, #16 * 6] | ||
48 | ldp q8, q9, [\state, #16 * 8] | ||
49 | ldp q10, q11, [\state, #16 * 10] | ||
50 | ldp q12, q13, [\state, #16 * 12] | ||
51 | ldp q14, q15, [\state, #16 * 14] | ||
52 | ldp q16, q17, [\state, #16 * 16] | ||
53 | ldp q18, q19, [\state, #16 * 18] | ||
54 | ldp q20, q21, [\state, #16 * 20] | ||
55 | ldp q22, q23, [\state, #16 * 22] | ||
56 | ldp q24, q25, [\state, #16 * 24] | ||
57 | ldp q26, q27, [\state, #16 * 26] | ||
58 | ldp q28, q29, [\state, #16 * 28] | ||
59 | ldp q30, q31, [\state, #16 * 30]! | ||
60 | ldr w\tmpnr, [\state, #16 * 2] | ||
61 | msr fpsr, x\tmpnr | ||
62 | ldr w\tmpnr, [\state, #16 * 2 + 4] | ||
63 | msr fpcr, x\tmpnr | ||
64 | .endm | ||
diff --git a/arch/arm64/kernel/entry-fpsimd.S b/arch/arm64/kernel/entry-fpsimd.S index 17988a6e7ea2..6a27cd6dbfa6 100644 --- a/arch/arm64/kernel/entry-fpsimd.S +++ b/arch/arm64/kernel/entry-fpsimd.S | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/linkage.h> | 20 | #include <linux/linkage.h> |
21 | 21 | ||
22 | #include <asm/assembler.h> | 22 | #include <asm/assembler.h> |
23 | #include <asm/fpsimdmacros.h> | ||
23 | 24 | ||
24 | /* | 25 | /* |
25 | * Save the FP registers. | 26 | * Save the FP registers. |
@@ -27,26 +28,7 @@ | |||
27 | * x0 - pointer to struct fpsimd_state | 28 | * x0 - pointer to struct fpsimd_state |
28 | */ | 29 | */ |
29 | ENTRY(fpsimd_save_state) | 30 | ENTRY(fpsimd_save_state) |
30 | stp q0, q1, [x0, #16 * 0] | 31 | fpsimd_save x0, 8 |
31 | stp q2, q3, [x0, #16 * 2] | ||
32 | stp q4, q5, [x0, #16 * 4] | ||
33 | stp q6, q7, [x0, #16 * 6] | ||
34 | stp q8, q9, [x0, #16 * 8] | ||
35 | stp q10, q11, [x0, #16 * 10] | ||
36 | stp q12, q13, [x0, #16 * 12] | ||
37 | stp q14, q15, [x0, #16 * 14] | ||
38 | stp q16, q17, [x0, #16 * 16] | ||
39 | stp q18, q19, [x0, #16 * 18] | ||
40 | stp q20, q21, [x0, #16 * 20] | ||
41 | stp q22, q23, [x0, #16 * 22] | ||
42 | stp q24, q25, [x0, #16 * 24] | ||
43 | stp q26, q27, [x0, #16 * 26] | ||
44 | stp q28, q29, [x0, #16 * 28] | ||
45 | stp q30, q31, [x0, #16 * 30]! | ||
46 | mrs x8, fpsr | ||
47 | str w8, [x0, #16 * 2] | ||
48 | mrs x8, fpcr | ||
49 | str w8, [x0, #16 * 2 + 4] | ||
50 | ret | 32 | ret |
51 | ENDPROC(fpsimd_save_state) | 33 | ENDPROC(fpsimd_save_state) |
52 | 34 | ||
@@ -56,25 +38,6 @@ ENDPROC(fpsimd_save_state) | |||
56 | * x0 - pointer to struct fpsimd_state | 38 | * x0 - pointer to struct fpsimd_state |
57 | */ | 39 | */ |
58 | ENTRY(fpsimd_load_state) | 40 | ENTRY(fpsimd_load_state) |
59 | ldp q0, q1, [x0, #16 * 0] | 41 | fpsimd_restore x0, 8 |
60 | ldp q2, q3, [x0, #16 * 2] | ||
61 | ldp q4, q5, [x0, #16 * 4] | ||
62 | ldp q6, q7, [x0, #16 * 6] | ||
63 | ldp q8, q9, [x0, #16 * 8] | ||
64 | ldp q10, q11, [x0, #16 * 10] | ||
65 | ldp q12, q13, [x0, #16 * 12] | ||
66 | ldp q14, q15, [x0, #16 * 14] | ||
67 | ldp q16, q17, [x0, #16 * 16] | ||
68 | ldp q18, q19, [x0, #16 * 18] | ||
69 | ldp q20, q21, [x0, #16 * 20] | ||
70 | ldp q22, q23, [x0, #16 * 22] | ||
71 | ldp q24, q25, [x0, #16 * 24] | ||
72 | ldp q26, q27, [x0, #16 * 26] | ||
73 | ldp q28, q29, [x0, #16 * 28] | ||
74 | ldp q30, q31, [x0, #16 * 30]! | ||
75 | ldr w8, [x0, #16 * 2] | ||
76 | ldr w9, [x0, #16 * 2 + 4] | ||
77 | msr fpsr, x8 | ||
78 | msr fpcr, x9 | ||
79 | ret | 42 | ret |
80 | ENDPROC(fpsimd_load_state) | 43 | ENDPROC(fpsimd_load_state) |