From 007bdc4f5953ddd36f166a2d4e69352d778384ed Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 5 Aug 2013 10:16:31 +0200 Subject: arm: Fix CPU_MODES_INTERRUPT_MASK The set of interrupt levels must be a continuous range of non-negative integers starting at zero. --- cpukit/score/cpu/arm/cpu.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'cpukit/score/cpu/arm/cpu.c') diff --git a/cpukit/score/cpu/arm/cpu.c b/cpukit/score/cpu/arm/cpu.c index 958bd813b4..70021365ad 100644 --- a/cpukit/score/cpu/arm/cpu.c +++ b/cpukit/score/cpu/arm/cpu.c @@ -87,10 +87,12 @@ void _CPU_ISR_Set_level( uint32_t level ) { uint32_t arm_switch_reg; + level = ( level != 0 ) ? ARM_PSR_I : 0; + __asm__ volatile ( ARM_SWITCH_TO_ARM "mrs %[arm_switch_reg], cpsr\n" - "bic %[arm_switch_reg], #" _CPU_ISR_LEVEL_STRINGOF( CPU_MODES_INTERRUPT_MASK ) "\n" + "bic %[arm_switch_reg], #" _CPU_ISR_LEVEL_STRINGOF( ARM_PSR_I ) "\n" "orr %[arm_switch_reg], %[level]\n" "msr cpsr, %0\n" ARM_SWITCH_BACK @@ -107,12 +109,12 @@ uint32_t _CPU_ISR_Get_level( void ) __asm__ volatile ( ARM_SWITCH_TO_ARM "mrs %[level], cpsr\n" - "and %[level], #" _CPU_ISR_LEVEL_STRINGOF( CPU_MODES_INTERRUPT_MASK ) "\n" + "and %[level], #" _CPU_ISR_LEVEL_STRINGOF( ARM_PSR_I ) "\n" ARM_SWITCH_BACK : [level] "=&r" (level) ARM_SWITCH_ADDITIONAL_OUTPUT ); - return level; + return ( level & ARM_PSR_I ) != 0; } void _CPU_ISR_install_vector( -- cgit v1.2.3