7
7
8
8
#include <zephyr/toolchain.h>
9
9
#include <zephyr/linker/sections.h>
10
+ #include <zephyr/offsets.h>
10
11
11
12
_ASM_FILE_PROLOGUE
12
13
13
14
GTEXT(z_arm64_fpu_save)
14
15
SECTION_FUNC(TEXT , z_arm64_fpu_save)
15
16
17
+ mrs x1 , fpsr
18
+ mrs x2 , fpcr
19
+ str w1 , [ x0 , #__z_arm64_fp_context_fpsr_OFFSET ]
20
+ str w2 , [ x0 , #__z_arm64_fp_context_fpcr_OFFSET ]
21
+
22
+ / * Save NEON registers * /
23
+ add x0 , x0 , #__z_arm64_fp_context_neon_OFFSET
16
24
stp q0 , q1 , [ x0 , #( 16 * 0 ) ]
17
25
stp q2 , q3 , [ x0 , #( 16 * 2 ) ]
18
26
stp q4 , q5 , [ x0 , #( 16 * 4 ) ]
@@ -30,16 +38,18 @@ SECTION_FUNC(TEXT, z_arm64_fpu_save)
30
38
stp q28 , q29 , [ x0 , #( 16 * 28 ) ]
31
39
stp q30 , q31 , [ x0 , #( 16 * 30 ) ]
32
40
33
- mrs x1, fpsr
34
- mrs x2, fpcr
35
- str w1, [x0, #(16 * 32 + 0)]
36
- str w2, [x0, #(16 * 32 + 4)]
37
-
38
41
ret
39
42
40
43
GTEXT(z_arm64_fpu_restore)
41
44
SECTION_FUNC(TEXT , z_arm64_fpu_restore)
42
45
46
+ ldr w1 , [ x0 , #__z_arm64_fp_context_fpsr_OFFSET ]
47
+ ldr w2 , [ x0 , #__z_arm64_fp_context_fpcr_OFFSET ]
48
+ msr fpsr , x1
49
+ msr fpcr , x2
50
+
51
+ / * Restore NEON registers * /
52
+ add x0 , x0 , #__z_arm64_fp_context_neon_OFFSET
43
53
ldp q0 , q1 , [ x0 , #( 16 * 0 ) ]
44
54
ldp q2 , q3 , [ x0 , #( 16 * 2 ) ]
45
55
ldp q4 , q5 , [ x0 , #( 16 * 4 ) ]
@@ -57,9 +67,164 @@ SECTION_FUNC(TEXT, z_arm64_fpu_restore)
57
67
ldp q28 , q29 , [ x0 , #( 16 * 28 ) ]
58
68
ldp q30 , q31 , [ x0 , #( 16 * 30 ) ]
59
69
60
- ldr w1, [x0, #(16 * 32 + 0)]
61
- ldr w2, [x0, #(16 * 32 + 4)]
62
- msr fpsr, x1
63
- msr fpcr, x2
70
+ ret
71
+
72
+ #ifdef CONFIG_ARM64_SVE
73
+
74
+ GTEXT(z_arm64_sve_save)
75
+ SECTION_FUNC(TEXT , z_arm64_sve_save)
76
+
77
+ / * Save control registers * /
78
+ mrs x2 , fpsr
79
+ mrs x3 , fpcr
80
+ str w2 , [ x0 , #__z_arm64_fp_context_fpsr_OFFSET ]
81
+ str w3 , [ x0 , #__z_arm64_fp_context_fpcr_OFFSET ]
82
+
83
+ / * Get Z registers base address * /
84
+ add x2 , x0 , #__z_arm64_fp_context_sve_z_regs_OFFSET
85
+
86
+ / * Save Z registers * /
87
+ str z0 , [ x2 , # 0 , MUL VL ]
88
+ str z1 , [ x2 , # 1 , MUL VL ]
89
+ str z2 , [ x2 , # 2 , MUL VL ]
90
+ str z3 , [ x2 , # 3 , MUL VL ]
91
+ str z4 , [ x2 , # 4 , MUL VL ]
92
+ str z5 , [ x2 , # 5 , MUL VL ]
93
+ str z6 , [ x2 , # 6 , MUL VL ]
94
+ str z7 , [ x2 , # 7 , MUL VL ]
95
+ str z8 , [ x2 , # 8 , MUL VL ]
96
+ str z9 , [ x2 , # 9 , MUL VL ]
97
+ str z10 , [ x2 , # 10 , MUL VL ]
98
+ str z11 , [ x2 , # 11 , MUL VL ]
99
+ str z12 , [ x2 , # 12 , MUL VL ]
100
+ str z13 , [ x2 , # 13 , MUL VL ]
101
+ str z14 , [ x2 , # 14 , MUL VL ]
102
+ str z15 , [ x2 , # 15 , MUL VL ]
103
+ str z16 , [ x2 , # 16 , MUL VL ]
104
+ str z17 , [ x2 , # 17 , MUL VL ]
105
+ str z18 , [ x2 , # 18 , MUL VL ]
106
+ str z19 , [ x2 , # 19 , MUL VL ]
107
+ str z20 , [ x2 , # 20 , MUL VL ]
108
+ str z21 , [ x2 , # 21 , MUL VL ]
109
+ str z22 , [ x2 , # 22 , MUL VL ]
110
+ str z23 , [ x2 , # 23 , MUL VL ]
111
+ str z24 , [ x2 , # 24 , MUL VL ]
112
+ str z25 , [ x2 , # 25 , MUL VL ]
113
+ str z26 , [ x2 , # 26 , MUL VL ]
114
+ str z27 , [ x2 , # 27 , MUL VL ]
115
+ str z28 , [ x2 , # 28 , MUL VL ]
116
+ str z29 , [ x2 , # 29 , MUL VL ]
117
+ str z30 , [ x2 , # 30 , MUL VL ]
118
+ str z31 , [ x2 , # 31 , MUL VL ]
119
+
120
+ / * Get P registers base address * /
121
+ mov x3 , #__z_arm64_fp_context_sve_p_regs_OFFSET
122
+ add x3 , x0 , x3
123
+
124
+ / * Save P registers * /
125
+ str p0 , [ x3 , # 0 , MUL VL ]
126
+ str p1 , [ x3 , # 1 , MUL VL ]
127
+ str p2 , [ x3 , # 2 , MUL VL ]
128
+ str p3 , [ x3 , # 3 , MUL VL ]
129
+ str p4 , [ x3 , # 4 , MUL VL ]
130
+ str p5 , [ x3 , # 5 , MUL VL ]
131
+ str p6 , [ x3 , # 6 , MUL VL ]
132
+ str p7 , [ x3 , # 7 , MUL VL ]
133
+ str p8 , [ x3 , # 8 , MUL VL ]
134
+ str p9 , [ x3 , # 9 , MUL VL ]
135
+ str p10 , [ x3 , # 10 , MUL VL ]
136
+ str p11 , [ x3 , # 11 , MUL VL ]
137
+ str p12 , [ x3 , # 12 , MUL VL ]
138
+ str p13 , [ x3 , # 13 , MUL VL ]
139
+ str p14 , [ x3 , # 14 , MUL VL ]
140
+ str p15 , [ x3 , # 15 , MUL VL ]
141
+
142
+ / * Get FFR base address * /
143
+ mov x4 , #__z_arm64_fp_context_sve_ffr_OFFSET
144
+ add x4 , x0 , x4
145
+
146
+ / * Save FFR * /
147
+ rdffr p0.b
148
+ str p0 , [ x4 ]
149
+
150
+ ret
151
+
152
+ GTEXT(z_arm64_sve_restore)
153
+ SECTION_FUNC(TEXT , z_arm64_sve_restore)
154
+
155
+ / * Get Z registers base address * /
156
+ add x2 , x0 , #__z_arm64_fp_context_sve_z_regs_OFFSET
157
+
158
+ / * Restore Z registers * /
159
+ ldr z0 , [ x2 , # 0 , MUL VL ]
160
+ ldr z1 , [ x2 , # 1 , MUL VL ]
161
+ ldr z2 , [ x2 , # 2 , MUL VL ]
162
+ ldr z3 , [ x2 , # 3 , MUL VL ]
163
+ ldr z4 , [ x2 , # 4 , MUL VL ]
164
+ ldr z5 , [ x2 , # 5 , MUL VL ]
165
+ ldr z6 , [ x2 , # 6 , MUL VL ]
166
+ ldr z7 , [ x2 , # 7 , MUL VL ]
167
+ ldr z8 , [ x2 , # 8 , MUL VL ]
168
+ ldr z9 , [ x2 , # 9 , MUL VL ]
169
+ ldr z10 , [ x2 , # 10 , MUL VL ]
170
+ ldr z11 , [ x2 , # 11 , MUL VL ]
171
+ ldr z12 , [ x2 , # 12 , MUL VL ]
172
+ ldr z13 , [ x2 , # 13 , MUL VL ]
173
+ ldr z14 , [ x2 , # 14 , MUL VL ]
174
+ ldr z15 , [ x2 , # 15 , MUL VL ]
175
+ ldr z16 , [ x2 , # 16 , MUL VL ]
176
+ ldr z17 , [ x2 , # 17 , MUL VL ]
177
+ ldr z18 , [ x2 , # 18 , MUL VL ]
178
+ ldr z19 , [ x2 , # 19 , MUL VL ]
179
+ ldr z20 , [ x2 , # 20 , MUL VL ]
180
+ ldr z21 , [ x2 , # 21 , MUL VL ]
181
+ ldr z22 , [ x2 , # 22 , MUL VL ]
182
+ ldr z23 , [ x2 , # 23 , MUL VL ]
183
+ ldr z24 , [ x2 , # 24 , MUL VL ]
184
+ ldr z25 , [ x2 , # 25 , MUL VL ]
185
+ ldr z26 , [ x2 , # 26 , MUL VL ]
186
+ ldr z27 , [ x2 , # 27 , MUL VL ]
187
+ ldr z28 , [ x2 , # 28 , MUL VL ]
188
+ ldr z29 , [ x2 , # 29 , MUL VL ]
189
+ ldr z30 , [ x2 , # 30 , MUL VL ]
190
+ ldr z31 , [ x2 , # 31 , MUL VL ]
191
+
192
+ / * Get FFR base address * /
193
+ mov x4 , #__z_arm64_fp_context_sve_ffr_OFFSET
194
+ add x4 , x0 , x4
195
+
196
+ / * Restore FFR * /
197
+ ldr p0 , [ x4 ]
198
+ wrffr p0.b
199
+
200
+ / * Get P registers base address * /
201
+ mov x3 , #__z_arm64_fp_context_sve_p_regs_OFFSET
202
+ add x3 , x0 , x3
203
+
204
+ / * Restore P registers intervals * /
205
+ ldr p0 , [ x3 , # 0 , MUL VL ]
206
+ ldr p1 , [ x3 , # 1 , MUL VL ]
207
+ ldr p2 , [ x3 , # 2 , MUL VL ]
208
+ ldr p3 , [ x3 , # 3 , MUL VL ]
209
+ ldr p4 , [ x3 , # 4 , MUL VL ]
210
+ ldr p5 , [ x3 , # 5 , MUL VL ]
211
+ ldr p6 , [ x3 , # 6 , MUL VL ]
212
+ ldr p7 , [ x3 , # 7 , MUL VL ]
213
+ ldr p8 , [ x3 , # 8 , MUL VL ]
214
+ ldr p9 , [ x3 , # 9 , MUL VL ]
215
+ ldr p10 , [ x3 , # 10 , MUL VL ]
216
+ ldr p11 , [ x3 , # 11 , MUL VL ]
217
+ ldr p12 , [ x3 , # 12 , MUL VL ]
218
+ ldr p13 , [ x3 , # 13 , MUL VL ]
219
+ ldr p14 , [ x3 , # 14 , MUL VL ]
220
+ ldr p15 , [ x3 , # 15 , MUL VL ]
221
+
222
+ / * Restore control registers * /
223
+ ldr w2 , [ x0 , #__z_arm64_fp_context_fpsr_OFFSET ]
224
+ ldr w3 , [ x0 , #__z_arm64_fp_context_fpcr_OFFSET ]
225
+ msr fpsr , x2
226
+ msr fpcr , x3
64
227
65
228
ret
229
+
230
+ #endif / * CONFIG_ARM64_SVE * /
0 commit comments