From 5e61c80327325e9086b56235a46452d79968c58c Mon Sep 17 00:00:00 2001 From: Thomas Doerfler Date: Fri, 18 Sep 2009 08:07:23 +0000 Subject: * rtems/score/cpu.h: Fix for inline asm in _CPU_Fatal_halt(). * rtems/asm.h: Added macro to define ARM functions. * cpu_asm.S, arm_exc_handler_low.S: Use macro from above. --- cpukit/score/cpu/arm/ChangeLog | 6 ++++++ cpukit/score/cpu/arm/arm_exc_handler_low.S | 24 +++--------------------- cpukit/score/cpu/arm/cpu_asm.S | 22 ++-------------------- cpukit/score/cpu/arm/rtems/asm.h | 9 +++++++++ cpukit/score/cpu/arm/rtems/score/cpu.h | 5 +++-- 5 files changed, 23 insertions(+), 43 deletions(-) (limited to 'cpukit') diff --git a/cpukit/score/cpu/arm/ChangeLog b/cpukit/score/cpu/arm/ChangeLog index 591cb2b4ff..481089a0d5 100644 --- a/cpukit/score/cpu/arm/ChangeLog +++ b/cpukit/score/cpu/arm/ChangeLog @@ -1,3 +1,9 @@ +2009-09-15 Sebastian Huber + + * rtems/score/cpu.h: Fix for inline asm in _CPU_Fatal_halt(). + * rtems/asm.h: Added macro to define ARM functions. + * cpu_asm.S, arm_exc_handler_low.S: Use macro from above. + 2009-08-19 Joel Sherrill * rtems/score/cpu.h: Mark _CPU_Context_restore() as noreturn so the diff --git a/cpukit/score/cpu/arm/arm_exc_handler_low.S b/cpukit/score/cpu/arm/arm_exc_handler_low.S index b333ef5d6a..26b75cb435 100644 --- a/cpukit/score/cpu/arm/arm_exc_handler_low.S +++ b/cpukit/score/cpu/arm/arm_exc_handler_low.S @@ -27,28 +27,10 @@ #include #include -/* - * function declaration macro (start body in ARM mode) - */ -#ifdef __thumb__ - #define FUNC_START_ARM(_name_) \ - .code 16 ;\ - .thumb_func ;\ - .globl _name_ ;\ -_name_: ;\ - bx pc ;\ - .code 32 ;\ -_name_ ## _ARM: -#else - #define FUNC_START_ARM(_name_) \ - .globl _name_; \ -_name_: -#endif - .text /* FIXME: _Exception_Handler_Undef_Swi is untested */ -FUNC_START_ARM(_Exception_Handler_Undef_Swi) +DEFINE_FUNCTION_ARM(_Exception_Handler_Undef_Swi) /* FIXME: This should use load and store multiple instructions */ sub r13,r13,#SIZE_REGS str r4, [r13, #REG_R4] @@ -84,7 +66,7 @@ _go_back_1: movs pc,r14 /* return */ /* FIXME: _Exception_Handler_Abort is untested */ -FUNC_START_ARM(_Exception_Handler_Abort) +DEFINE_FUNCTION_ARM(_Exception_Handler_Abort) /* FIXME: This should use load and store multiple instructions */ sub r13,r13,#SIZE_REGS str r4, [r13, #REG_R4] @@ -127,7 +109,7 @@ _go_back_2: #define ABORT_REGS_OFFS 32-REG_R4 #define ABORT_SIZE_REGS SIZE_REGS+ABORT_REGS_OFFS -FUNC_START_ARM(_exc_data_abort) +DEFINE_FUNCTION_ARM(_exc_data_abort) sub sp, sp, #ABORT_SIZE_REGS /* reserve register frame */ stmia sp, {r0-r11} add sp, sp, #ABORT_REGS_OFFS /* the Context_Control structure starts by CPSR, R4, ... */ diff --git a/cpukit/score/cpu/arm/cpu_asm.S b/cpukit/score/cpu/arm/cpu_asm.S index 91654fa4bb..2c0ed16e79 100644 --- a/cpukit/score/cpu/arm/cpu_asm.S +++ b/cpukit/score/cpu/arm/cpu_asm.S @@ -22,24 +22,6 @@ #include #include -/* - * function declaration macro (start body in ARM mode) - */ -#ifdef __thumb__ - #define FUNC_START_ARM(_name_) \ - .code 16 ;\ - .thumb_func ;\ - .globl _name_ ;\ -_name_: ;\ - bx pc ;\ - .code 32 ;\ -_name_ ## _ARM: -#else - #define FUNC_START_ARM(_name_) \ - .globl _name_; \ -_name_: -#endif - .text /* @@ -58,7 +40,7 @@ _name_: * */ -FUNC_START_ARM(_CPU_Context_switch) +DEFINE_FUNCTION_ARM(_CPU_Context_switch) /* Start saving context */ mrs r2, cpsr stmia r0, {r2, r4, r5, r6, r7, r8, r9, r10, r11, r13, r14} @@ -81,6 +63,6 @@ _restore: * It must match _CPU_Context_switch() * */ -FUNC_START_ARM(_CPU_Context_restore) +DEFINE_FUNCTION_ARM(_CPU_Context_restore) mov r1, r0 b _restore diff --git a/cpukit/score/cpu/arm/rtems/asm.h b/cpukit/score/cpu/arm/rtems/asm.h index bbb9760156..176ac064ee 100644 --- a/cpukit/score/cpu/arm/rtems/asm.h +++ b/cpukit/score/cpu/arm/rtems/asm.h @@ -132,4 +132,13 @@ #define PUBLIC(sym) .globl SYM (sym) #define EXTERN(sym) .globl SYM (sym) +#ifdef __thumb__ + #define DEFINE_FUNCTION_ARM(name) \ + .thumb_func ; .globl name ; name: ; bx pc ; \ + .arm ; .globl name ## _arm ; name ## _arm: +#else + #define DEFINE_FUNCTION_ARM(name) \ + .globl name ; name: ; .globl name ## _arm ; name ## _arm: #endif + +#endif /* _RTEMS_ASM_H */ diff --git a/cpukit/score/cpu/arm/rtems/score/cpu.h b/cpukit/score/cpu/arm/rtems/score/cpu.h index 084b41a603..d7eca1527c 100644 --- a/cpukit/score/cpu/arm/rtems/score/cpu.h +++ b/cpukit/score/cpu/arm/rtems/score/cpu.h @@ -336,9 +336,10 @@ void _CPU_Context_Initialize( *(*(_destination)) = _CPU_Null_fp_context; \ } while (0) -#define _CPU_Fatal_halt( _error ) \ +#define _CPU_Fatal_halt( _err ) \ do { \ - int _level; \ + uint32_t _level; \ + uint32_t _error = _err; \ _CPU_ISR_Disable( _level ); \ asm volatile ("mov r0, %0\n" \ : "=r" (_error) \ -- cgit v1.2.3