summaryrefslogtreecommitdiff
path: root/schedsim/shell/shared/wrap_thread_dispatch.c
diff options
context:
space:
mode:
Diffstat (limited to 'schedsim/shell/shared/wrap_thread_dispatch.c')
-rw-r--r--schedsim/shell/shared/wrap_thread_dispatch.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/schedsim/shell/shared/wrap_thread_dispatch.c b/schedsim/shell/shared/wrap_thread_dispatch.c
new file mode 100644
index 0000000..fae4f9f
--- /dev/null
+++ b/schedsim/shell/shared/wrap_thread_dispatch.c
@@ -0,0 +1,75 @@
+/*
+ * Thread Dispatch Wrapper Implmentation
+ *
+ * COPYRIGHT (c) 1989-2013.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ */
+
+#include "shell.h"
+#include <schedsim_shell.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <rtems.h>
+
+typedef Thread_Control * Thread_Control_ptr;
+uint32_t Schedsim_Current_cpu = 0;
+
+Thread_Control_ptr *last_heir = NULL;
+Thread_Control_ptr *last_executing = NULL;
+
+extern void __real__Thread_Dispatch(void);
+
+#if RTEMS_SMP
+ #define MAX_CPUS _SMP_Processor_count
+#else
+ #define MAX_CPUS 1
+#endif
+
+void Init__wrap__Thread_Dispatch()
+{
+ last_heir = (Thread_Control_ptr *) calloc(
+ sizeof( Thread_Control_ptr ),
+ MAX_CPUS
+ );
+ last_executing = (Thread_Control_ptr *) calloc(
+ sizeof( Thread_Control_ptr ),
+ MAX_CPUS
+ );
+}
+
+void check_heir_and_executing(void)
+{
+ uint32_t level;
+
+ _ISR_Disable_without_giant( level );
+ if ( last_heir[Schedsim_Current_cpu] != _Thread_Heir )
+ PRINT_HEIR();
+
+ if ( last_executing[Schedsim_Current_cpu] != _Thread_Executing )
+ PRINT_EXECUTING();
+
+ last_heir[Schedsim_Current_cpu] = _Thread_Heir;
+ last_executing[Schedsim_Current_cpu] = _Thread_Executing;
+ _ISR_Enable_without_giant( level );
+}
+
+void __wrap__Thread_Dispatch(void)
+{
+ uint32_t cpu;
+ uint32_t current_cpu;
+
+ current_cpu = Schedsim_Current_cpu;
+ for ( cpu=0 ; cpu < MAX_CPUS ; cpu++ ) {
+ Schedsim_Current_cpu = cpu;
+ check_heir_and_executing();
+ __real__Thread_Dispatch();
+ check_heir_and_executing();
+ }
+
+ Schedsim_Current_cpu = current_cpu;
+}