From e7c51efc4afbb7652662afc4820504bb05c9d4bc Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Tue, 23 Jul 2013 19:09:17 -0600 Subject: ARMv7-N: Fix a copy error introduced in the previous check-in --- nuttx/arch/arm/src/armv7-a/arm_copyarmstate.c | 15 +++++++++++++++ nuttx/arch/arm/src/armv7-a/arm_restorefpu.S | 2 +- nuttx/arch/arm/src/armv7-a/arm_savefpu.S | 2 +- nuttx/arch/arm/src/armv7-m/Toolchain.defs | 26 +++++++++++++++++++------- nuttx/arch/arm/src/armv7-m/up_copyarmstate.c | 26 ++++++++++++++++++++++++-- nuttx/arch/arm/src/common/up_internal.h | 14 ++------------ 6 files changed, 62 insertions(+), 23 deletions(-) diff --git a/nuttx/arch/arm/src/armv7-a/arm_copyarmstate.c b/nuttx/arch/arm/src/armv7-a/arm_copyarmstate.c index 219d01a1e..5feebfee9 100644 --- a/nuttx/arch/arm/src/armv7-a/arm_copyarmstate.c +++ b/nuttx/arch/arm/src/armv7-a/arm_copyarmstate.c @@ -64,6 +64,11 @@ /**************************************************************************** * Name: up_copyarmstate + * + * Description: + * Copy the ARM portion of the register save area (omitting the floating + * point registers) and save the floating pointer register directly. + * ****************************************************************************/ /* A little faster than most memcpy's */ @@ -79,6 +84,16 @@ void up_copyarmstate(uint32_t *dest, uint32_t *src) if (src != dest) { + /* Save the floating point registers: This will initialize the floating + * registers at indices ARM_CONTEXT_REGS through (XCPTCONTEXT_REGS-1) + */ + + up_savefpu(dest); + + /* Then copy all of the ARM registers (mitting the floating point + * registers). Indices: 0 through (ARM_CONTEXT_REGS-1). + */ + for (i = 0; i < ARM_CONTEXT_REGS; i++) { *dest++ = *src++; diff --git a/nuttx/arch/arm/src/armv7-a/arm_restorefpu.S b/nuttx/arch/arm/src/armv7-a/arm_restorefpu.S index 0d9a64066..b138ee979 100644 --- a/nuttx/arch/arm/src/armv7-a/arm_restorefpu.S +++ b/nuttx/arch/arm/src/armv7-a/arm_restorefpu.S @@ -78,7 +78,7 @@ * Returned Value: * This function does not return anything explicitly. However, it is called from * interrupt level assembly logic that assumes that r0 is preserved. - * + * ************************************************************************************/ .globl up_restorefpu diff --git a/nuttx/arch/arm/src/armv7-a/arm_savefpu.S b/nuttx/arch/arm/src/armv7-a/arm_savefpu.S index 742db7848..df6ba65c6 100644 --- a/nuttx/arch/arm/src/armv7-a/arm_savefpu.S +++ b/nuttx/arch/arm/src/armv7-a/arm_savefpu.S @@ -77,7 +77,7 @@ * * Returned Value: * None - * + * ************************************************************************************/ .globl up_savefpu diff --git a/nuttx/arch/arm/src/armv7-m/Toolchain.defs b/nuttx/arch/arm/src/armv7-m/Toolchain.defs index ec8988a2d..f129c1913 100644 --- a/nuttx/arch/arm/src/armv7-m/Toolchain.defs +++ b/nuttx/arch/arm/src/armv7-m/Toolchain.defs @@ -157,9 +157,7 @@ endif ifeq ($(CONFIG_ARMV7M_TOOLCHAIN),ATOLLIC) CROSSDEV ?= arm-atollic-eabi- ARCROSSDEV ?= arm-atollic-eabi- - ifneq ($(CONFIG_WINDOWS_NATIVE),y) - WINTOOL = y - endif + MAXOPTIMIZATION = -Os ifeq ($(CONFIG_ARCH_CORTEXM4),y) ifeq ($(CONFIG_ARCH_FPU),y) ARCHCPUFLAGS = -mcpu=cortex-m4 -mthumb -march=armv7e-m -mfpu=fpv4-sp-d16 -mfloat-abi=hard @@ -169,6 +167,9 @@ ifeq ($(CONFIG_ARMV7M_TOOLCHAIN),ATOLLIC) else ifeq ($(CONFIG_ARCH_CORTEXM3),y) ARCHCPUFLAGS = -mcpu=cortex-m3 -mthumb -mfloat-abi=soft endif + ifneq ($(CONFIG_WINDOWS_NATIVE),y) + WINTOOL = y + endif endif # NuttX buildroot under Linux or Cygwin @@ -191,6 +192,7 @@ endif ifeq ($(CONFIG_ARMV7M_TOOLCHAIN),CODEREDL) CROSSDEV ?= arm-none-eabi- ARCROSSDEV ?= arm-none-eabi- + MAXOPTIMIZATION = -Os ifeq ($(CONFIG_ARCH_CORTEXM4),y) ifeq ($(CONFIG_ARCH_FPU),y) ARCHCPUFLAGS = -mcpu=cortex-m4 -mthumb -march=armv7e-m -mfpu=fpv4-sp-d16 -mfloat-abi=hard @@ -207,9 +209,7 @@ endif ifeq ($(CONFIG_ARMV7M_TOOLCHAIN),CODEREDW) CROSSDEV ?= arm-none-eabi- ARCROSSDEV ?= arm-none-eabi- - ifneq ($(CONFIG_WINDOWS_NATIVE),y) - WINTOOL = y - endif + MAXOPTIMIZATION = -Os ifeq ($(CONFIG_ARCH_CORTEXM4),y) ifeq ($(CONFIG_ARCH_FPU),y) ARCHCPUFLAGS = -mcpu=cortex-m4 -mthumb -march=armv7e-m -mfpu=fpv4-sp-d16 -mfloat-abi=hard @@ -219,6 +219,9 @@ ifeq ($(CONFIG_ARMV7M_TOOLCHAIN),CODEREDW) else ifeq ($(CONFIG_ARCH_CORTEXM3),y) ARCHCPUFLAGS = -mcpu=cortex-m3 -mthumb -mfloat-abi=soft endif + ifneq ($(CONFIG_WINDOWS_NATIVE),y) + WINTOOL = y + endif endif # CodeSourcery under Linux @@ -235,10 +238,19 @@ endif ifeq ($(CONFIG_ARMV7M_TOOLCHAIN),CODESOURCERYW) CROSSDEV ?= arm-none-eabi- ARCROSSDEV ?= arm-none-eabi- + MAXOPTIMIZATION = -Os + ifeq ($(CONFIG_ARCH_CORTEXM4),y) + ifeq ($(CONFIG_ARCH_FPU),y) + ARCHCPUFLAGS = -mcpu=cortex-m4 -mthumb -march=armv7e-m -mfpu=fpv4-sp-d16 -mfloat-abi=hard + else + ARCHCPUFLAGS = -mcpu=cortex-m4 -mthumb -march=armv7e-m -mfloat-abi=soft + endif + else ifeq ($(CONFIG_ARCH_CORTEXM3),y) + ARCHCPUFLAGS = -mcpu=cortex-m3 -mthumb -mfloat-abi=soft + endif ifneq ($(CONFIG_WINDOWS_NATIVE),y) WINTOOL = y endif - ARCHCPUFLAGS = -mcpu=cortex-m3 -mthumb -mfloat-abi=soft endif # devkitARM under Windows diff --git a/nuttx/arch/arm/src/armv7-m/up_copyarmstate.c b/nuttx/arch/arm/src/armv7-m/up_copyarmstate.c index 94716939f..32c7fce06 100644 --- a/nuttx/arch/arm/src/armv7-m/up_copyarmstate.c +++ b/nuttx/arch/arm/src/armv7-m/up_copyarmstate.c @@ -67,8 +67,7 @@ * * Description: * Copy the ARM portion of the register save area (omitting the floating - * point registers). This is a little faster than most memcpy's since it - * does 32-bit transfers. + * point registers) and save the floating pointer register directly. * ****************************************************************************/ @@ -83,10 +82,33 @@ void up_copyarmstate(uint32_t *dest, uint32_t *src) if (src != dest) { + /* Save the floating point registers: This will initialize the floating + * registers at indices SW_INT_REGS through (SW_INT_REGS+SW_FPU_REGS-1) + */ + + up_savefpu(dest); + + /* Save the block of ARM registers that were saved by the interrupt + * handling logic. Indices: 0 through (SW_INT_REGS-1). + */ + for (i = 0; i < SW_INT_REGS; i++) { *dest++ = *src++; } + + /* Skip over the floating point registers and save the block of ARM + * registers that were saved by the hardware when the interrupt was + * taken. Indices: (SW_INT_REGS+SW_FPU_REGS) through (HW_XCPT_REGS-1) + */ + + src += SW_FPU_REGS; + dest += SW_FPU_REGS; + + for (i = 0; i < HW_XCPT_REGS; i++) + { + *dest++ = *src++; + } } } diff --git a/nuttx/arch/arm/src/common/up_internal.h b/nuttx/arch/arm/src/common/up_internal.h index 86e49004c..495b51b24 100644 --- a/nuttx/arch/arm/src/common/up_internal.h +++ b/nuttx/arch/arm/src/common/up_internal.h @@ -128,12 +128,7 @@ */ # if defined(CONFIG_ARCH_FPU) && !defined(CONFIG_ARMV7M_CMNVECTOR) -# define up_savestate(regs) \ - do { \ - up_copyarmstate(regs, (uint32_t*)current_regs); \ - up_savefpu(regs); \ - } \ - while (0) +# define up_savestate(regs) up_copyarmstate(regs, (uint32_t*)current_regs) # else # define up_savestate(regs) up_copyfullstate(regs, (uint32_t*)current_regs) # endif @@ -151,12 +146,7 @@ */ # if defined(CONFIG_ARCH_FPU) -# define up_savestate(regs) \ - do { \ - up_copyarmstate(regs, (uint32_t*)current_regs); \ - up_savefpu(regs); \ - } \ - while (0) +# define up_savestate(regs) up_copyarmstate(regs, (uint32_t*)current_regs) # else # define up_savestate(regs) up_copyfullstate(regs, (uint32_t*)current_regs) # endif -- cgit v1.2.3