[rtems-schedsim commit] schedsim: Update to latest RTEMS. Works Uniprocessor

Joel Sherrill joel at rtems.org
Mon Apr 28 17:11:34 UTC 2014


Module:    rtems-schedsim
Branch:    master
Commit:    726b27c5bf4b2f4200953950b985b6e0fb7ce20f
Changeset: http://git.rtems.org/rtems-schedsim/commit/?id=726b27c5bf4b2f4200953950b985b6e0fb7ce20f

Author:    Joel Sherrill <joel.sherrill at oarcorp.com>
Date:      Fri Dec 13 11:01:48 2013 -0600

schedsim: Update to latest RTEMS. Works Uniprocessor

---

 schedsim/rtems/Makefile.am                         |   97 ++++---------
 schedsim/rtems/rtems_init.c                        |   76 +++++++---
 schedsim/rtems/sched_cpu/cpu_asm.c                 |  151 ++------------------
 schedsim/rtems/sched_cpu/rtems/score/cpu.h         |   38 +++++-
 schedsim/rtems/sched_cpu/rtems/score/cpusmplock.h  |  118 +++++++++++++++
 schedsim/rtems/sched_cpu/rtems/score/types.h       |    3 +-
 schedsim/rtems/wkspace.c                           |   23 +++
 schedsim/shell/schedsim_priority/Makefile.am       |   11 ++-
 schedsim/shell/schedsim_priority/smp_stub.c        |    6 +-
 schedsim/shell/schedsim_smpsimple/main_dispatch.c  |    2 +-
 .../shell/schedsim_smpsimple/main_dump_all_cpus.c  |   11 +-
 .../schedsim_smpsimple/main_dump_ready_tasks.c     |    2 +
 schedsim/shell/schedsim_smpsimple/smp_stub.c       |   15 ++-
 schedsim/shell/shared/main_rtemsinit.c             |    5 +-
 schedsim/shell/shared/schedsim_shell.h             |    1 +
 15 files changed, 304 insertions(+), 255 deletions(-)

diff --git a/schedsim/rtems/Makefile.am b/schedsim/rtems/Makefile.am
index f95bab6..2f302c7 100644
--- a/schedsim/rtems/Makefile.am
+++ b/schedsim/rtems/Makefile.am
@@ -8,11 +8,8 @@ librtems_a_CPPFLAGS += -I$(top_builddir)/score/include
 librtems_a_CPPFLAGS += -I$(srcdir)/sched_cpu
 librtems_a_CPPFLAGS += -I$(cpukitdir)/include
 librtems_a_CPPFLAGS += -I$(cpukitdir)/score/include
-librtems_a_CPPFLAGS += -I$(cpukitdir)/score/inline
 librtems_a_CPPFLAGS += -I$(cpukitdir)/rtems/include
-librtems_a_CPPFLAGS += -I$(cpukitdir)/rtems/inline
 librtems_a_CPPFLAGS += -I$(cpukitdir)/sapi/include
-librtems_a_CPPFLAGS += -I$(cpukitdir)/sapi/inline
 librtems_a_CPPFLAGS += -I$(cpukitdir)/libcsupport/include
 librtems_a_CPPFLAGS += -I$(cpukitdir)/libmisc/stringto
 if HAS_PTHREADS
@@ -31,7 +28,6 @@ librtems_a_SOURCES += sched_cpu/cpu.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/interr.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/percpu.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/apiext.c
-librtems_a_SOURCES += $(cpukitdir)/score/src/apimutexallocate.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/apimutex.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/apimutexlock.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/apimutexunlock.c
@@ -52,11 +48,13 @@ librtems_a_SOURCES += $(cpukitdir)/score/src/coresemsurrender.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/coretod.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/coretodget.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/coretodgetuptimetimespec.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/coretodsecondssinceepoch.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/coretodset.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/coretodtickle.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/coretodtickspersec.c
-librtems_a_SOURCES += $(cpukitdir)/score/src/coretodusectoticks.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/freechain.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/isr.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/log2table.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/objectallocate.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/objectapimaximumclass.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/objectclose.c
@@ -76,21 +74,32 @@ librtems_a_SOURCES += $(cpukitdir)/score/src/objectnametoid.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/objectnametoidstring.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/objectsetname.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/objectshrinkinformation.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/rbtree.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/rbtreeextract.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/rbtreefind.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/rbtreeinsert.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/rbtreeiterate.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/rbtreenext.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/scheduler.c
-librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerpriorityallocate.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerdefaultallocatefree.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerdefaultreleasejob.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerdefaultstartidle.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerdefaulttick.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerdefaultupdate.c
+
+# Uniprocessor Deterministic Scheduler 
 librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerpriorityblock.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerpriority.c
-librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerprioritytick.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerpriorityenqueue.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerpriorityenqueuefirst.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerpriorityextract.c
-librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerpriorityfree.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerpriorityprioritycompare.c
-librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerpriorityreleasejob.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerpriorityschedule.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerpriorityunblock.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerpriorityupdate.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerpriorityyield.c
+
+# Uniprocessor Scheduler Simple
 librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimpleblock.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimple.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimpleenqueue.c
@@ -101,10 +110,10 @@ librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimplereadyqueueenqueuefir
 librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimpleschedule.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimpleunblock.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimpleyield.c
+
 librtems_a_SOURCES += $(cpukitdir)/score/src/thread.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/threadchangepriority.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/threadclearstate.c
