summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2019-01-18 13:16:29 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2019-01-18 13:33:18 +0100
commit41310c026ca3869adbbe4962474c596ab92b3e5c (patch)
tree146406a85cb55cfc725f98b22a8f772e7cc3525a
parentscore: Avoid internal API and use ISR lock (diff)
downloadrtems-41310c026ca3869adbbe4962474c596ab92b3e5c.tar.bz2
score: Improve debug support for ISR locks
Ensure that interrupts are disabled while acquiring an ISR lock.
-rw-r--r--cpukit/include/rtems/rtems/intr.h24
-rw-r--r--cpukit/include/rtems/score/isrlock.h32
-rw-r--r--testsuites/sptests/sp37/init.c12
3 files changed, 51 insertions, 17 deletions
diff --git a/cpukit/include/rtems/rtems/intr.h b/cpukit/include/rtems/rtems/intr.h
index 82433826e6..4a9ac9f478 100644
--- a/cpukit/include/rtems/rtems/intr.h
+++ b/cpukit/include/rtems/rtems/intr.h
@@ -342,8 +342,16 @@ typedef ISR_lock_Context rtems_interrupt_lock_context;
*
* @see rtems_interrupt_lock_release_isr().
*/
-#define rtems_interrupt_lock_acquire_isr( _lock, _lock_context ) \
- _ISR_lock_Acquire( _lock, _lock_context )
+#if defined(RTEMS_SMP)
+ #define rtems_interrupt_lock_acquire_isr( _lock, _lock_context ) \
+ _SMP_lock_Acquire( \
+ &( _lock )->Lock, \
+ &( _lock_context )->Lock_context \
+ )
+#else
+ #define rtems_interrupt_lock_acquire_isr( _lock, _lock_context ) \
+ do { (void) _lock_context; } while ( 0 )
+#endif
/**
* @brief Releases an interrupt lock in the corresponding interrupt service
@@ -358,8 +366,16 @@ typedef ISR_lock_Context rtems_interrupt_lock_context;
*
* @see rtems_interrupt_lock_acquire_isr().
*/
-#define rtems_interrupt_lock_release_isr( _lock, _lock_context ) \
- _ISR_lock_Release( _lock, _lock_context )
+#if defined(RTEMS_SMP)
+ #define rtems_interrupt_lock_release_isr( _lock, _lock_context ) \
+ _SMP_lock_Release( \
+ &( _lock )->Lock, \
+ &( _lock_context )->Lock_context \
+ )
+#else
+ #define rtems_interrupt_lock_release_isr( _lock, _lock_context ) \
+ do { (void) _lock_context; } while ( 0 )
+#endif
/** @} */
diff --git a/cpukit/include/rtems/score/isrlock.h b/cpukit/include/rtems/score/isrlock.h
index 7dd2f29000..0f01bc5109 100644
--- a/cpukit/include/rtems/score/isrlock.h
+++ b/cpukit/include/rtems/score/isrlock.h
@@ -7,7 +7,7 @@
*/
/*
- * Copyright (c) 2013-2015 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2013, 2019 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
@@ -267,13 +267,16 @@ RTEMS_INLINE_ROUTINE void _ISR_lock_Context_set_level(
*/
#if defined( RTEMS_SMP )
#define _ISR_lock_Acquire( _lock, _context ) \
- _SMP_lock_Acquire( \
- &( _lock )->Lock, \
- &( _context )->Lock_context \
- )
+ do { \
+ _Assert( _ISR_Get_level() != 0 ); \
+ _SMP_lock_Acquire( \
+ &( _lock )->Lock, \
+ &( _context )->Lock_context \
+ ); \
+ } while ( 0 )
#else
#define _ISR_lock_Acquire( _lock, _context ) \
- (void) _context;
+ do { (void) _context; } while ( 0 )
#endif
/**
@@ -296,7 +299,7 @@ RTEMS_INLINE_ROUTINE void _ISR_lock_Context_set_level(
)
#else
#define _ISR_lock_Release( _lock, _context ) \
- (void) _context;
+ do { (void) _context; } while ( 0 )
#endif
/**
@@ -306,13 +309,16 @@ RTEMS_INLINE_ROUTINE void _ISR_lock_Context_set_level(
*/
#if defined( RTEMS_SMP )
#define _ISR_lock_Acquire_inline( _lock, _context ) \
- _SMP_lock_Acquire_inline( \
- &( _lock )->Lock, \
- &( _context )->Lock_context \
- )
+ do { \
+ _Assert( _ISR_Get_level() != 0 ); \
+ _SMP_lock_Acquire_inline( \
+ &( _lock )->Lock, \
+ &( _context )->Lock_context \
+ ); \
+ } while ( 0 )
#else
#define _ISR_lock_Acquire_inline( _lock, _context ) \
- (void) _context;
+ do { (void) _context; } while ( 0 )
#endif
/**
@@ -328,7 +334,7 @@ RTEMS_INLINE_ROUTINE void _ISR_lock_Context_set_level(
)
#else
#define _ISR_lock_Release_inline( _lock, _context ) \
- (void) _context;
+ do { (void) _context; } while ( 0 )
#endif
#if defined( RTEMS_DEBUG )
diff --git a/testsuites/sptests/sp37/init.c b/testsuites/sptests/sp37/init.c
index b050d7f7d1..52c02b09ac 100644
--- a/testsuites/sptests/sp37/init.c
+++ b/testsuites/sptests/sp37/init.c
@@ -178,6 +178,7 @@ static void test_isr_locks( void )
ISR_lock_Context lock_context;
size_t i;
const uint8_t *initialized_bytes;
+ ISR_Level interrupt_level;
memset( &container, 0xff, sizeof( container ) );
_ISR_lock_Initialize( &container.lock, "test" );
@@ -203,9 +204,20 @@ static void test_isr_locks( void )
rtems_test_assert( normal_interrupt_level == _ISR_Get_level() );
+#if defined(RTEMS_DEBUG)
+ _ISR_lock_ISR_disable( &lock_context );
+#endif
+ interrupt_level = _ISR_Get_level();
_ISR_lock_Acquire( &container.lock, &lock_context );
+ rtems_test_assert( interrupt_level == _ISR_Get_level() );
+#if !defined(RTEMS_DEBUG)
rtems_test_assert( normal_interrupt_level == _ISR_Get_level() );
+#endif
_ISR_lock_Release( &container.lock, &lock_context );
+ rtems_test_assert( interrupt_level == _ISR_Get_level() );
+#if defined(RTEMS_DEBUG)
+ _ISR_lock_ISR_enable( &lock_context );
+#endif
rtems_test_assert( normal_interrupt_level == _ISR_Get_level() );