[rtems commit] score: Improve debug support for ISR locks

Sebastian Huber sebh at rtems.org
Fri Jan 18 12:38:23 UTC 2019


Module:    rtems
Branch:    master
Commit:    41310c026ca3869adbbe4962474c596ab92b3e5c
Changeset: http://git.rtems.org/rtems/commit/?id=41310c026ca3869adbbe4962474c596ab92b3e5c

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri Jan 18 13:16:29 2019 +0100

score: Improve debug support for ISR locks

Ensure that interrupts are disabled while acquiring an ISR lock.

---

 cpukit/include/rtems/rtems/intr.h    | 24 ++++++++++++++++++++----
 cpukit/include/rtems/score/isrlock.h | 32 +++++++++++++++++++-------------
 testsuites/sptests/sp37/init.c       | 12 ++++++++++++
 3 files changed, 51 insertions(+), 17 deletions(-)

diff --git a/cpukit/include/rtems/rtems/intr.h b/cpukit/include/rtems/rtems/intr.h
index 8243382..4a9ac9f 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 7dd2f29..0f01bc5 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 b050d7f..52c02b0 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() );
 



More information about the vc mailing list