-librtems_a_SOURCES += $(cpukitdir)/score/src/threadclose.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/threadcreateidle.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/threaddelayended.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/threaddispatch.c
@@ -113,7 +122,6 @@ librtems_a_SOURCES += $(cpukitdir)/score/src/threadhandler.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/threadinitialize.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/threadloadenv.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/threadready.c
-librtems_a_SOURCES += $(cpukitdir)/score/src/threadreset.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/threadrestart.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/threadsetpriority.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/threadsetstate.c
@@ -158,10 +166,7 @@ librtems_a_SOURCES += $(cpukitdir)/score/src/watchdogadjust.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/watchdogadjusttochain.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/watchdog.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/watchdoginsert.c
-librtems_a_SOURCES += $(cpukitdir)/score/src/watchdognanoseconds.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/watchdogremove.c
-librtems_a_SOURCES += $(cpukitdir)/score/src/watchdogreport.c
-librtems_a_SOURCES += $(cpukitdir)/score/src/watchdogreportchain.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/watchdogtickle.c
 librtems_a_SOURCES += $(cpukitdir)/sapi/src/debug.c
 librtems_a_SOURCES += $(cpukitdir)/rtems/src/clockgetsecondssinceepoch.c
@@ -184,7 +189,9 @@ librtems_a_SOURCES += $(cpukitdir)/rtems/src/semident.c
 librtems_a_SOURCES += $(cpukitdir)/rtems/src/semobtain.c
 librtems_a_SOURCES += $(cpukitdir)/rtems/src/semrelease.c
 librtems_a_SOURCES += $(cpukitdir)/rtems/src/semtranslatereturncode.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/signalcatch.c
 librtems_a_SOURCES += $(cpukitdir)/rtems/src/status.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/statustext.c
 librtems_a_SOURCES += $(cpukitdir)/rtems/src/tasks.c
 librtems_a_SOURCES += $(cpukitdir)/rtems/src/taskdata.c
 librtems_a_SOURCES += $(cpukitdir)/rtems/src/taskmode.c
@@ -198,6 +205,9 @@ librtems_a_SOURCES += $(cpukitdir)/rtems/src/tasksuspend.c
 librtems_a_SOURCES += $(cpukitdir)/rtems/src/tasksetpriority.c
 librtems_a_SOURCES += $(cpukitdir)/rtems/src/taskmode.c
 librtems_a_SOURCES += $(cpukitdir)/rtems/src/taskwakeafter.c
+librtems_a_SOURCES += $(cpukitdir)/posix/src/key.c
+librtems_a_SOURCES += $(cpukitdir)/posix/src/keyfreememory.c
+librtems_a_SOURCES += $(cpukitdir)/posix/src/keyrundestructors.c
 librtems_a_SOURCES += $(cpukitdir)/libcsupport/src/assoclocalbyname.c
 librtems_a_SOURCES += $(cpukitdir)/libcsupport/src/assoclocalbyremotebitfield.c
 librtems_a_SOURCES += $(cpukitdir)/libcsupport/src/assoclocalbyremote.c
@@ -228,15 +238,12 @@ librtems_a_SOURCES += $(cpukitdir)/libmisc/stringto/stringtounsignedlong.c
 
 if HAS_SMP
 librtems_a_SOURCES += $(cpukitdir)/score/src/smp.c
-librtems_a_SOURCES += $(cpukitdir)/score/src/smplock.c
-librtems_a_SOURCES += $(cpukitdir)/score/src/isrsmp.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/threaddisabledispatch.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/threadenabledispatch.c
 librtems_a_SOURCES += $(cpukitdir)/score/src/threaddispatchdisablelevel.c
-librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimplesmpblock.c
-librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimplesmpschedule.c
-librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimplesmptick.c
-librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimplesmpunblock.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerprioritysmp.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimplesmp.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersmpstartidle.c
 endif
 
 schedsim_includedir = $(includedir)/schedsim
@@ -251,7 +258,6 @@ schedsim_rtems_include_HEADERS  = \
   ${cpukitdir}/score/include//rtems/seterr.h \
   ${cpukitdir}/score/include/rtems/system.h \
   ${cpukitdir}/score/include/rtems/debug.h \
-  ${cpukitdir}/score/include/rtems/bspsmp.h \
   ${cpukitdir}/include/rtems/bspIo.h \
   $(cpukitdir)/sapi/include/rtems/fatal.h \
   $(cpukitdir)/sapi/include/rtems/init.h \
@@ -322,36 +328,7 @@ schedsim_rtems_score_include_HEADERS = \
   ${cpukitdir}/score/include/rtems/score/schedulerpriority.h \
   ${cpukitdir}/score/include/rtems/score/schedulersimple.h \
   ${cpukitdir}/score/include/rtems/score/timespec.h \
-  ${cpukitdir}/score/include/rtems/score/tqdata.h \
-  ${cpukitdir}/score/include/rtems/score/bitfield.h \
   ${cpukitdir}/score/include/rtems/score/interr.h \
