summaryrefslogtreecommitdiffstats
path: root/cpukit/score/cpu/arm/armv7m-context-switch.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/score/cpu/arm/armv7m-context-switch.c')
-rw-r--r--cpukit/score/cpu/arm/armv7m-context-switch.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/cpukit/score/cpu/arm/armv7m-context-switch.c b/cpukit/score/cpu/arm/armv7m-context-switch.c
index eabf2c8272..359a1a7a9b 100644
--- a/cpukit/score/cpu/arm/armv7m-context-switch.c
+++ b/cpukit/score/cpu/arm/armv7m-context-switch.c
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2011 Sebastian Huber. All rights reserved.
+ * Copyright (c) 2011-2014 Sebastian Huber. All rights reserved.
*
* embedded brains GmbH
* Obere Lagerstr. 30
@@ -37,17 +37,26 @@ void __attribute__((naked)) _CPU_Context_switch(
"movt r2, #:upper16:_Per_CPU_Information\n"
"ldr r3, [r2, %[isrpcpuoff]]\n"
"stm r0, {r4-r11, lr}\n"
+#ifdef ARM_MULTILIB_VFP
+ "add r4, r0, %[d8off]\n"
+ "vstm r4, {d8-d15}\n"
+#endif
"str sp, [r0, %[spctxoff]]\n"
"str r3, [r0, %[isrctxoff]]\n"
"ldr r3, [r1, %[isrctxoff]]\n"
"ldr sp, [r1, %[spctxoff]]\n"
+#ifdef ARM_MULTILIB_VFP
+ "add r4, r1, %[d8off]\n"
+ "vldm r4, {d8-d15}\n"
+#endif
"ldm r1, {r4-r11, lr}\n"
"str r3, [r2, %[isrpcpuoff]]\n"
"bx lr\n"
:
: [spctxoff] "J" (offsetof(Context_Control, register_sp)),
[isrctxoff] "J" (offsetof(Context_Control, isr_nest_level)),
- [isrpcpuoff] "J" (offsetof(Per_CPU_Control, isr_nest_level))
+ [isrpcpuoff] "J" (offsetof(Per_CPU_Control, isr_nest_level)),
+ [d8off] "J" (ARM_CONTEXT_CONTROL_D8_OFFSET)
);
}