summaryrefslogtreecommitdiffstats
path: root/cpukit/score/cpu/arm/arm_exc_interrupt.S
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-05-08 09:30:31 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-05-10 12:10:14 +0200
commitcfd8d7a3d73a10ae7cdbbfe5eb39839c46a5c77e (patch)
tree5b694eb680b61129908a274b218d5f67fa0d34d6 /cpukit/score/cpu/arm/arm_exc_interrupt.S
parentarm: Simplify architecture selection (diff)
downloadrtems-cfd8d7a3d73a10ae7cdbbfe5eb39839c46a5c77e.tar.bz2
arm: Support VFP-D32 and Neon
Diffstat (limited to 'cpukit/score/cpu/arm/arm_exc_interrupt.S')
-rw-r--r--cpukit/score/cpu/arm/arm_exc_interrupt.S39
1 files changed, 33 insertions, 6 deletions
diff --git a/cpukit/score/cpu/arm/arm_exc_interrupt.S b/cpukit/score/cpu/arm/arm_exc_interrupt.S
index 82f3007f5c..a1363e571e 100644
--- a/cpukit/score/cpu/arm/arm_exc_interrupt.S
+++ b/cpukit/score/cpu/arm/arm_exc_interrupt.S
@@ -7,12 +7,13 @@
*/
/*
- * Copyright (c) 2009
- * embedded brains GmbH
- * Obere Lagerstr. 30
- * D-82178 Puchheim
- * Germany
- * <rtems@embedded-brains.de>
+ * Copyright (c) 2009-2013 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
@@ -45,6 +46,10 @@
#define CONTEXT_LIST {r0, r1, r2, r3, EXCHANGE_LR, EXCHANGE_SPSR, r12}
#define CONTEXT_SIZE 28
+#ifdef ARM_MULTILIB_VFP_D32
+ #define VFP_CONTEXT_WITH_ALIGNMENT_SPACE (24 * 8 + 4 + 4)
+#endif
+
.extern _Thread_Dispatch_disable_level
.extern bsp_interrupt_dispatch
@@ -74,6 +79,17 @@ _ARMV4_Exception_interrupt:
stmdb sp!, CONTEXT_LIST
stmdb sp!, {lr}
+#ifdef ARM_MULTILIB_VFP_D32
+ /* Save VFP context */
+ sub sp, #VFP_CONTEXT_WITH_ALIGNMENT_SPACE
+ add r1, sp, #4
+ vmrs r0, FPSCR
+ bic r1, r1, #7
+ vstmia r1!, {d0-d7}
+ vstmia r1!, {d16-d31}
+ str r0, [r1]
+#endif
+
/* Remember INT stack pointer */
mov r1, EXCHANGE_INT_SP
@@ -144,6 +160,17 @@ thread_dispatch_done:
/* Switch to ARM instructions if necessary */
SWITCH_FROM_THUMB_TO_ARM
+#ifdef ARM_MULTILIB_VFP_D32
+ /* Restore VFP context */
+ add r1, sp, #4
+ bic r1, r1, #7
+ vldmia r1!, {d0-d7}
+ vldmia r1!, {d16-d31}
+ ldr r0, [r1]
+ add sp, #VFP_CONTEXT_WITH_ALIGNMENT_SPACE
+ vmsr FPSCR, r0
+#endif
+
/* Restore link register */
ldmia sp!, {lr}