-  $(cpukitdir)/score/inline/rtems/score/address.inl \
-  $(cpukitdir)/score/inline/rtems/score/corespinlock.inl \
-  $(cpukitdir)/score/inline/rtems/score/priority.inl \
-  $(cpukitdir)/score/inline/rtems/score/threadmp.inl \
-  $(cpukitdir)/score/inline/rtems/score/chain.inl \
-  $(cpukitdir)/score/inline/rtems/score/heap.inl \
-  $(cpukitdir)/score/inline/rtems/score/scheduler.inl \
-  $(cpukitdir)/score/inline/rtems/score/threadq.inl \
-  $(cpukitdir)/score/inline/rtems/score/corebarrier.inl \
-  $(cpukitdir)/score/inline/rtems/score/isr.inl \
-  $(cpukitdir)/score/inline/rtems/score/schedulerpriority.inl \
-  $(cpukitdir)/score/inline/rtems/score/tod.inl \
-  $(cpukitdir)/score/inline/rtems/score/coremsg.inl \
-  $(cpukitdir)/score/inline/rtems/score/mppkt.inl \
-  $(cpukitdir)/score/inline/rtems/score/stack.inl \
-  $(cpukitdir)/score/inline/rtems/score/tqdata.inl \
-  $(cpukitdir)/score/inline/rtems/score/coremutex.inl \
-  $(cpukitdir)/score/inline/rtems/score/object.inl \
-  $(cpukitdir)/score/inline/rtems/score/states.inl \
-  $(cpukitdir)/score/inline/rtems/score/watchdog.inl \
-  $(cpukitdir)/score/inline/rtems/score/corerwlock.inl \
-  $(cpukitdir)/score/inline/rtems/score/objectmp.inl \
-  $(cpukitdir)/score/inline/rtems/score/sysstate.inl \
-  $(cpukitdir)/score/inline/rtems/score/wkspace.inl \
-  $(cpukitdir)/score/inline/rtems/score/coresem.inl \
-  $(cpukitdir)/score/inline/rtems/score/prioritybitmap.inl \
-  $(cpukitdir)/score/inline/rtems/score/thread.inl \
   sched_cpu/rtems/score/cpu_asm.h \
   $(top_builddir)/score/include/rtems/score/cpuopts.h \
   sched_cpu/rtems/score/cpu.h \
@@ -367,7 +344,6 @@ schedsim_rtems_rtems_include_HEADERS = \
   ${cpukitdir}/rtems/include/rtems/rtems/config.h \
   ${cpukitdir}/rtems/include/rtems/rtems/ratemon.h \
   ${cpukitdir}/rtems/include/rtems/rtems/rtemsapi.h \
-  ${cpukitdir}/rtems/include/rtems/rtems/eventset.h \
   ${cpukitdir}/rtems/include/rtems/rtems/mp.h \
   ${cpukitdir}/rtems/include/rtems/rtems/dpmem.h \
   ${cpukitdir}/rtems/include/rtems/rtems/status.h \
@@ -393,24 +369,7 @@ schedsim_rtems_rtems_include_HEADERS = \
   ${cpukitdir}/rtems/include/rtems/rtems/support.h \
   ${cpukitdir}/rtems/include/rtems/rtems/signal.h \
   ${cpukitdir}/rtems/include/rtems/rtems/barrier.h \
-  ${cpukitdir}/rtems/include/rtems/rtems/tasks.h \
-  $(cpukitdir)/rtems/inline/rtems/rtems/asr.inl  \
-  $(cpukitdir)/rtems/inline/rtems/rtems/eventset.inl \
-  $(cpukitdir)/rtems/inline/rtems/rtems/ratemon.inl \
-  $(cpukitdir)/rtems/inline/rtems/rtems/tasks.inl \
-  $(cpukitdir)/rtems/inline/rtems/rtems/attr.inl \
-  $(cpukitdir)/rtems/inline/rtems/rtems/message.inl \
-  $(cpukitdir)/rtems/inline/rtems/rtems/region.inl \
-  $(cpukitdir)/rtems/inline/rtems/rtems/timer.inl \
-  $(cpukitdir)/rtems/inline/rtems/rtems/barrier.inl \
-  $(cpukitdir)/rtems/inline/rtems/rtems/modes.inl \
-  $(cpukitdir)/rtems/inline/rtems/rtems/sem.inl \
-  $(cpukitdir)/rtems/inline/rtems/rtems/dpmem.inl \
-  $(cpukitdir)/rtems/inline/rtems/rtems/options.inl \
-  $(cpukitdir)/rtems/inline/rtems/rtems/status.inl \
-  $(cpukitdir)/rtems/inline/rtems/rtems/event.inl \
-  $(cpukitdir)/rtems/inline/rtems/rtems/part.inl \
-  $(cpukitdir)/rtems/inline/rtems/rtems/support.inl
+  ${cpukitdir}/rtems/include/rtems/rtems/tasks.h
 
 schedsim_include_HEADERS += rtems_sched.h
 
diff --git a/schedsim/rtems/rtems_init.c b/schedsim/rtems/rtems_init.c
index 26343bc..2d44fba 100644
--- a/schedsim/rtems/rtems_init.c
+++ b/schedsim/rtems/rtems_init.c
@@ -1,7 +1,9 @@
 /*
  *  BASED UPON SOURCE IN RTEMS, MODIFIED FOR SIMULATOR
- *
- *  COPYRIGHT (c) 1989-2013.
+ */
+
+/*
+ *  COPYRIGHT (c) 1989-2014.
  *  On-Line Applications Research Corporation (OAR).
  *
  *  The license and distribution terms for this file may be
@@ -12,18 +14,43 @@
 #define SAPI_INIT
 #define SCORE_INIT
 #define RTEMS_API_INIT
+#define POSIX_API_INIT
+
+#include <rtems/system.h>
+#include <rtems/config.h>
+#include <rtems/debug.h>
+#include <rtems/extensionimpl.h>
+#include <rtems/fatal.h>
+#include <rtems/init.h>
+#include <rtems/io.h>
+#include <rtems/score/sysstate.h>
 
-#include <rtems.h> 
 #include <rtems/score/apiext.h>
-#include <rtems/score/bitfield.h>
 #include <rtems/score/apimutex.h>
+#include <rtems/score/cpusetimpl.h>
 #include <rtems/score/userextimpl.h>
+#include <rtems/score/schedulerimpl.h>
+#include <rtems/score/smpimpl.h>
+#include <rtems/score/threadimpl.h>
+#include <rtems/score/todimpl.h>
+#include <rtems/score/watchdogimpl.h>
 #include <rtems/score/wkspace.h>
 
+#include <rtems/rtems/tasksimpl.h>
+#include <rtems/rtems/semimpl.h>
+
+#include <rtems/posix/keyimpl.h>
+
+/*
+ *  Declare Object Information tables directly here instead of API
+ *  specific initialization files as in cpukit/sapi/src.
+ */
 Objects_Information *_Internal_Objects[ OBJECTS_INTERNAL_CLASSES_LAST + 1 ];
 
 Objects_Information *_RTEMS_Objects[ OBJECTS_RTEMS_CLASSES_LAST + 1 ];
 
