[PATCH 3/3] score: Add per CPU asserts for SMP debug
Sebastian Huber
sebastian.huber at embedded-brains.de
Mon Jul 22 16:13:35 UTC 2013
---
cpukit/score/include/rtems/score/percpu.h | 68 +++++++++++++++++++++++++++++
1 files changed, 68 insertions(+), 0 deletions(-)
diff --git a/cpukit/score/include/rtems/score/percpu.h b/cpukit/score/include/rtems/score/percpu.h
index 383202c..5331fcd 100644
--- a/cpukit/score/include/rtems/score/percpu.h
+++ b/cpukit/score/include/rtems/score/percpu.h
@@ -271,6 +271,72 @@ void _Per_CPU_Wait_for_state(
#endif
+#if defined( RTEMS_SMP ) && defined( RTEMS_DEBUG )
+
+#include <rtems/score/assert.h>
+
+static inline Thread_Control **_Per_CPU_Get_heir( void )
+{
+ _Assert_Thread_dispatching_repressed();
+
+ return &(_Per_CPU_Information[_SMP_Get_current_processor()].heir);
+}
+
+static inline Thread_Control **_Per_CPU_Get_executing( void )
+{
+ _Assert_Thread_dispatching_repressed();
+
+ return &(_Per_CPU_Information[_SMP_Get_current_processor()].executing);
+}
+
+static inline uint32_t *_Per_CPU_Get_ISR_nest_level( void )
+{
+ _Assert_Thread_dispatching_repressed();
+
+ return &(_Per_CPU_Information[_SMP_Get_current_processor()].isr_nest_level);
+}
+
+#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) || \
+ (CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
+static inline void **_Per_CPU_Get_interrupt_stack_low( void )
+{
+ _Assert_Thread_dispatching_repressed();
+
+ return &(_Per_CPU_Information[_SMP_Get_current_processor()].interrupt_stack_low);
+}
+
+static inline void **_Per_CPU_Get_interrupt_stack_high( void )
+{
+ _Assert_Thread_dispatching_repressed();
+
+ return &(_Per_CPU_Information[_SMP_Get_current_processor()].interrupt_stack_high);
+}
+#endif
+
+static inline volatile bool *_Per_CPU_Get_dispatch_necessary( void )
+{
+ _Assert_Thread_dispatching_repressed();
+
+ return &(_Per_CPU_Information[_SMP_Get_current_processor()].dispatch_necessary);
+}
+
+static inline Timestamp_Control *_Per_CPU_Get_time_of_last_context_switch( void )
+{
+ _Assert_Thread_dispatching_repressed();
+
+ return &(_Per_CPU_Information[_SMP_Get_current_processor()].time_of_last_context_switch);
+}
+
+#define _Thread_Heir (*_Per_CPU_Get_heir())
+#define _Thread_Executing (*_Per_CPU_Get_executing())
+#define _ISR_Nest_level (*_Per_CPU_Get_ISR_nest_level())
+#define _CPU_Interrupt_stack_low (*_Per_CPU_Get_interrupt_stack_low())
+#define _CPU_Interrupt_stack_high (*_Per_CPU_Get_interrupt_stack_high())
+#define _Thread_Dispatch_necessary (*_Per_CPU_Get_dispatch_necessary())
+#define _Thread_Time_of_last_context_switch (*_Per_CPU_Get_time_of_last_context_switch())
+
+#else /* !( defined( RTEMS_SMP ) && defined( RTEMS_DEBUG ) ) */
+
/*
* On a non SMP system, the _SMP_Get_current_processor() is defined to 0.
* Thus when built for non-SMP, there should be no performance penalty.
@@ -290,6 +356,8 @@ void _Per_CPU_Wait_for_state(
#define _Thread_Time_of_last_context_switch \
_Per_CPU_Information[_SMP_Get_current_processor()].time_of_last_context_switch
+#endif /* !( defined( RTEMS_SMP ) && defined( RTEMS_DEBUG ) ) */
+
#endif /* ASM */
#ifdef __cplusplus
--
1.7.7
More information about the devel
mailing list