@@ -229,16 +229,23 @@ impl State {
229
229
pp_asm ! ( "
230
230
# Save the context of the previous task
231
231
#
232
- # [r0 = &running_task, r4-r11 = context, lr = EXC_RETURN]
232
+ # [r0 = &running_task, r4-r11 = context,
233
+ # s16-s31 = context, lr = EXC_RETURN]
233
234
#
234
235
# r1 = running_task
235
236
# if r1.is_some() {
236
- # r2 = psp as *u32 - 10
237
+ # let fpu_active = cfg!(has_fpu) && (lr & FType) == 0;
238
+ # r2 = psp as *u32 - if fpu_active { 26 } else { 10 }
237
239
# r1.port_task_state.sp = r2
238
240
#
239
241
# r2[0] = lr (EXC_RETURN)
240
242
# r2[1] = control
241
- # r2[2..10] = {r4-r11}
243
+ # r2 += 2;
244
+ # if fpu_active {
245
+ # r2[0..16] = {s16-s31}
246
+ # r2 += 16;
247
+ # }
248
+ # r2[0..8] = {r4-r11}
242
249
# }
243
250
#
244
251
# [r0 = &running_task]
@@ -252,7 +259,12 @@ impl State {
252
259
" } "
253
260
mrs r2, psp
254
261
mrs r3, control
255
- subs r2, #40
262
+ subs r2, #40 "
263
+ if cfg!( has_fpu) { "
264
+ tst lr, #0x10
265
+ it eq
266
+ subeq r2, #64
267
+ " } "
256
268
str r2, [r1] "
257
269
if cfg!( any( armv6m, armv8m_base) ) { "
258
270
mov r1, lr
@@ -264,8 +276,12 @@ impl State {
264
276
mov r7, r11
265
277
stmia r2!, {r4-r7}
266
278
" } else { "
267
- strd lr, r3, [r2], #8
268
- stmea r2, {r4-r11}
279
+ strd lr, r3, [r2], #8 "
280
+ if cfg!( has_fpu) { "
281
+ it eq
282
+ vstmiaeq r2!, {s16-s31}
283
+ " } "
284
+ stmia r2, {r4-r11}
269
285
" } "
270
286
271
287
# Choose the next task to run
@@ -284,8 +300,17 @@ impl State {
284
300
#
285
301
# lr = r2[0]
286
302
# control = r2[1]
287
- # {r4-r11} = r2[2..10]
288
- # psp = &r2[10]
303
+ # r2 += 2;
304
+ #
305
+ # let fpu_active = cfg!(has_fpu) && (lr & FType) == 0;
306
+ # if fpu_active {
307
+ # {s16-s31} = r2[0..16]
308
+ # r2 += 16;
309
+ # }
310
+ #
311
+ # {r4-r11} = r2[0..8]
312
+ # r2 += 8;
313
+ # psp = r2
289
314
# } else {
290
315
# // The idle task only uses r0-r3, so we can skip most steps
291
316
# // in this case
@@ -295,7 +320,7 @@ impl State {
295
320
# execution uses the Main Stack.” */
296
321
# }
297
322
#
298
- # [r4-r11 = context, lr = EXC_RETURN]
323
+ # [r4-r11 = context, s16-s31 = context, lr = EXC_RETURN]
299
324
300
325
ldr r1, [r0] "
301
326
if cfg!( armv6m) { "
@@ -316,7 +341,12 @@ impl State {
316
341
mov r10, r0
317
342
mov r11, r1
318
343
" } else { "
319
- ldrd lr, r3, [r2], #8
344
+ ldrd lr, r3, [r2], #8 "
345
+ if cfg!( has_fpu) { "
346
+ tst lr, #0x10
347
+ it eq
348
+ vldmiaeq r2!, {s16-s31}
349
+ " } "
320
350
ldmia r2!, {r4-r11}
321
351
" } "
322
352
msr control, r3
@@ -429,7 +459,6 @@ impl State {
429
459
// CONTROL: SPSEL = 1 (Use PSP)
430
460
extra_ctx[ 1 ] = MaybeUninit :: new ( 0x00000002 ) ;
431
461
// TODO: Secure context (Armv8-M)
432
- // TODO: Floating point registers
433
462
// TODO: PSPLIM
434
463
435
464
// R4-R11: Uninitialized
0 commit comments