+Objects_Information *_POSIX_Objects[ OBJECTS_POSIX_CLASSES_LAST + 1 ];
+
 extern void check_heir_and_executing(void);
 
 void rtems_initialize_data_structures(void)
@@ -40,18 +67,7 @@ void rtems_initialize_data_structures(void)
 
   _Thread_Dispatch_initialization();
 
-  /*
-   *  Before this is called, we are not allowed to allocate memory
-   *  from the Workspace because it is not initialized.
-   */
-  _Workspace_Handler_initialization(NULL, 0, NULL);
-
-  #if defined(RTEMS_SMP)
-    _SMP_Handler_initialize();
-  #endif
-
   _User_extensions_Handler_initialization();
-
   _ISR_Handler_initialization();
 
   /*
@@ -59,10 +75,10 @@ void rtems_initialize_data_structures(void)
    */
   _Objects_Information_table[OBJECTS_INTERNAL_API] = _Internal_Objects;
 
-  _API_Mutex_Initialization( 1 );
+  _API_Mutex_Initialization( 2 );
   _API_Mutex_Allocate( &_RTEMS_Allocator_Mutex );
+  _API_Mutex_Allocate( &_Once_Mutex );
 
-  _Priority_bit_map_Handler_initialization();
   _Watchdog_Handler_initialization();
   _TOD_Handler_initialization();
 
@@ -70,6 +86,9 @@ void rtems_initialize_data_structures(void)
 
   _Scheduler_Handler_initialization();
 
+  _SMP_Handler_initialize();
+
+  _CPU_set_Handler_initialization();
 
 /* MANAGERS */
   /*
@@ -82,12 +101,17 @@ void rtems_initialize_data_structures(void)
   _Semaphore_Manager_initialization();
 
   /*
+   * Install our API Object Management Table and initialize the
+   * various managers.
+   */
+  _Objects_Information_table[OBJECTS_POSIX_API] = _POSIX_Objects;
+
+  _POSIX_Key_Manager_initialization();
+
+  /*
    * Discover and initialize the secondary cores in an SMP system.
    */
-  #if defined(RTEMS_SMP)
-    _SMP_Processor_count =
-      bsp_smp_initialize( rtems_configuration_smp_maximum_processors );
-  #endif
+  _SMP_Handler_initialize();
 
   _System_state_Set( SYSTEM_STATE_BEFORE_MULTITASKING );
 
@@ -104,14 +128,20 @@ void rtems_initialize_data_structures(void)
    *  Scheduling can properly occur now as long as we avoid dispatching.
    */
 
-  _System_state_Set( SYSTEM_STATE_BEGIN_MULTITASKING );
+  _System_state_Set( SYSTEM_STATE_UP );
+
+ _SMP_Request_start_multitasking();
 
   _Thread_Start_multitasking();
 
   /*
    *  Now we are back in a non-dispatching critical section
    */
-  _Thread_Dispatch_set_disable_level(0);
+  #if defined(RTEMS_SMP)
+    #error "NOT IMPLEMENTED"
+  #else
+    _Thread_Enable_dispatch();
+  #endif
 
   /*
    * Print an initial message
diff --git a/schedsim/rtems/sched_cpu/cpu_asm.c b/schedsim/rtems/sched_cpu/cpu_asm.c
index 45ab43f..0928794 100644
--- a/schedsim/rtems/sched_cpu/cpu_asm.c
+++ b/schedsim/rtems/sched_cpu/cpu_asm.c
@@ -1,14 +1,14 @@
-/*  cpu_asm.c  ===> cpu_asm.S or cpu_asm.s
- *  BASED UPON SOURCE IN RTEMS, MODIFIED FOR SIMULATOR
- *
- *
- *  This file contains the basic algorithms for all assembly code used
- *  in an specific CPU port of RTEMS.  These algorithms must be implemented
- *  in assembly language
+/**
+ *  @file
  *
- *  NOTE:  This is supposed to be a .S or .s file NOT a C file.
+ *  BASED UPON SOURCE IN RTEMS, MODIFIED FOR SIMULATOR
  *
- *  COPYRIGHT (c) 1989-2013.
+ *  Every method in this file is stubbed. There are no real
+ *  context switches or interrupts.
+ */
+
+/*
+ *  COPYRIGHT (c) 1989-2014.
  *  On-Line Applications Research Corporation (OAR).
  *
  *  The license and distribution terms for this file may be
@@ -16,36 +16,12 @@
  *  http://www.rtems.com/license/LICENSE.
  */
 
