diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-05-08 09:30:31 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-05-10 12:10:14 +0200 |
commit | cfd8d7a3d73a10ae7cdbbfe5eb39839c46a5c77e (patch) | |
tree | 5b694eb680b61129908a274b218d5f67fa0d34d6 /cpukit/score/cpu/arm/arm_exc_interrupt.S | |
parent | arm: Simplify architecture selection (diff) | |
download | rtems-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.S | 39 |
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} |