-/*
- *  This is supposed to be an assembly file.  This means that system.h
- *  and cpu.h should not be included in a "real" cpu_asm file.  An
- *  implementation in assembly should include "cpu_asm.h>
- */
-
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
 #include <rtems/system.h>
 #include <rtems/score/cpu.h>
-/* #include "cpu_asm.h> */
-
-/*
- *  _CPU_Context_save_fp_context
- *
- *  This routine is responsible for saving the FP context
- *  at *fp_context_ptr.  If the point to load the FP context
- *  from is changed then the pointer is modified by this routine.
- *
- *  Sometimes a macro implementation of this is in cpu.h which dereferences
- *  the ** and a similarly named routine in this file is passed something
- *  like a (Context_Control_fp *).  The general rule on making this decision
- *  is to avoid writing assembly language.
- *
- *  NO_CPU Specific Information:
- *
- *  XXX document implementation including references if appropriate
- */
 
 void _CPU_Context_save_fp(
   Context_Control_fp **fp_context_ptr
@@ -53,38 +29,12 @@ void _CPU_Context_save_fp(
 {
 }
 
-/*
- *  _CPU_Context_restore_fp_context
- *
- *  This routine is responsible for restoring the FP context
- *  at *fp_context_ptr.  If the point to load the FP context
- *  from is changed then the pointer is modified by this routine.
- *
- *  Sometimes a macro implementation of this is in cpu.h which dereferences
- *  the ** and a similarly named routine in this file is passed something
- *  like a (Context_Control_fp *).  The general rule on making this decision
- *  is to avoid writing assembly language.
- *
- *  NO_CPU Specific Information:
- *
- *  XXX document implementation including references if appropriate
- */
-
 void _CPU_Context_restore_fp(
   Context_Control_fp **fp_context_ptr
 )
 {
 }
 
-/*  _CPU_Context_switch
- *
- *  This routine performs a normal non-FP context switch.
- *
- *  NO_CPU Specific Information:
- *
- *  XXX document implementation including references if appropriate
- */
-
 void _CPU_Context_switch(
   Context_Control  *run,
   Context_Control  *heir
@@ -92,95 +42,12 @@ void _CPU_Context_switch(
 {
 }
 
-/*
- *  _CPU_Context_restore
- *
- *  This routine is generally used only to restart self in an
- *  efficient manner.  It may simply be a label in _CPU_Context_switch.
- *
- *  NOTE: May be unnecessary to reload some registers.
- *
- *  NO_CPU Specific Information:
- *
- *  XXX document implementation including references if appropriate
- */
-
 void _CPU_Context_restore(
   Context_Control *new_context
 )
 {
 }
 
-/*  void __ISR_Handler()
- *
- *  This routine provides the RTEMS interrupt management.
- *
- *  NO_CPU Specific Information:
- *
- *  XXX document implementation including references if appropriate
- */
-
 void _ISR_Handler(void)
 {
-   /*
-    *  This discussion ignores a lot of the ugly details in a real
-    *  implementation such as saving enough registers/state to be
-    *  able to do something real.  Keep in mind that the goal is
-    *  to invoke a user's ISR handler which is written in C and
-    *  uses a certain set of registers.
-    *
-    *  Also note that the exact order is to a large extent flexible.
-    *  Hardware will dictate a sequence for a certain subset of
-    *  _ISR_Handler while requirements for setting
-    */
-
-  /*
-   *  At entry to "common" _ISR_Handler, the vector number must be
-   *  available.  On some CPUs the hardware puts either the vector
-   *  number or the offset into the vector table for this ISR in a
-   *  known place.  If the hardware does not give us this information,
-   *  then the assembly portion of RTEMS for this port will contain
-   *  a set of distinct interrupt entry points which somehow place
-   *  the vector number in a known place (which is safe if another
-   *  interrupt nests this one) and branches to _ISR_Handler.
-   *
-   *  save some or all context on stack
-   *  may need to save some special interrupt information for exit
-   *
-   *  #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
-   *    if ( _ISR_Nest_level == 0 )
-   *      switch to software interrupt stack
-   *  #endif
-   *
-   *  _ISR_Nest_level++;
-   *
-   *  _Thread_Dispatch_disable_level++;
-   *
-   *  (*_ISR_Vector_table[ vector ])( vector );
-   *
-   *  _Thread_Dispatch_disable_level--;
-   *
-   *  --_ISR_Nest_level;
-   *
-   *  if ( _ISR_Nest_level )
-   *    goto the label "exit interrupt (simple case)"
-   *
-   *  if ( _Thread_Dispatch_disable_level )
-   *    _ISR_Signals_to_thread_executing = FALSE;
-   *    goto the label "exit interrupt (simple case)"
-   *
-   *  if ( _Context_Switch_necessary || _ISR_Signals_to_thread_executing ) {
-   *    _ISR_Signals_to_thread_executing = FALSE;
-   *    call _Thread_Dispatch() or prepare to return to _ISR_Dispatch
-   *    prepare to get out of interrupt
-   *    return from interrupt  (maybe to _ISR_Dispatch)
-   *
-   *  LABEL "exit interrupt (simple case):
-   *  #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
-   *    if outermost interrupt
-   *      restore stack
-   *  #endif
-   *  prepare to get out of interrupt
-   *  return from interrupt
-   */
 }
diff --git a/schedsim/rtems/sched_cpu/rtems/score/cpu.h b/schedsim/rtems/sched_cpu/rtems/score/cpu.h
index 5ab67f0..219a347 100644
--- a/schedsim/rtems/sched_cpu/rtems/score/cpu.h
+++ b/schedsim/rtems/sched_cpu/rtems/score/cpu.h
@@ -291,7 +291,7 @@ extern "C" {
  *
  *  XXX document implementation including references if appropriate
  */
-#define CPU_USE_DEFERRED_FP_SWITCH       TRUE
+#define CPU_USE_DEFERRED_FP_SWITCH       FALSE
 
 /**
  *  Does this port provide a CPU dependent IDLE task implementation?
@@ -461,6 +461,10 @@ extern "C" {
  *  XXX document implementation including references if appropriate
  */
 
+typedef struct {
+  /* There is no CPU specific per-CPU state */
+} CPU_Per_CPU_control;
+
 /**
  *  @ingroup CPUContext Management
  *  This defines the minimal set of integer and processor state registers
@@ -834,7 +838,7 @@ uint32_t   _CPU_ISR_Get_level( void );
  *  XXX document implementation including references if appropriate
  */
 #define _CPU_Context_Initialize( _the_context, _stack_base, _size, \
-                                 _isr, _entry_point, _is_fp ) \
+                                 _isr, _entry_point, _is_fp, tls_area ) \
   { \
   }
 
@@ -1123,6 +1127,15 @@ void _CPU_ISR_install_vector(
  */
 void _CPU_Install_interrupt_stack( void );
 
+typedef uint32_t CPU_Counter_ticks;
+
+CPU_Counter_ticks _CPU_Counter_read( void );
+
+CPU_Counter_ticks _CPU_Counter_difference(
+  CPU_Counter_ticks second,
+  CPU_Counter_ticks first
+);
+
 /**
  *  This routine is the CPU dependent IDLE thread body.
  *
@@ -1204,6 +1217,25 @@ void _CPU_Context_restore_fp(
   Context_Control_fp **fp_context_ptr
 );
 
+#ifdef RTEMS_SMP
+  #define _CPU_Context_switch_to_first_task_smp(_context ) 
+
+  RTEMS_COMPILER_PURE_ATTRIBUTE static inline uint32_t
+    _CPU_SMP_Get_current_processor( void )
+  {
+    return 0;
+  }
+
+  #define _CPU_SMP_Send_interrupt( dest);
+
+  static inline void _CPU_SMP_Processor_event_broadcast( void )
+  {
+  }
+
+  static inline void _CPU_SMP_Processor_event_receive( void )
+  {
+  }
+#endif
 typedef struct {
   uint32_t trap;
   CPU_Interrupt_frame *isf;
@@ -1283,8 +1315,6 @@ void __SMP_cpu_swap(
     *(_a) = _value; \
   } while (0)
 
-#define _CPU_Context_switch_to_first_task_smp(_ignored) 
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/schedsim/rtems/sched_cpu/rtems/score/cpusmplock.h b/schedsim/rtems/sched_cpu/rtems/score/cpusmplock.h
new file mode 100644
index 0000000..41e68af
--- /dev/null
+++ b/schedsim/rtems/sched_cpu/rtems/score/cpusmplock.h
@@ -0,0 +1,118 @@
+/**
+ * @file
+ *
+ * @ingroup ScoreSMPLockCPU
+ *
+ * @brief CPU SMP Lock Implementation
+ */
+
+/*
+ * Copyright (c) 2013 embedded brains GmbH
+ *
+ * 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.
+ */
+
+#ifndef _RTEMS_SCORE_NO_CPU_SMPLOCK_H
+#define _RTEMS_SCORE_NO_CPU_SMPLOCK_H
+
+#include <rtems/score/cpu.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @defgroup ScoreSMPLockCPU CPU SMP Locks
+ *
+ * @ingroup ScoreSMPLock
+ *
+ * This example will implement a ticket lock.
+ *
+ * @{
+ */
+
+/**
+ * @brief CPU SMP lock control.
+ */
+typedef struct {
+  unsigned int next_ticket;
+  unsigned int now_serving;
+} CPU_SMP_lock_Control;
+
+/**
+ * @brief CPU SMP lock control initializer for static initialization.
+ */
+#define CPU_SMP_LOCK_INITIALIZER { 0, 0 }
+
+/**
+ * @brief Initializes a CPU SMP lock control.
+ *
+ * @param[out] lock The CPU SMP lock control.
+ */
+static inline void _CPU_SMP_lock_Initialize( CPU_SMP_lock_Control *lock )
+{
+  lock->next_ticket = 0;
+  lock->now_serving = 0;
+}
+
+/**
+ * @brief Acquires a CPU SMP lock.
+ *
+ * @param[in,out] lock The CPU SMP lock control.
+ */
+static inline void _CPU_SMP_lock_Acquire( CPU_SMP_lock_Control *lock )
+{
+#if 0
+  unsigned int my_ticket = _Atomic_Fetch_and_increment( &lock->next_ticket );
+
+  while ( _Atomic_Load_and_acquire( &lock->now_serving ) != my_ticket ) {
+    _Wait_some_time();
+  }
+#endif
+}
+
+/**
+ * @brief Releases a CPU SMP lock.
+ *
+ * @param[in,out] lock The CPU SMP lock control.
+ */
+static inline void _CPU_SMP_lock_Release( CPU_SMP_lock_Control *lock )
+{
+#if 0
+  _Atomic_Store_and_release( &lock->now_serving, lock->now_serving + 1 );
+#endif
+}
+
+/**
+ * @brief Disables interrupts and acquires the CPU SMP lock.
+ *
+ * @param[in,out] lock The CPU SMP lock control.
+ * @param[out] isr_cookie The ISR cookie.
+ */
+#define _CPU_SMP_lock_ISR_disable_and_acquire( lock, isr_cookie ) \
+  do { \
+    _CPU_ISR_Disable( isr_cookie ); \
+    _CPU_SMP_lock_Acquire( lock ); \
+  } while (0)
+
+/**
+ * @brief Releases the CPU SMP lock and enables interrupts.
+ *
+ * @param[in,out] lock The CPU SMP lock control.
+ * @param[in] isr_cookie The ISR cookie.
+ */
+#define _CPU_SMP_lock_Release_and_ISR_enable( lock, isr_cookie ) \
+  do { \
+    _CPU_SMP_lock_Release( lock ); \
+    _CPU_ISR_Enable( isr_cookie ); \
+  } while (0)
+
+/**@}*/
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _RTEMS_SCORE_NO_CPU_SMPLOCK_H */
diff --git a/schedsim/rtems/sched_cpu/rtems/score/types.h b/schedsim/rtems/sched_cpu/rtems/score/types.h
index 98c1db8..bebbef3 100644
--- a/schedsim/rtems/sched_cpu/rtems/score/types.h
+++ b/schedsim/rtems/sched_cpu/rtems/score/types.h
@@ -31,8 +31,7 @@ extern "C" {
  *  This section defines the basic types for this processor.
  */
 
-/** This defines the type for a priority bit map entry. */
-typedef uint16_t Priority_bit_map_Control;
+typedef uint16_t Priority_bit_map_Word;
 
 /** This defines the return type for an ISR entry point. */
 typedef void no_cpu_isr;
diff --git a/schedsim/rtems/wkspace.c b/schedsim/rtems/wkspace.c
index de9f76c..61fbb47 100644
--- a/schedsim/rtems/wkspace.c
+++ b/schedsim/rtems/wkspace.c
@@ -20,7 +20,9 @@
 #include <rtems/score/interr.h>
 
 #include <stdlib.h>
+#include <malloc.h>
 
+#define DEBUG_WORKSPACE
 #if defined(DEBUG_WORKSPACE)
   #include <stdio.h>
 #endif
@@ -59,6 +61,27 @@ void *_Workspace_Allocate(
   return memory;
 }
 
+void *_Workspace_Allocate_aligned( size_t size, size_t alignment )
+{
+  void *memory;
+  int   sc;
+
+  memory = memalign( alignment, size );
+  #if defined(DEBUG_WORKSPACE)
+    fprintf(
+      stderr,
+      "Workspace_Allocate_aligned(%d, %d) from %p/%p -> %p\n",
+      size,
+      alignment,
+      __builtin_return_address( 0 ),
+      __builtin_return_address( 1 ),
+      memory
+    );
+  #endif
+  return memory;
+}
+
+
 /*
  *  _Workspace_Free
  */
diff --git a/schedsim/shell/schedsim_priority/Makefile.am b/schedsim/shell/schedsim_priority/Makefile.am
index 32febc6..378aea2 100644
--- a/schedsim/shell/schedsim_priority/Makefile.am
+++ b/schedsim/shell/schedsim_priority/Makefile.am
@@ -26,7 +26,16 @@ schedsim_priority_CPPFLAGS += -I$(cpukitdir)/posix/include
 schedsim_priority_CPPFLAGS += -I$(cpukitdir)/posix/inline
 endif
 
-schedsim_priority_LDFLAGS =-Wl,--wrap=_Thread_Dispatch
+## Ensure all linker provided symbols are available
+schedsim_priority_LDFLAGS = 
+schedsim_priority_LDFLAGS += -Wl,--defsym=_TLS_Data_begin=0
+schedsim_priority_LDFLAGS += -Wl,--defsym=_TLS_BSS_end=0
+schedsim_priority_LDFLAGS += -Wl,--defsym=_TLS_Alignment=4
+
+## Wrap _Thread_Dispatch so we can see context switches
+schedsim_priority_LDFLAGS += -Wl,--wrap=_Thread_Dispatch
+
+## Link in all support libraries
 ## schedsim_priorityLDADD +=-Wl,--start-group
 schedsim_priority_LDADD = ../shared/libschedsim.a
 schedsim_priority_LDADD += ../../rtems/librtems.a
diff --git a/schedsim/shell/schedsim_priority/smp_stub.c b/schedsim/shell/schedsim_priority/smp_stub.c
index d7c7323..c2f1308 100644
--- a/schedsim/shell/schedsim_priority/smp_stub.c
+++ b/schedsim/shell/schedsim_priority/smp_stub.c
@@ -24,12 +24,12 @@ int bsp_smp_processor_id(void)
   return 0;
 }
 
-int bsp_smp_initialize(
-  int maximum
+uint32_t bsp_smp_initialize(
+  uint32_t configured_cpu_count
 )
 {
   /* return the number of CPUs */
-  return maximum;
+  return configured_cpu_count;
 }
 
 void bsp_smp_broadcast_interrupt(void)
diff --git a/schedsim/shell/schedsim_smpsimple/main_dispatch.c b/schedsim/shell/schedsim_smpsimple/main_dispatch.c
index 5f13da6..4c1461f 100644
--- a/schedsim/shell/schedsim_smpsimple/main_dispatch.c
+++ b/schedsim/shell/schedsim_smpsimple/main_dispatch.c
@@ -31,7 +31,7 @@ int main_dispatch(int argc, char **argv)
 
   current_cpu = Schedsim_Current_cpu;
   for ( cpu=0 ; cpu < _SMP_Processor_count ; cpu++ ) {
-    if ( _Per_CPU_Information[cpu].dispatch_necessary ) {
+    if ( _Per_CPU_Information[cpu].per_cpu.dispatch_necessary ) {
       printf( "=== Invoke Thread Dispatch on CPU %d\n", cpu );
        Schedsim_Current_cpu = cpu;
       _Thread_Dispatch();
diff --git a/schedsim/shell/schedsim_smpsimple/main_dump_all_cpus.c b/schedsim/shell/schedsim_smpsimple/main_dump_all_cpus.c
index 7e19065..faa4de7 100644
--- a/schedsim/shell/schedsim_smpsimple/main_dump_all_cpus.c
+++ b/schedsim/shell/schedsim_smpsimple/main_dump_all_cpus.c
@@ -36,16 +36,15 @@ int main_dump_all_cpus(int argc, char **argv)
       " SWITCH NEEDED\n"
   );
   for ( cpu=0 ; cpu < _SMP_Processor_count ; cpu++ ) {
-    e = _Per_CPU_Information[cpu].executing;
-    h = _Per_CPU_Information[cpu].heir;
-    i = _Per_CPU_Information[cpu].idle;
+    e = _Per_CPU_Information[cpu].per_cpu.executing;
+    h = _Per_CPU_Information[cpu].per_cpu.heir;
     printf(
-      "  CPU %d: 0x%08x @%3ld / 0x%08x @%3ld / 0x%08x @%3ld         %s\n",
+      "  CPU %d: 0x%08x @%3ld / 0x%08x @%3ld          %s\n",
       cpu,
       e->Object.id, (long) e->current_priority,
       h->Object.id, (long) h->current_priority,
-      i->Object.id, (long) i->current_priority,
-      ((_Per_CPU_Information[cpu].dispatch_necessary) ? "true" : "false")
+      ((_Per_CPU_Information[cpu].per_cpu.dispatch_necessary) ?
+         "true" : "false")
     );
   }
   printf( "=== End of Ready Set of Threads\n" );
diff --git a/schedsim/shell/schedsim_smpsimple/main_dump_ready_tasks.c b/schedsim/shell/schedsim_smpsimple/main_dump_ready_tasks.c
index 2ee875b..ba9a9cd 100644
--- a/schedsim/shell/schedsim_smpsimple/main_dump_ready_tasks.c
+++ b/schedsim/shell/schedsim_smpsimple/main_dump_ready_tasks.c
@@ -15,6 +15,8 @@
 
 #include "shell.h"
 #include "rtems_sched.h"
+#include <rtems/score/chainimpl.h>
+#include <rtems/score/thread.h>
 
 #include <rtems/score/schedulerpriority.h>
 
diff --git a/schedsim/shell/schedsim_smpsimple/smp_stub.c b/schedsim/shell/schedsim_smpsimple/smp_stub.c
index 581f4ac..fc9c1dd 100644
--- a/schedsim/shell/schedsim_smpsimple/smp_stub.c
+++ b/schedsim/shell/schedsim_smpsimple/smp_stub.c
@@ -15,6 +15,7 @@
 #include <stdlib.h>
 
 uint32_t Schedsim_Current_cpu;
+extern uint32_t Schedsim_Maximum_CPUs_From_Command_Line;
 
 void bsp_smp_secondary_cpu_initialize(int cpu)
 {
@@ -26,12 +27,20 @@ int bsp_smp_processor_id(void)
   return Schedsim_Current_cpu;
 }
 
-int bsp_smp_initialize(
-  int maximum
+uint32_t bsp_smp_initialize(
+  uint32_t configured_cpu_count
 )
 {
+  if ( configured_cpu_count < Schedsim_Maximum_CPUs_From_Command_Line ) {
+    printf(
+      "ERROR - Maximum cores per confdefs.h is %d\n",
+      configured_cpu_count
+    );
+    exit( 1 );
+  }
+
   /* return the number of CPUs */
-  return maximum;
+  return Schedsim_Maximum_CPUs_From_Command_Line;
 }
 
 void bsp_smp_broadcast_interrupt(void)
diff --git a/schedsim/shell/shared/main_rtemsinit.c b/schedsim/shell/shared/main_rtemsinit.c
index 51510d6..063316a 100644
--- a/schedsim/shell/shared/main_rtemsinit.c
+++ b/schedsim/shell/shared/main_rtemsinit.c
@@ -22,8 +22,11 @@
 
 #if defined(RTEMS_SMP)
   #include <rtems/score/smp.h>
+
+  uint32_t Schedsim_Maximum_CPUs_From_Command_Line;
 #endif
 
+
 int rtems_shell_main_rtems_init(
   int   argc,
   char *argv[]
@@ -37,7 +40,7 @@ int rtems_shell_main_rtems_init(
       printf( "Number of CPUs argument (%s) is not a number\n", argv[1] );
       return -1;
     }
-    rtems_configuration_smp_maximum_processors = cpus;
+    Schedsim_Maximum_CPUs_From_Command_Line = cpus;
   }
 #endif
 
diff --git a/schedsim/shell/shared/schedsim_shell.h b/schedsim/shell/shared/schedsim_shell.h
index c6de989..d1f2406 100644
--- a/schedsim/shell/shared/schedsim_shell.h
+++ b/schedsim/shell/shared/schedsim_shell.h
@@ -13,6 +13,7 @@
 #define __SCHEDSIM_SHELL_h
 
 #include <rtems.h>
+#include <rtems/score/sysstate.h>
 
 #ifdef __cplusplus
 extern "C" {




More information about the vc mailing list