summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2011-04-25 15:53:10 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2011-04-25 15:53:10 +0000
commitabb18dc4eb102a15a67990ad1b0c515176808a5b (patch)
treeaebe2dc318e747b42939afe13e9b506ddc282d66
downloadrtems-schedsim-base.tar.bz2
Initial import.initialbase
-rw-r--r--.configure.swpbin0 -> 16384 bytes
-rw-r--r--LICENSE23
-rw-r--r--Makefile.am41
-rw-r--r--SUPPORT22
-rw-r--r--VERSION0
-rw-r--r--acinclude.m4399
-rw-r--r--aclocal/bsp-alias.m422
-rw-r--r--aclocal/canonical-target-name.m425
-rw-r--r--aclocal/check-bsps.m427
-rw-r--r--aclocal/check-custom-bsp.m419
-rw-r--r--aclocal/enable-cxx.m413
-rw-r--r--aclocal/enable-multiprocessing.m413
-rw-r--r--aclocal/enable-networking.m415
-rw-r--r--aclocal/enable-posix.m423
-rw-r--r--aclocal/enable-rtems-debug.m412
-rw-r--r--aclocal/enable-rtemsbsp.m417
-rw-r--r--aclocal/enable-rtemsdir.m416
-rw-r--r--aclocal/enable-smp.m418
-rw-r--r--aclocal/enable-tests.m413
-rw-r--r--aclocal/multilib.m417
-rw-r--r--aclocal/path-ksh.m414
-rw-r--r--aclocal/project-root.m425
-rw-r--r--aclocal/quoting.m441
-rw-r--r--aclocal/rpm.m420
-rw-r--r--aclocal/rtems-top.m436
-rw-r--r--aclocal/tool-paths.m423
-rw-r--r--aclocal/version.m44
-rw-r--r--automake/host.am10
-rw-r--r--automake/local.am7
-rw-r--r--automake/subdirs.am32
-rw-r--r--configure.ac57
-rw-r--r--schedsim/.cvsignore16
-rw-r--r--schedsim/ChangeLog21
-rw-r--r--schedsim/Makefile.am12
-rw-r--r--schedsim/README100
-rw-r--r--schedsim/configure.ac48
-rw-r--r--schedsim/rtems/.cvsignore2
-rw-r--r--schedsim/rtems/ChangeLog29
-rw-r--r--schedsim/rtems/Makefile.am395
-rw-r--r--schedsim/rtems/interr.c71
-rw-r--r--schedsim/rtems/rtems_init.c110
-rw-r--r--schedsim/rtems/rtems_sched.h27
-rw-r--r--schedsim/rtems/sched_cpu/cpu.c169
-rw-r--r--schedsim/rtems/sched_cpu/cpu_asm.c188
-rw-r--r--schedsim/rtems/sched_cpu/rtems/asm.h127
-rw-r--r--schedsim/rtems/sched_cpu/rtems/score/cpu.h1264
-rw-r--r--schedsim/rtems/sched_cpu/rtems/score/cpu_asm.h74
-rw-r--r--schedsim/rtems/sched_cpu/rtems/score/cpuopts.h72
-rw-r--r--schedsim/rtems/sched_cpu/rtems/score/no_cpu.h59
-rw-r--r--schedsim/rtems/sched_cpu/rtems/score/types.h51
-rw-r--r--schedsim/rtems/sched_cpu/rtems/stringto.h1
-rw-r--r--schedsim/rtems/wkspace.c100
-rw-r--r--schedsim/shell/.cvsignore2
-rw-r--r--schedsim/shell/ChangeLog37
-rw-r--r--schedsim/shell/Makefile.am12
-rw-r--r--schedsim/shell/schedsim_priority/.cvsignore2
-rw-r--r--schedsim/shell/schedsim_priority/Makefile.am32
-rw-r--r--schedsim/shell/schedsim_priority/config.c7
-rw-r--r--schedsim/shell/schedsim_priority/printheir_executing.c31
-rw-r--r--schedsim/shell/schedsim_priority/scenarios/script0111
-rw-r--r--schedsim/shell/schedsim_priority/scenarios/script029
-rw-r--r--schedsim/shell/schedsim_priority/scenarios/script0319
-rw-r--r--schedsim/shell/schedsim_priority/scenarios/script0410
-rw-r--r--schedsim/shell/schedsim_priority/scenarios/script0522
-rw-r--r--schedsim/shell/schedsim_priority/scenarios/script0614
-rw-r--r--schedsim/shell/schedsim_priority/schedsim.cc169
-rw-r--r--schedsim/shell/schedsim_priority/wrap_thread_dispatch.c42
-rw-r--r--schedsim/shell/shared/.cvsignore2
-rw-r--r--schedsim/shell/shared/Makefile.am61
-rw-r--r--schedsim/shell/shared/commands.c73
-rw-r--r--schedsim/shell/shared/getopt.c477
-rw-r--r--schedsim/shell/shared/include/newlib/_ansi.h99
-rw-r--r--schedsim/shell/shared/include/newlib/getopt.h167
-rw-r--r--schedsim/shell/shared/include/shell.h61
-rw-r--r--schedsim/shell/shared/lookup_semaphore.c15
-rw-r--r--schedsim/shell/shared/lookup_task.c58
-rw-r--r--schedsim/shell/shared/main_clocktick.c77
-rw-r--r--schedsim/shell/shared/main_echo.c140
-rw-r--r--schedsim/shell/shared/main_executing.c42
-rw-r--r--schedsim/shell/shared/main_heir.c42
-rw-r--r--schedsim/shell/shared/main_help.c150
-rw-r--r--schedsim/shell/shared/main_rtemsinit.c43
-rw-r--r--schedsim/shell/shared/main_semcreate.c124
-rw-r--r--schedsim/shell/shared/main_semdelete.c70
-rw-r--r--schedsim/shell/shared/main_semflush.c69
-rw-r--r--schedsim/shell/shared/main_semobtain.c87
-rw-r--r--schedsim/shell/shared/main_semrelease.c69
-rw-r--r--schedsim/shell/shared/main_taskcreate.c113
-rw-r--r--schedsim/shell/shared/main_taskdelete.c70
-rw-r--r--schedsim/shell/shared/main_taskmode.c113
-rw-r--r--schedsim/shell/shared/main_taskpriority.c83
-rw-r--r--schedsim/shell/shared/main_taskresume.c70
-rw-r--r--schedsim/shell/shared/main_tasksuspend.c69
-rw-r--r--schedsim/shell/shared/main_taskwakeafter.c77
-rw-r--r--schedsim/shell/shared/schedsim_shell.h64
-rw-r--r--schedsim/shell/shared/shell_cmdset.c229
-rw-r--r--schedsim/shell/shared/shell_makeargs.c68
97 files changed, 7241 insertions, 0 deletions
diff --git a/.configure.swp b/.configure.swp
new file mode 100644
index 0000000..c15b5d8
--- /dev/null
+++ b/.configure.swp
Binary files differ
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..7487195
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,23 @@
+#
+# $Id$
+#
+ LICENSE INFORMATION
+
+RTEMS is free software; you can redistribute it and/or modify it under
+terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version. RTEMS is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details. You should have received
+a copy of the GNU General Public License along with RTEMS; see
+file COPYING. If not, write to the Free Software Foundation, 675
+Mass Ave, Cambridge, MA 02139, USA.
+
+As a special exception, including RTEMS header files in a file,
+instantiating RTEMS generics or templates, or linking other files
+with RTEMS objects to produce an executable application, does not
+by itself cause the resulting executable application to be covered
+by the GNU General Public License. This exception does not
+however invalidate any other reasons why the executable file might be
+covered by the GNU Public License.
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..f3768d7
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,41 @@
+#
+# top level directory for RTEMS build tree
+#
+##
+## $Id$
+##
+
+ACLOCAL_AMFLAGS = -I aclocal
+
+SUBDIRS = $(build_SUBDIRS) $(host_SUBDIRS) $(target_SUBDIRS)
+DIST_SUBDIRS = $(SUBDIRS)
+
+EXTRA_DIST = SUPPORT VERSION LICENSE
+EXTRA_DIST += ampolish3
+
+dist-hook:
+ @files=`(cd $(srcdir); find doc cpukit c testsuites tools \
+ -name configure.ac -print | sed 's,/configure.ac,,' | sort)`; \
+ for i in $$files; do \
+ if test -f $(distdir)/$$i/configure.ac; then : ; \
+ else \
+ d=`dirname $(distdir)/$$i`; \
+ $(MKDIR_P) $$d;\
+ echo "cp -pR $(srcdir)/$$i $(distdir)/$$i"; \
+ cp -pR $(srcdir)/$$i $(distdir)/$$i; \
+ fi; \
+ done
+ rm -rf `find $(distdir) -name 'autom4te*'`
+ rm -rf `find $(distdir) -name CVS`
+ rm -f `find $(distdir) \( -name .cvsignore \
+ -o -name config.status \
+ -o -name config.log \)`
+ rm -f `find $(distdir) \( -name '*.bak' \
+ -o -name 'changes' -o -name 'diff' -o -name 'tmp' -o -name 'log' \
+ -o -name '*~' -o -name '.*~' -o -name '.#*' \)`
+ find $(distdir) -name '*.in' -print | while read a; do \
+ f=`echo $$a | sed 's,\.in$$,,'`; \
+ if test -f $$f; then echo "rm $$f"; rm $$f; fi; done
+
+include $(top_srcdir)/automake/subdirs.am
+include $(top_srcdir)/automake/host.am
diff --git a/SUPPORT b/SUPPORT
new file mode 100644
index 0000000..6e86c1a
--- /dev/null
+++ b/SUPPORT
@@ -0,0 +1,22 @@
+#
+# $Id$
+#
+
+On-Line Applications Research Corporation (OAR) offers support,
+customization, and training for RTEMS. Custom RTEMS development services
+includes porting RTEMS to new processors and the development of custom board
+support packages and device drivers. In addition, OAR is available
+to assist in the development of your real-time embedded application.
+
+For more information, email Joel Sherrill joel.sherrill@OARcorp.com
+or contact OAR at:
+
+On-Line Applications Research Corporation
+7047 Old Madison Pike Suite 320
+Huntsville AL 35806
+Voice: (205) 722-9985
+Fax: (205 722-0985
+
+RTEMS maintenance and development is funded solely by RTEMS users.
+The future of RTEMS depends on its user base.
+
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/VERSION
diff --git a/acinclude.m4 b/acinclude.m4
new file mode 100644
index 0000000..896710b
--- /dev/null
+++ b/acinclude.m4
@@ -0,0 +1,399 @@
+## All directories belong in one of 3 categories.
+## ${HOST_CONFIGDIRS_LIST} is directories we build using the host tools.
+## ${TARGET_CONFIGDIRS_LIST} is directories we build using the target tools.
+## ${BUILD_CONFIGDIRS_LIST} is directories we build using the build tools
+
+AC_PREREQ(2.60)
+
+dnl RTEMS_ARG_VAR(VAR,HELP-STRING)
+dnl An internal macros to have help strings pretty
+dnl printed with configure --help, without letting autoconf spoil config subdir
+dnl environments by trying to propagate them
+dnl Stripped down version of autoconf-2.52's AC_ARG_VAR.
+
+AC_DEFUN([_RTEMS_ARG_VAR],
+[
+m4_expand_once([m4_divert_once([HELP_VAR],
+[AS_HELP_STRING([$1], [$2], [ ])])],
+ [$0($1)])dnl
+])
+
+AC_DEFUN([_RTEMS_SUBST_IFNOT],
+[AS_IF([`echo " [$]$1 " | grep " $2 " > /dev/null`],
+ [],
+ [AC_SUBST([$1],["[$]$1 $2"])])
+])
+
+AC_DEFUN([_RTEMS_TOOLS],
+[
+m4_ifdef([_RTEMS_$2_CONFIGDIRS_LIST],
+[
+_RTEMS_ARG_VAR([CC_FOR_$2],
+ [c-compiler to be used for $1 subdirs (default: auto-detected)])
+_RTEMS_ARG_VAR([CFLAGS_FOR_$2],
+ [c-flags to be used for $1 subdirs (default: provided by autoconf)])
+_RTEMS_ARG_VAR([CXX_FOR_$2],
+ [c++-compiler to be used for $1 subdirs (default: auto-detected)])
+_RTEMS_ARG_VAR([CXXFLAGS_FOR_$2],
+ [c++-flags to be used for $1 subdirs (default: provided by autoconf)])
+])
+])
+
+AC_DEFUN([_RTEMS_COMMANDS_POST_CONFIG_SUBDIRS],
+[
+AC_CONFIG_COMMANDS_PRE([
+
+if test -z "${build_alias}"; then
+# build_alias is empty
+ if test -z "${host_alias}"; then
+ # host_alias is empty
+ if test -z "${target_alias}"; then
+ : target_alias is empty
+ else
+ : target_alias is not empty
+ fi
+ else
+ # host_alias is not empty
+ if test -z "${target_alias}"; then
+ : target_alias is empty
+ target_alias="${host_alias}"
+ else
+ : target_alias is not empty
+ fi
+ fi
+else
+# build_alias is not empty
+ if test -z "${host_alias}"; then
+ # host_alias is empty
+ if test -z "${target_alias}"; then
+ : target_alias is empty
+ else
+ : target_alias is not empty
+ fi
+ else
+ # host_alias is not empty
+ if test -z "${target_alias}"; then
+ : target_alias is empty
+ target_alias="${host_alias}"
+ else
+ : target_alias is not empty
+ fi
+ fi
+fi
+
+_RTEMS_BUILD_CONFIG_PREPARE
+_RTEMS_HOST_CONFIG_PREPARE
+_RTEMS_TARGET_CONFIG_PREPARE
+
+build_subdir="."
+build_SUBDIRS="${build_configdirs}"
+build_configdirs="${build_configdirs}"
+
+AS_IF([test $build != $host],
+[dnl
+ host_subdir="${host_alias-$host}"
+ host_SUBDIRS=`echo "${host_configdirs}" | \
+ sed -e "s%\([[^ ]][[^ ]]*\)%$host_subdir/\1%g"`
+ host_configdirs="${host_configdirs}"
+],[dnl
+ host_SUBDIRS="${host_configdirs}"
+ host_configdirs="${host_configdirs}"
+])
+
+AS_IF([test $build != $target],
+[dnl
+ target_subdir="${target_alias-$target}"
+ target_SUBDIRS=`echo "${target_configdirs}" | \
+ sed -e "s%\([[^ ]][[^ ]]*\)%$target_subdir/\1%g"`
+ target_configdirs="${target_configdirs}"
+],[dnl
+ target_SUBDIRS="${target_configdirs}"
+ target_configdirs="${target_configdirs}"
+])
+
+AC_SUBST(host_SUBDIRS)
+AC_SUBST(target_SUBDIRS)
+AC_SUBST(build_SUBDIRS)
+])
+
+ AC_CONFIG_COMMANDS_POST([
+ _RTEMS_OUTPUT_SUBDIRS([build],[BUILD])
+ _RTEMS_OUTPUT_SUBDIRS([host],[HOST])
+ _RTEMS_OUTPUT_SUBDIRS([target],[TARGET])
+ ])
+])
+
+dnl _RTEMS_SRCPATHS(BUILD-DIR-NAME)
+dnl ----------------------------
+dnl Inputs:
+dnl - BUILD-DIR-NAME is `top-build -> build' and `top-src -> src'
+dnl - `$srcdir' is `top-build -> top-src'
+dnl
+dnl Outputs:
+dnl - `ac_builddir' is `.', for symmetry only.
+dnl - `ac_top_builddir' is `build -> top_build'.
+dnl If not empty, has a trailing slash.
+dnl - `ac_srcdir' is `build -> src'.
+dnl - `ac_top_srcdir' is `build -> top-src'.
+dnl
+dnl and `ac_buildpath' etc., the absolute paths.
+m4_define([_RTEMS_SRCPATHS],
+[
+m4_if([$2],,
+[dstdir=$1],
+[case "$2" in
+"." | "" ) # No subdir was given
+ dstdir=$1;;
+* ) # A subdir was given
+ dstdir=$2/$1;;
+esac])
+ac_builddir=.
+
+AS_IF([test $dstdir != .],
+[ # Strip off leading ./
+ ac_builddir_suffix=/`echo $dstdir | sed 's,^\.[[\\/]],,'`
+ ac_srcdir_suffix=/`echo $1 | sed 's,^\.[[\\/]],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_builddir_suffix" | sed 's,/[[^\\/]]*,../,g'`
+],[
+ ac_dir_suffix= ac_top_builddir=
+])
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [[\\/]]* | ?:[[\\/]]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_srcdir_suffix;
+ ac_top_srcdir=$srcdir;
+ ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_srcdir_suffix;
+ ac_top_srcdir=$ac_top_builddir$srcdir;
+ ;;
+esac
+dnl Don't blindly perform a `cd $1/$ac_foo && pwd` since $ac_foo can be
+dnl absolute.
+
+ac_buildpath=`cd $dstdir && cd $ac_builddir && pwd`
+ac_top_buildpath=`cd $dstdir && cd $ac_top_builddir && pwd`
+ac_srcpath=`cd $dstdir && cd $ac_srcdir && pwd`
+ac_top_srcpath=`cd $dstdir && cd $ac_top_srcdir && pwd`
+])# _AC_SRCPATHS
+
+dnl _RTEMS_OUTPUT_SUBDIRS([host|target|build],[HOST|TARGET|BUILD])
+AC_DEFUN([_RTEMS_OUTPUT_SUBDIRS],[
+m4_ifdef([_RTEMS_$2_CONFIGDIRS_LIST],
+[
+if test "$no_recursion" != yes; then
+
+ if test -n "${$1_SUBDIRS}"; then
+ ac_sub_configure_args="[$]$1args"
+
+ # Always prepend --prefix to ensure using the same prefix
+ # in subdir configurations.
+ ac_sub_configure_args="'--prefix=$prefix' $ac_sub_configure_args"
+
+ # make sure that $1_subdir is not empty
+ test -n "$$1_subdir" || $1_subdir="."
+
+ case "$$1_subdir" in
+ "." ) ;;
+ * )
+ ac_sub_configure_args="$ac_sub_configure_args '--with-target-subdir=$$1_subdir'"
+ ac_sub_configure_args="$ac_sub_configure_args '--exec-prefix=${prefix}/$$1_subdir'"
+ ac_sub_configure_args="$ac_sub_configure_args '--includedir=${prefix}/$$1_subdir/include'"
+ ;;
+ esac
+
+ ac_popdir=`pwd`
+ for ac_dir in : $$1_configdirs; do test "x$ac_dir" = x: && continue
+
+ # Do not complain, so a configure script can configure whichever
+ # parts of a large source tree are present.
+ test -d $srcdir/$ac_dir || continue
+
+ AC_MSG_NOTICE([configuring in $$1_subdir/$ac_dir])
+ AS_MKDIR_P(["$$1_subdir/$ac_dir"])
+ _RTEMS_SRCPATHS(["$ac_dir"],["$$1_subdir"])
+
+ cd $$1_subdir/$ac_dir
+
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_srcdir/configure.gnu; then
+ ac_sub_configure="$SHELL '$ac_srcdir/configure.gnu'"
+ elif test -f $ac_srcdir/configure; then
+ ac_sub_configure="$SHELL '$ac_srcdir/configure'"
+ elif test -f $ac_srcdir/configure.in; then
+ ac_sub_configure=$ac_configure
+ else
+ AC_MSG_WARN([no configuration information is in $ac_dir])
+ ac_sub_configure=
+ fi
+
+ # The recursion is here.
+ if test -n "$ac_sub_configure"; then
+ # Make the cache file name correct relative to the subdirectory.
+ case $cache_file in
+ [[\\/]]* | ?:[[\\/]]* ) ac_sub_cache_file=$cache_file ;;
+ *) # Relative path.
+ ac_sub_cache_file=$ac_top_builddir$cache_file ;;
+ esac
+
+ ac_sub_configure_vars=
+ ac_sub_configure_vars="$ac_sub_configure_vars '--cache-file=$ac_sub_cache_file'"
+ ac_sub_configure_vars="$ac_sub_configure_vars '--srcdir=$ac_srcdir'"
+
+ test -n "[$]CC_FOR_$2" && \
+ ac_sub_configure_vars="$ac_sub_configure_vars 'CC=[$]CC_FOR_$2'"
+ test -n "[$]CXX_FOR_$2" && \
+ ac_sub_configure_vars="$ac_sub_configure_vars 'CXX=[$]CXX_FOR_$2'"
+ test -n "[$]CFLAGS_FOR_$2" && \
+ ac_sub_configure_vars="$ac_sub_configure_vars 'CFLAGS=[$]CFLAGS_FOR_$2'"
+ test -n "[$]CXXFLAGS_FOR_$2" && \
+ ac_sub_configure_vars="$ac_sub_configure_vars 'CXXFLAGS=[$]CXXFLAGS_FOR_$2'"
+
+ # The eval makes quoting arguments work.
+ AC_MSG_NOTICE([running $ac_sub_configure $ac_sub_configure_args $ac_sub_configure_vars])
+ eval $ac_sub_configure $ac_sub_configure_args $ac_sub_configure_vars ||
+ AC_MSG_ERROR([$ac_sub_configure failed for $ac_dir])
+ fi
+
+ cd "$ac_popdir"
+ done
+ fi
+fi
+])
+])
+
+AC_DEFUN([_RTEMS_CONFIGURE_ARGS_PRUNE],
+[
+$1_prune()
+{
+ $1=
+ for ac_arg
+ do
+ if test -n "$ac_prev"; then
+ ac_prev=
+ continue
+ fi
+ case $ac_arg in
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \
+ | --c=*)
+ ;;
+ --config-cache | -C)
+ ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ ;;
+
+ -host* | --host* );;
+ -host | --host )
+ ac_prev=host_alias;;
+ -target* | --target* );;
+ -target | --target )
+ ac_prev=target_alias;;
+ -build* | --build* );;
+ -build | --build )
+ ac_prev=build_alias;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ ;;
+
+ *_alias=* );;
+
+ m4_if([$2],,,[$2])
+ *) $1="$$1 '$ac_arg'" ;;
+ esac
+ done
+ export $1
+}
+])
+
+## PUBLIC: RTEMS_BUILD_CONFIG_SUBDIRS(build_subdir)
+# subdirs to be built for the build environment
+AC_DEFUN([RTEMS_BUILD_CONFIG_SUBDIRS],[
+m4_append([_RTEMS_BUILD_CONFIGDIRS_LIST],[ $1])
+dnl Always append to build_configdirs
+AC_SUBST(build_configdirs,"$build_configdirs $1")
+
+m4_divert_text([DEFAULTS],
+ [ac_subdirs_all="$ac_subdirs_all m4_normalize([$1])"])
+m4_expand_once([_RTEMS_COMMANDS_POST_CONFIG_SUBDIRS])
+])
+
+AC_DEFUN([_RTEMS_BUILD_CONFIG_PREPARE],[
+## # Record the configure arguments in Makefile.
+m4_ifdef([_RTEMS_BUILD_CONFIGDIRS_LIST],
+[
+m4_expand_once([_RTEMS_TOOLS([build],[BUILD])])
+m4_expand_once([_RTEMS_CONFIGURE_ARGS_PRUNE([buildargs])])
+eval buildargs_prune $ac_configure_args
+buildargs="'--host=${build_alias-$build}' '--build=${build_alias-$build}' ${buildargs}"
+buildargs="${buildargs} '--target=${target_alias-$target}'"
+],[])
+AC_SUBST(buildargs)
+AC_SUBST(build_subdir)
+])
+
+## PUBLIC: RTEMS_HOST_CONFIG_SUBDIRS(host_subdir)
+# subdirs to be build for the host environment
+AC_DEFUN([RTEMS_HOST_CONFIG_SUBDIRS],[
+m4_append([_RTEMS_HOST_CONFIGDIRS_LIST],[ $1])dnl
+
+_RTEMS_SUBST_IFNOT([host_configdirs],[$1])
+
+m4_divert_text([DEFAULTS],
+ [ac_subdirs_all="$ac_subdirs_all m4_normalize([$1])"])
+m4_expand_once([_RTEMS_COMMANDS_POST_CONFIG_SUBDIRS])
+])
+
+AC_DEFUN([_RTEMS_HOST_CONFIG_PREPARE],[
+m4_ifdef([_RTEMS_HOST_CONFIGDIRS_LIST],
+[
+m4_expand_once([_RTEMS_TOOLS([host],[HOST])])
+m4_expand_once([_RTEMS_CONFIGURE_ARGS_PRUNE([hostargs])])
+eval hostargs_prune $ac_configure_args
+hostargs="'--host=${host_alias-$host}' '--build=${build_alias-$build}' '--target=${target_alias-$target}' ${hostargs}"
+],[])
+AC_SUBST(hostargs)
+AC_SUBST(host_subdir)
+])
+
+## PUBLIC: RTEMS_TARGET_CONFIG_SUBDIRS(target_subdir)
+# subdirs to be build for the target environment
+AC_DEFUN([RTEMS_TARGET_CONFIG_SUBDIRS],[
+AS_IF([test -d ${srcdir}/$1],[
+m4_append([_RTEMS_TARGET_CONFIGDIRS_LIST],[ $1])
+
+_RTEMS_SUBST_IFNOT([target_configdirs],[$1])
+
+m4_divert_text([DEFAULTS],
+ [ac_subdirs_all="$ac_subdirs_all m4_normalize([$1])"])
+m4_expand_once([_RTEMS_COMMANDS_POST_CONFIG_SUBDIRS])
+ ])
+])
+
+AC_DEFUN([_RTEMS_TARGET_CONFIG_PREPARE],[
+m4_ifdef([_RTEMS_TARGET_CONFIGDIRS_LIST],
+[
+m4_expand_once([_RTEMS_TOOLS([target],[TARGET])])
+m4_expand_once([_RTEMS_CONFIGURE_ARGS_PRUNE([targetargs])])
+eval targetargs_prune $ac_configure_args
+targetargs="'--host=${target_alias-$target}' '--build=${build_alias-$build}' '--target=${target_alias-$target}' ${targetargs}"
+],[])
+AC_SUBST(targetargs)
+AC_SUBST(target_subdir)
+])
diff --git a/aclocal/bsp-alias.m4 b/aclocal/bsp-alias.m4
new file mode 100644
index 0000000..8a9b21a
--- /dev/null
+++ b/aclocal/bsp-alias.m4
@@ -0,0 +1,22 @@
+dnl
+dnl $Id$
+dnl
+
+dnl _RTEMS_BSP_ALIAS(BSP_ALIAS,RTEMS_BSP_FAMILY)
+dnl Internal subroutine to RTEMS_BSP_ALIAS
+AC_DEFUN([_RTEMS_BSP_ALIAS],
+[# account for "aliased" bsps which share source code
+ for bsp_cfgs in `ls "$srcdir"/"$RTEMS_TOPdir"/c/src/lib/libbsp/"$RTEMS_CPU"/*/"make/custom/$1.cfg" 2>/dev/null`; do
+ $2=`echo "$bsp_cfgs" | sed \
+ -e "s,^$srcdir/$RTEMS_TOPdir/c/src/lib/libbsp/$RTEMS_CPU/,," \
+ -e "s,/make/custom/.*\.cfg$,,"`
+ break
+ done
+])
+
+dnl RTEMS_BSP_ALIAS(BSP_ALIAS,RTEMS_BSP_FAMILY)
+dnl convert a bsp alias $1 into its bsp directory RTEMS_BSP_FAMILY
+AC_DEFUN([RTEMS_BSP_ALIAS],
+[_RTEMS_BSP_ALIAS(m4_if([$1],,[$RTEMS_BSP],[$1]),
+ m4_if([$2],,[RTEMS_BSP_FAMILY],[$2]))]
+)
diff --git a/aclocal/canonical-target-name.m4 b/aclocal/canonical-target-name.m4
new file mode 100644
index 0000000..ea55376
--- /dev/null
+++ b/aclocal/canonical-target-name.m4
@@ -0,0 +1,25 @@
+dnl
+dnl $Id$
+dnl
+
+dnl canonicalize target cpu
+dnl NOTE: Most rtems targets do not fullfil autoconf's
+dnl target naming conventions "processor-vendor-os"
+dnl Therefore autoconf's AC_CANONICAL_TARGET will fail for them
+dnl and we have to fix it for rtems ourselves
+
+AC_DEFUN([RTEMS_CANONICAL_TARGET_CPU],
+[
+AC_CANONICAL_TARGET
+AC_MSG_CHECKING(rtems target cpu)
+case "${target}" in
+ no_cpu-*rtems*)
+ RTEMS_CPU=no_cpu
+ ;;
+ *)
+ RTEMS_CPU=`echo $target | sed 's%^\([[^-]]*\)-\(.*\)$%\1%'`
+ ;;
+esac
+AC_SUBST(RTEMS_CPU)
+AC_MSG_RESULT($RTEMS_CPU)
+])
diff --git a/aclocal/check-bsps.m4 b/aclocal/check-bsps.m4
new file mode 100644
index 0000000..27a4c41
--- /dev/null
+++ b/aclocal/check-bsps.m4
@@ -0,0 +1,27 @@
+dnl $Id$
+
+dnl Report all available bsps for a target within the source tree
+dnl
+dnl RTEMS_CHECK_BSPS(bsp_list)
+AC_DEFUN([RTEMS_CHECK_BSPS],
+[
+AC_REQUIRE([RTEMS_CANONICAL_TARGET_CPU])dnl sets RTEMS_CPU, target
+AC_REQUIRE([RTEMS_TOP])dnl sets RTEMS_TOPdir
+
+AC_MSG_CHECKING([for available BSPs])
+ $1=
+ for bsp_spec in `ls "$srcdir/$RTEMS_TOPdir/c/src/lib/libbsp/$RTEMS_CPU"/*/bsp_specs 2>/dev/null`; do
+ bsp_family=`echo "$bsp_spec" | sed \
+ -e "s,^$srcdir/$RTEMS_TOPdir/c/src/lib/libbsp/$RTEMS_CPU/,," \
+ -e "s,/bsp_specs$,,"`
+ for bsp_cfgs in `ls "$srcdir/$RTEMS_TOPdir/c/src/lib/libbsp/$RTEMS_CPU/$bsp_family/make/custom/"*.cfg 2>/dev/null`; do
+ bsp_cfg=`echo "$bsp_cfgs" | sed \
+ -e "s,^$srcdir/$RTEMS_TOPdir/c/src/lib/libbsp/$RTEMS_CPU/$bsp_family/make/custom/,," \
+ -e "s,\.cfg$,,"`
+ $1="[$]$1 $bsp_cfg"
+ done
+ done
+ AS_IF([test -z "[$]$1"],
+ [AC_MSG_RESULT([none])],
+ [AC_MSG_RESULT([$]$1)])
+])dnl
diff --git a/aclocal/check-custom-bsp.m4 b/aclocal/check-custom-bsp.m4
new file mode 100644
index 0000000..c4ea9d4
--- /dev/null
+++ b/aclocal/check-custom-bsp.m4
@@ -0,0 +1,19 @@
+dnl $Id$
+
+AC_DEFUN([_RTEMS_CHECK_CUSTOM_BSP],[
+AC_REQUIRE([RTEMS_CANONICAL_TARGET_CPU])dnl sets RTEMS_CPU, target
+AC_REQUIRE([RTEMS_TOP])dnl sets RTEMS_TOPdir
+ $2=
+ for i in \
+ `ls "${srcdir}/${RTEMS_TOPdir}/c/src/lib/libbsp/${RTEMS_CPU}"/*/make/custom/$1 2>/dev/null`;
+ do
+ AS_IF([test -r $i],[
+ $2="$i"
+ break;
+ ])
+ done
+])
+
+AC_DEFUN([RTEMS_CHECK_CUSTOM_BSP],[
+ _RTEMS_CHECK_CUSTOM_BSP([[$]$1],[BSP_FOUND])
+])
diff --git a/aclocal/enable-cxx.m4 b/aclocal/enable-cxx.m4
new file mode 100644
index 0000000..8648743
--- /dev/null
+++ b/aclocal/enable-cxx.m4
@@ -0,0 +1,13 @@
+dnl $Id$
+
+AC_DEFUN([RTEMS_ENABLE_CXX],
+[
+AC_ARG_ENABLE(cxx,
+[AS_HELP_STRING([--enable-cxx],
+[enable C++ support and build the rtems++ library])],
+[case "${enable_cxx}" in
+ yes) RTEMS_HAS_CPLUSPLUS=yes ;;
+ no) RTEMS_HAS_CPLUSPLUS=no ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for enable-cxx option) ;;
+esac], [RTEMS_HAS_CPLUSPLUS=no])
+])
diff --git a/aclocal/enable-multiprocessing.m4 b/aclocal/enable-multiprocessing.m4
new file mode 100644
index 0000000..175de9c
--- /dev/null
+++ b/aclocal/enable-multiprocessing.m4
@@ -0,0 +1,13 @@
+dnl $Id$
+
+AC_DEFUN([RTEMS_ENABLE_MULTIPROCESSING],
+[
+AC_ARG_ENABLE(multiprocessing,
+[AS_HELP_STRING([--enable-multiprocessing],
+[enable multiprocessing interface])],
+[case "${enable_multiprocessing}" in
+ yes) ;;
+ no) ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for enable-multiprocessing option) ;;
+esac],[enable_multiprocessing=no])
+])
diff --git a/aclocal/enable-networking.m4 b/aclocal/enable-networking.m4
new file mode 100644
index 0000000..df02ef2
--- /dev/null
+++ b/aclocal/enable-networking.m4
@@ -0,0 +1,15 @@
+dnl $Id$
+
+AC_DEFUN([RTEMS_ENABLE_NETWORKING],
+[
+## AC_BEFORE([$0], [RTEMS_CHECK_NETWORKING])dnl
+
+AC_ARG_ENABLE(networking,
+[AS_HELP_STRING([--enable-networking],[enable TCP/IP stack])],
+[case "${enableval}" in
+ yes) RTEMS_HAS_NETWORKING=yes ;;
+ no) RTEMS_HAS_NETWORKING=no ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for enable-networking option) ;;
+esac],[RTEMS_HAS_NETWORKING=yes])
+AC_SUBST(RTEMS_HAS_NETWORKING)dnl
+])
diff --git a/aclocal/enable-posix.m4 b/aclocal/enable-posix.m4
new file mode 100644
index 0000000..1d55432
--- /dev/null
+++ b/aclocal/enable-posix.m4
@@ -0,0 +1,23 @@
+dnl $Id$
+
+AC_DEFUN([RTEMS_ENABLE_POSIX],
+[
+## AC_BEFORE([$0], [RTEMS_CHECK_POSIX_API])dnl
+
+AC_ARG_ENABLE(posix,
+[AS_HELP_STRING([--enable-posix],[enable posix interface])],
+[case "${enableval}" in
+ yes) RTEMS_HAS_POSIX_API=yes ;;
+ no) RTEMS_HAS_POSIX_API=no ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for enable-posix option) ;;
+esac],[RTEMS_HAS_POSIX_API=yes])
+
+case "${host}" in
+ no_cpu-*rtems*)
+ RTEMS_HAS_POSIX_API=no
+ ;;
+ *)
+ ;;
+esac
+AC_SUBST(RTEMS_HAS_POSIX_API)
+])
diff --git a/aclocal/enable-rtems-debug.m4 b/aclocal/enable-rtems-debug.m4
new file mode 100644
index 0000000..1edcea0
--- /dev/null
+++ b/aclocal/enable-rtems-debug.m4
@@ -0,0 +1,12 @@
+## $Id$
+
+AC_DEFUN([RTEMS_ENABLE_RTEMS_DEBUG],
+[
+AC_ARG_ENABLE(rtems-debug,
+AS_HELP_STRING([--enable-rtems-debug],[enable RTEMS_DEBUG]),
+[case "${enable_rtems_debug}" in
+ yes) enable_rtems_debug=yes ;;
+ no) enable_rtems_debug=no ;;
+ *) AC_MSG_ERROR([bad value ${enable_rtems_debug} for RTEMS_DEBUG]) ;;
+esac],[enable_rtems_debug=no])
+])
diff --git a/aclocal/enable-rtemsbsp.m4 b/aclocal/enable-rtemsbsp.m4
new file mode 100644
index 0000000..d8ffc55
--- /dev/null
+++ b/aclocal/enable-rtemsbsp.m4
@@ -0,0 +1,17 @@
+dnl $Id$
+
+dnl Override the set of BSPs to be built.
+dnl used by the toplevel configure script
+dnl RTEMS_ENABLE_RTEMSBSP(rtems_bsp_list)
+AC_DEFUN([RTEMS_ENABLE_RTEMSBSP],
+[
+AC_BEFORE([$0], [RTEMS_ENV_RTEMSBSP])
+AC_ARG_ENABLE(rtemsbsp,
+[AS_HELP_STRING([--enable-rtemsbsp="bsp1 bsp2 .."],
+[BSPs to include in build])],
+[case "${enable_rtemsbsp}" in
+ yes ) enable_rtemsbsp="" ;;
+ no ) enable_rtemsbsp="no" ;;
+ *) enable_rtemsbsp="$enable_rtemsbsp" ;;
+esac],[enable_rtemsbsp=""])
+])
diff --git a/aclocal/enable-rtemsdir.m4 b/aclocal/enable-rtemsdir.m4
new file mode 100644
index 0000000..da60de7
--- /dev/null
+++ b/aclocal/enable-rtemsdir.m4
@@ -0,0 +1,16 @@
+dnl $Id$
+
+dnl XXX
+dnl RTEMS_ENABLE_RTEMSDIR(rtems_dir)
+AC_DEFUN([RTEMS_ENABLE_RTEMSDIR],
+[
+AC_BEFORE([$0], [RTEMS_SRC_DIR])
+AC_ARG_ENABLE(rtemsdir,
+[AS_HELP_STRING([--enable-rtemsdir=DIRECTORY],
+[RTEMS SOURCE DIRECTORY])],
+[case "${rtemsdir}" in
+ yes ) rtems_srcdir="" ;;
+ no ) rtems_srcdir="no" ;;
+ *) rtems_srcdir="$enableval" ;;
+esac],[rtems_srcdir=""])
+])
diff --git a/aclocal/enable-smp.m4 b/aclocal/enable-smp.m4
new file mode 100644
index 0000000..97cfef1
--- /dev/null
+++ b/aclocal/enable-smp.m4
@@ -0,0 +1,18 @@
+dnl $Id$
+
+AC_DEFUN([RTEMS_ENABLE_SMP],
+[
+## AC_BEFORE([$0], [RTEMS_CHECK_SMP])dnl
+
+AC_ARG_ENABLE(smp,
+[AS_HELP_STRING([--enable-smp],[enable smp interface])],
+[case "${enableval}" in
+ yes) case "${RTEMS_CPU}" in
+ sparc|i386) RTEMS_HAS_SMP=no ;;
+ *) RTEMS_HAS_SMP=no ;;
+ esac
+ ;;
+ no) RTEMS_HAS_SMP=no ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for enable-smp option) ;;
+esac],[RTEMS_HAS_SMP=no])
+])
diff --git a/aclocal/enable-tests.m4 b/aclocal/enable-tests.m4
new file mode 100644
index 0000000..a48168f
--- /dev/null
+++ b/aclocal/enable-tests.m4
@@ -0,0 +1,13 @@
+dnl $Id$
+
+AC_DEFUN([RTEMS_ENABLE_TESTS],
+[
+AC_ARG_ENABLE(tests,
+[AS_HELP_STRING([--enable-tests],[enable tests (default:samples)])],
+ [case "${enableval}" in
+ samples) enable_tests=samples;;
+ yes) enable_tests=yes ;;
+ no) enable_tests=no ;;
+ *) AC_MSG_ERROR([bad value ${enableval} for --enable-tests]) ;;
+ esac], [enable_tests=samples])
+])
diff --git a/aclocal/multilib.m4 b/aclocal/multilib.m4
new file mode 100644
index 0000000..0bbef95
--- /dev/null
+++ b/aclocal/multilib.m4
@@ -0,0 +1,17 @@
+dnl This provides configure definitions used for multilib support
+
+dnl parts of these macros are derived from newlib-1.8.2's multilib support
+
+AC_DEFUN([RTEMS_ENABLE_MULTILIB],
+[
+AC_ARG_ENABLE(multilib,
+AS_HELP_STRING([--enable-multilib],
+[build many library versions (default=no)]),
+[case "${enableval}" in
+ yes) multilib=yes ;;
+ no) multilib=no ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for multilib option) ;;
+ esac], [multilib=no])dnl
+
+AM_CONDITIONAL(MULTILIB,test x"${multilib}" = x"yes")
+])
diff --git a/aclocal/path-ksh.m4 b/aclocal/path-ksh.m4
new file mode 100644
index 0000000..306c4ca
--- /dev/null
+++ b/aclocal/path-ksh.m4
@@ -0,0 +1,14 @@
+dnl $Id$
+
+AC_DEFUN([RTEMS_PATH_KSH],
+[
+dnl NOTE: prefer bash over ksh over sh
+AC_PATH_PROGS(KSH,bash ksh sh)
+if test -z "$KSH"; then
+dnl NOTE: This cannot happen -- /bin/sh must always exist
+AC_MSG_ERROR(
+[***]
+[ Cannot determine a usable shell bash/ksh/sh]
+[ Please contact your system administrator] );
+fi
+])
diff --git a/aclocal/project-root.m4 b/aclocal/project-root.m4
new file mode 100644
index 0000000..11643b9
--- /dev/null
+++ b/aclocal/project-root.m4
@@ -0,0 +1,25 @@
+dnl
+dnl $Id$
+dnl
+
+dnl
+dnl PROJECT_TOPdir .. relative path to the top of the build-tree
+dnl PROJECT_ROOT .. relative path to the top of the temporary
+dnl installation directory inside the build-tree
+dnl RTEMS_TOPdir .. relative path of a subpackage's configure.in to the
+dnl toplevel configure.in of the source-tree
+dnl RTEMS_ROOT .. path to the top of a bsp's build directory
+dnl [Applied by custom/*.cfg, depredicated otherwise]
+dnl
+
+AC_DEFUN([RTEMS_PROJECT_ROOT],
+[dnl
+AC_REQUIRE([RTEMS_TOP])
+
+PACKHEX="\$(PROJECT_TOPdir)/tools/build/packhex"
+AC_SUBST(PACKHEX)
+
+BIN2C="\$(PROJECT_TOPdir)/tools/build/rtems-bin2c"
+AC_SUBST(BIN2C)
+])
+
diff --git a/aclocal/quoting.m4 b/aclocal/quoting.m4
new file mode 100644
index 0000000..0a95ae3
--- /dev/null
+++ b/aclocal/quoting.m4
@@ -0,0 +1,41 @@
+dnl RTEMS_CONFIGURE_ARGS_QUOTE(dnl RETURN_VAR, [ADDITIONAL_CASES], [VAR_TO_PROCESS]])
+dnl
+AC_DEFUN([_RTEMS_CONFIGURE_ARGS_QUOTE],
+[
+$1_prune()
+{
+ # Remove --cache-file and --srcdir arguments so they do not pile up.
+ $1=
+ ac_prev=
+ for ac_arg
+ do
+ if test -n "$ac_prev"; then
+ ac_prev=
+ continue
+ fi
+ case $ac_arg in
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \
+ | --c=*)
+ ;;
+ --config-cache | -C)
+ ;;
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ ;;
+ m4_if([$2],,,[$2])
+ *) $1="$$1 '$ac_arg'" ;;
+ esac
+ done
+ export $1
+}
+])
+
+AC_DEFUN([RTEMS_CONFIGURE_ARGS_QUOTE],[
+m4_expand_once([_RTEMS_CONFIGURE_ARGS_QUOTE([$1],[$2])])
+eval $1_prune m4_if([$3],,[$ac_configure_args],[[$]$3])
+])
diff --git a/aclocal/rpm.m4 b/aclocal/rpm.m4
new file mode 100644
index 0000000..1f2015b
--- /dev/null
+++ b/aclocal/rpm.m4
@@ -0,0 +1,20 @@
+AC_DEFUN([RTEMS_ENABLE_RPMPREFIX],[
+AC_ARG_ENABLE([rpmprefix],
+[ --enable-rpmprefix=<rpmprefix> prefix rpms],
+[case $enable_rpmprefix in
+yes ) rpmprefix="rtems-"]_RTEMS_API["-";;
+no ) rpmprefix="%{nil}";;
+* ) AS_IF([test -z "$enable_rpmprefix"],
+ [rpmprefix="%{nil}"],
+ [rpmprefix="$enable_rpmprefix"]);;
+esac],
+[rpmprefix="rtems-"]_RTEMS_API["-"])
+
+AC_ARG_ENABLE([osversions],
+[ --enable-osversions whether to use version numbers in os-tripples],
+[case $enable_osversions in
+yes ) osversion=_RTEMS_API;;
+* ) osversion=;;
+esac],
+[osversion=_RTEMS_API])
+])
diff --git a/aclocal/rtems-top.m4 b/aclocal/rtems-top.m4
new file mode 100644
index 0000000..c6acfd1
--- /dev/null
+++ b/aclocal/rtems-top.m4
@@ -0,0 +1,36 @@
+dnl $Id$
+
+# AC_DISABLE_OPTION_CHECKING is not available before 2.62
+AC_PREREQ(2.62)
+
+dnl
+dnl RTEMS_TOP($1)
+dnl
+dnl $1 .. relative path from this configure.in to the toplevel configure.in
+dnl
+AC_DEFUN([RTEMS_TOP],
+[dnl
+AC_REQUIRE([RTEMS_VERSIONING])
+AC_REQUIRE([AC_DISABLE_OPTION_CHECKING])
+AC_CONFIG_AUX_DIR([$1])
+AC_CHECK_PROGS(MAKE, gmake make)
+AC_BEFORE([$0], [AM_INIT_AUTOMAKE])dnl
+
+AC_PREFIX_DEFAULT([/opt/rtems-][_RTEMS_API])
+
+RTEMS_TOPdir="$1";
+AC_SUBST(RTEMS_TOPdir)
+
+dots=`echo $with_target_subdir|\
+sed -e 's,^\.$,,' -e 's%^\./%%' -e 's%[[^/]]$%&/%' -e 's%[[^/]]*/%../%g'`
+PROJECT_TOPdir=${dots}${RTEMS_TOPdir}/'$(top_builddir)'
+AC_SUBST(PROJECT_TOPdir)
+
+PROJECT_ROOT="${RTEMS_TOPdir}/\$(top_builddir)"
+AC_SUBST(PROJECT_ROOT)
+
+AC_MSG_CHECKING([for RTEMS Version])
+AC_MSG_RESULT([_RTEMS_VERSION])
+pkgdatadir="${datadir}"/rtems[]_RTEMS_API;
+AC_SUBST([pkgdatadir])
+])dnl
diff --git a/aclocal/tool-paths.m4 b/aclocal/tool-paths.m4
new file mode 100644
index 0000000..ff6e5f8
--- /dev/null
+++ b/aclocal/tool-paths.m4
@@ -0,0 +1,23 @@
+AC_DEFUN([RTEMS_TOOLPATHS],
+[
+# tooldir='$(exec_prefix)/'$target_alias
+# Temporary work-around until building in source tree is supported
+AC_REQUIRE([RTEMS_PROJECT_ROOT])
+
+tooldir='$(PROJECT_ROOT)'
+AC_SUBST(tooldir)
+
+project_includedir='$(tooldir)'/include
+AC_SUBST(project_includedir)
+
+project_libdir='$(tooldir)/lib$(MULTISUBDIR)'
+AC_SUBST(project_libdir)
+
+project_bindir='$(tooldir)/bin'
+AC_SUBST(project_bindir)
+
+rtems_bspdir='$(prefix)/${RTEMS_BSP}'
+AC_SUBST(rtems_bspdir)
+rtems_makedir='$(prefix)/make'
+AC_SUBST(rtems_makedir)
+])
diff --git a/aclocal/version.m4 b/aclocal/version.m4
new file mode 100644
index 0000000..6ca81ac
--- /dev/null
+++ b/aclocal/version.m4
@@ -0,0 +1,4 @@
+AC_DEFUN([RTEMS_VERSIONING],
+m4_define([_RTEMS_VERSION],[4.10.99.0]))
+
+m4_define([_RTEMS_API],[4.11])
diff --git a/automake/host.am b/automake/host.am
new file mode 100644
index 0000000..4a7aa2d
--- /dev/null
+++ b/automake/host.am
@@ -0,0 +1,10 @@
+## $Id$
+
+## NOTE: This is a temporary work-around to keep
+## RTEMS's non automake standard make targets working.
+## Once automake is fully integrated these make targets
+## and this file will probably be removed
+
+preinstall-am: $(PREINSTALL_FILES)
+preinstall: preinstall-am
+.PHONY: preinstall preinstall-am
diff --git a/automake/local.am b/automake/local.am
new file mode 100644
index 0000000..c170178
--- /dev/null
+++ b/automake/local.am
@@ -0,0 +1,7 @@
+## $Id$
+
+preinstall-am: $(PREINSTALL_FILES)
+preinstall: preinstall-am
+.PHONY: preinstall preinstall-am
+
+PROJECT_TOOLS = $(PROJECT_RELEASE)/build-tools
diff --git a/automake/subdirs.am b/automake/subdirs.am
new file mode 100644
index 0000000..00eba7c
--- /dev/null
+++ b/automake/subdirs.am
@@ -0,0 +1,32 @@
+## $Id$
+
+## Borrowed from automake-1.4 and adapted to RTEMS
+
+## NOTE: This is a temporary work-around to keep
+## RTEMS's non automake standard make targets working.
+## Once automake is fully integrated these make targets
+## and this file will probably be removed
+
+preinstall-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+## This trick allows "-k" to keep its natural meaning when running a
+## recursive rule.
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+preinstall: preinstall-recursive
+.PHONY: preinstall-recursive
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..ccb3d89
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,57 @@
+## Process this file with autoconf to produce a configure script.
+##
+## $Id$
+
+AC_PREREQ([2.68])
+AC_INIT([rtems],[_RTEMS_VERSION],[http://www.rtems.org/bugzilla])
+AC_CONFIG_SRCDIR([schedsim])
+RTEMS_TOP([.])
+
+# Abort if trying to build inside of the source tree.
+AS_IF([test -f aclocal/version.m4],[
+ rm -f config.cache config.log confdefs.h
+ AC_MSG_ERROR([***]
+ [Attempt to build inside of the source tree]
+ [Please use a separate build directory, instead] )
+])
+
+AC_CANONICAL_TARGET([])
+AM_INIT_AUTOMAKE([no-define foreign dist-bzip2 no-dist-gzip 1.11.1])
+AM_MAINTAINER_MODE
+
+## These option are only in here to let --help report all supported
+## options.
+RTEMS_ENABLE_MULTIPROCESSING
+RTEMS_ENABLE_POSIX
+RTEMS_ENABLE_NETWORKING
+RTEMS_ENABLE_CXX
+RTEMS_ENABLE_TESTS
+RTEMS_ENABLE_RTEMS_DEBUG
+RTEMS_ENABLE_RTEMSBSP
+RTEMS_ENABLE_MULTILIB
+
+AC_ARG_ENABLE([docs],
+ [AS_HELP_STRING([--enable-docs],[enable building documentation
+ (default:disabled)])])
+
+RTEMS_ENABLE_RTEMSDIR
+if test X"${rtems_srcdir}" = "X" ; then
+ AC_MSG_ERROR([RTEMS Source Directory Not Specified])
+fi
+if test ! -d ${rtems_srcdir}; then
+ AC_MSG_ERROR([RTEMS Source Directory ${rtems_srcdir} Does Not Exist])
+fi
+if test ! -d ${rtems_srcdir}/cpukit; then
+ AC_MSG_ERROR([RTEMS Source Directory ${rtems_srcdir}/cpukit Does Not Exist])
+fi
+
+RTEMS_BUILD_CONFIG_SUBDIRS([schedsim])
+
+AC_SUBST(rtems_srcdir)
+
+#AS_IF([test x"${enable_docs}" = x"yes"],
+# [RTEMS_BUILD_CONFIG_SUBDIRS([doc])])
+
+AC_CONFIG_FILES([Makefile])
+
+AC_OUTPUT
diff --git a/schedsim/.cvsignore b/schedsim/.cvsignore
new file mode 100644
index 0000000..5c181fb
--- /dev/null
+++ b/schedsim/.cvsignore
@@ -0,0 +1,16 @@
+aclocal.m4
+autom4te*.cache
+config.cache
+config.guess
+config.h.in
+config.log
+config.status
+config.sub
+configure
+depcomp
+install-sh
+Makefile
+Makefile.in
+missing
+mkinstalldirs
+stamp-h.in
diff --git a/schedsim/ChangeLog b/schedsim/ChangeLog
new file mode 100644
index 0000000..8341283
--- /dev/null
+++ b/schedsim/ChangeLog
@@ -0,0 +1,21 @@
+2011-04-07 Joel Sherrill <joel.sherrill@oarcorp.com>
+
+ * README: New file.
+
+2011-02-02 Ralf Corsépius <ralf.corsepius@rtems.org>
+
+ * configure.ac: Require autoconf-2.68, automake-1.11.1.
+
+2011-01-28 Ralf Corsépius <ralf.corsepius@rtems.org>
+
+ * configure.ac: Remove RTEMS_PATH_KSH (Unused).
+ Require autoconf >= 2.68, automake >= 1.11.1.
+ Add AC_PROG_CC_C99 to enforce c99 hoping this will suffice to make
+ this stuff compilable with older GCCs (works on some hosts).
+
+2010-12-17 Joel Sherrill <joel.sherrill@oarcorp.com>
+ Jennifer Averett <jennifer.averett@oarcorp.com>
+
+ Add RTEMS Scheduler Simulator. This is the top level of the tree.
+ * .cvsignore, ChangeLog, Makefile.am, configure.ac: New files.
+
diff --git a/schedsim/Makefile.am b/schedsim/Makefile.am
new file mode 100644
index 0000000..65914f5
--- /dev/null
+++ b/schedsim/Makefile.am
@@ -0,0 +1,12 @@
+##
+## $Id$
+##
+
+ACLOCAL_AMFLAGS = -I ../aclocal
+
+SUBDIRS = rtems shell
+
+DIST_SUBDIRS = rtems shell
+
+include $(top_srcdir)/../automake/subdirs.am
+include $(top_srcdir)/../automake/host.am
diff --git a/schedsim/README b/schedsim/README
new file mode 100644
index 0000000..0d8275e
--- /dev/null
+++ b/schedsim/README
@@ -0,0 +1,100 @@
+#
+# $Id$
+#
+
+This is a simulation shell which wraps parts of the RTEMS SuperCore
+and provides a way to test scheduler implementations.
+
+The following commands are currently available
+
+echo
+help
+exit
+
+rtems_init
+
+task_create name priority
+task_delete name|id
+task_mode [-tTpP]
+ -t - disable timeslicing
+ -T - enable timeslicing
+ -t - disable preemption
+ -T - enable enable
+task_priority name|id priority
+task_resume name|id
+task_suspend name|id
+task_wake_after ticks
+
+clock_tick ticks
+
+@
+
+
+1.6
+log
+@2010-04-08 Joel Sherrill <joel.sherrill@@oarcorp.com>
+
+ * README: Add task suspend and resume.
+@
+text
+@d2 1
+a2 1
+# $Id$
+d17 1
+a17 1
+task_delete [name|id]
+d23 3
+a25 3
+task_set_priority [name|id] priority
+task_resume [name|id]
+task_suspend [name|id]
+d30 15
+@
+
+
+1.5
+log
+@2010-04-08 Joel Sherrill <joel.sherrill@@oarcorp.com>
+
+ * README: Added task_mode command.
+@
+text
+@d2 1
+a2 1
+# $Id$
+d17 1
+d24 2
+a26 1
+task_delete [name|id]
+@
+
+
+1.4
+log
+@2010-04-08 Joel Sherrill <joel.sherrill@@oarcorp.com>
+
+ * README: Add task set priority, task wake after, and clock tick.
+@
+text
+@d2 1
+semaphore_create [-bcsfpiC:V:] name
+ -b - binary mutex
+ -c - counting semaphore
+ -s - simple binary semaphore
+ -f - FIFO Blocking
+ -p - Priority Blocking
+ -i - Priority Inheritance
+ -C priority - Priority Ceiling and priority
+ -V initial - Initial value (default=0)
+semaphore_delete name|id
+semaphore_obtain name|id ticks
+ NOTE: no polling supported yet
+semaphore_release name|id
+semaphore_flush name|id
+
+executing
+heir
+
+The task names are of Classic API form. They can be up to four characters.
+They should not start with "0" since that is the test used to determine if
+it is a hexadecimal task id.
diff --git a/schedsim/configure.ac b/schedsim/configure.ac
new file mode 100644
index 0000000..fd3e922
--- /dev/null
+++ b/schedsim/configure.ac
@@ -0,0 +1,48 @@
+## Process this file with autoconf to produce a configure script.
+##
+## $Id$
+
+AC_PREREQ([2.68])
+AC_INIT([rtems-tools-schedsim],[_RTEMS_VERSION],[http://www.rtems.org/bugzilla])
+AC_CONFIG_SRCDIR([rtems])
+RTEMS_TOP(..)
+
+RTEMS_CANONICAL_TARGET_CPU
+
+AM_INIT_AUTOMAKE([no-define foreign 1.11.1])
+AM_MAINTAINER_MODE
+
+AC_PROG_RANLIB
+# FIXME: Hack to enforce gnu99 on systems with GCC which do not default to gnu99
+AC_PROG_CC_C99
+AC_PROG_CXX
+# FIXME: Should abort if c99 or c++ are not available.
+# FIXME: Should abort on systems without GCC.
+
+# FIXME: This package is not a tool, it's a separate, hacked up RTEMS port
+RTEMS_TOOLPATHS
+
+RTEMS_ENABLE_RTEMSDIR
+if test X"${rtems_srcdir}" = "X" ; then
+ AC_MSG_ERROR([RTEMS Source Directory Not Specified])
+fi
+if test ! -d ${rtems_srcdir}; then
+ AC_MSG_ERROR([RTEMS Source Directory ${rtems_srcdir} Does Not Exist])
+fi
+if test ! -d ${rtems_srcdir}/cpukit; then
+ AC_MSG_ERROR([RTEMS Source Directory ${rtems_srcdir}/cpukit Does Not Exist])
+fi
+
+AC_SUBST(rtems_srcdir)
+
+AC_SUBST(program_prefix)
+
+# Explicitly list all Makefiles here
+AC_CONFIG_FILES([
+Makefile
+rtems/Makefile
+shell/Makefile
+shell/shared/Makefile
+shell/schedsim_priority/Makefile
+])
+AC_OUTPUT
diff --git a/schedsim/rtems/.cvsignore b/schedsim/rtems/.cvsignore
new file mode 100644
index 0000000..282522d
--- /dev/null
+++ b/schedsim/rtems/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/schedsim/rtems/ChangeLog b/schedsim/rtems/ChangeLog
new file mode 100644
index 0000000..22d4c31
--- /dev/null
+++ b/schedsim/rtems/ChangeLog
@@ -0,0 +1,29 @@
+2011-04-11 Joel Sherrill <joel.sherrill@oarcorp.com>
+
+ * Makefile.am: Add schedulersimple.h
+
+2011-04-07 Joel Sherrill <joel.sherrill@oarcorp.com>
+
+ * Makefile.am, wkspace.c: Compiles now and do not core dump when RTEMS
+ is not initialized.
+
+2011-02-28 Joel Sherrill <joel.sherrill@oarcorp.com>
+
+ * sched_cpu/rtems/score/cpuopts.h: Bump to 4.10.99.0
+
+2010-12-17 Joel Sherrill <joel.sherrill@oarcorp.com>
+
+ * .cvsignore: New file.
+
+2010-12-17 Joel Sherrill <joel.sherrill@oarcorp.com>
+ Jennifer Averett <jennifer.averett@oarcorp.com>
+
+ Add RTEMS Scheduler Simulator. This is the RTEMS "port" to and
+ adapter code to run on GNU/Linux with a fake context switch.
+ * ChangeLog, Makefile.am, interr.c, rtems_init.c, rtems_sched.h,
+ wkspace.c, sched_cpu/cpu.c, sched_cpu/cpu_asm.c,
+ sched_cpu/rtems/asm.h, sched_cpu/rtems/stringto.h,
+ sched_cpu/rtems/score/cpu.h, sched_cpu/rtems/score/cpu_asm.h,
+ sched_cpu/rtems/score/cpuopts.h, sched_cpu/rtems/score/no_cpu.h,
+ sched_cpu/rtems/score/types.h: New files.
+
diff --git a/schedsim/rtems/Makefile.am b/schedsim/rtems/Makefile.am
new file mode 100644
index 0000000..40e52c1
--- /dev/null
+++ b/schedsim/rtems/Makefile.am
@@ -0,0 +1,395 @@
+##
+## $Id$
+##
+
+ACLOCAL_AMFLAGS = -I ../../aclocal
+
+lib_LIBRARIES = librtems.a
+
+cpukitdir=@rtems_srcdir@/cpukit
+librtems_a_CPPFLAGS = -D__RTEMS_VIOLATE_KERNEL_VISIBILITY__
+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
+
+## Have own version of these
+librtems_a_SOURCES = rtems_init.c wkspace.c
+librtems_a_SOURCES += sched_cpu/cpu_asm.c
+librtems_a_SOURCES += sched_cpu/cpu.c
+
+## CPUKIT/SCORE/SRC
+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
+librtems_a_SOURCES += $(cpukitdir)/score/src/chainappend.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/chain.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/chainextract.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/chainget.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/chaininsert.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/coremutex.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/coremutexflush.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/coremutexseize.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/coremutexseizeintr.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/coremutexsurrender.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/coresem.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/coresemflush.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/coresemseize.c
+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/coretodgetuptime.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/coretodgetuptimetimespec.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/coretodmsecstoticks.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/objectallocate.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/objectapimaximumclass.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/objectclose.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/objectextendinformation.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/objectfree.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/objectget.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/objectgetinfo.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/objectgetinfoid.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/objectgetisr.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/objectgetnameasstring.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/objectgetnext.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/objectgetnoprotection.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/objectidtoname.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/objectinitializeinformation.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/objectnamespaceremove.c
+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/scheduler.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerpriorityallocate.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerpriorityblock.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/schedulerpriority.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/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
+librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimpleblock.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimple.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimpleenqueue.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimpleenqueuefirst.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimpleextract.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimplereadyqueueenqueue.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/schedulersimplereadyqueueenqueuefirst.c
+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
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadget.c
+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
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadsettransient.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadstackallocate.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadstackfree.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadstart.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadstartmultitasking.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadtickletimeslice.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/iterateoverthreads.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadq.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadblockingoperationcancel.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadqdequeue.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadqdequeuefifo.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadqdequeuepriority.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadqenqueue.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadqenqueuefifo.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadqenqueuepriority.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadqextract.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadqextractfifo.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadqextractpriority.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadqextractwithproxy.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadqfirst.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadqfirstfifo.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadqfirstpriority.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadqflush.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadqprocesstimeout.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadqrequeue.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/threadqtimeout.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/timespecaddto.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/timespecdividebyinteger.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/timespecdivide.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/timespecfromticks.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/timespecgreaterthan.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/timespecisvalid.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/timespeclessthan.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/timespecsubtract.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/timespectoticks.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/userextaddset.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/userext.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/userextremoveset.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/userextthreadbegin.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/userextthreadcreate.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/userextthreaddelete.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/userextthreadrestart.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/userextthreadstart.c
+librtems_a_SOURCES += $(cpukitdir)/score/src/userextthreadswitch.c
+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
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/clockgettickspersecond.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/clockgettickssinceboot.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/clockgettod.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/clockgettodtimeval.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/clockgetuptime.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/clockset.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/clocksetnsecshandler.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/clocktick.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/clocktodtoseconds.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/clocktodvalidate.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/sem.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/semcreate.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/semdata.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/semdelete.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/semflush.c
+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/tasks.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/taskdata.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/taskmode.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/taskvariable_invoke_dtor.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/taskcreate.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/taskstart.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/taskident.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/taskdelete.c
+librtems_a_SOURCES += $(cpukitdir)/rtems/src/taskresume.c
+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)/libcsupport/src/assoclocalbyname.c
+librtems_a_SOURCES += $(cpukitdir)/libcsupport/src/assoclocalbyremotebitfield.c
+librtems_a_SOURCES += $(cpukitdir)/libcsupport/src/assoclocalbyremote.c
+librtems_a_SOURCES += $(cpukitdir)/libcsupport/src/assocnamebad.c
+librtems_a_SOURCES += $(cpukitdir)/libcsupport/src/assocnamebylocalbitfield.c
+librtems_a_SOURCES += $(cpukitdir)/libcsupport/src/assocnamebylocal.c
+librtems_a_SOURCES += $(cpukitdir)/libcsupport/src/assocnamebyremotebitfield.c
+librtems_a_SOURCES += $(cpukitdir)/libcsupport/src/assocnamebyremote.c
+librtems_a_SOURCES += $(cpukitdir)/libcsupport/src/assocptrbylocal.c
+librtems_a_SOURCES += $(cpukitdir)/libcsupport/src/assocptrbyname.c
+librtems_a_SOURCES += $(cpukitdir)/libcsupport/src/assocptrbyremote.c
+librtems_a_SOURCES += $(cpukitdir)/libcsupport/src/assocremotebylocalbitfield.c
+librtems_a_SOURCES += $(cpukitdir)/libcsupport/src/assocremotebylocal.c
+librtems_a_SOURCES += $(cpukitdir)/libcsupport/src/assocremotebyname.c
+librtems_a_SOURCES += $(cpukitdir)/libcsupport/src/error.c
+librtems_a_SOURCES += $(cpukitdir)/libmisc/stringto/stringtodouble.c
+librtems_a_SOURCES += $(cpukitdir)/libmisc/stringto/stringtofloat.c
+librtems_a_SOURCES += $(cpukitdir)/libmisc/stringto/stringtoint.c
+librtems_a_SOURCES += $(cpukitdir)/libmisc/stringto/stringtolong.c
+librtems_a_SOURCES += $(cpukitdir)/libmisc/stringto/stringtopointer.c
+librtems_a_SOURCES += $(cpukitdir)/libmisc/stringto/stringtounsignedchar.c
+librtems_a_SOURCES += $(cpukitdir)/libmisc/stringto/stringtounsignedint.c
+librtems_a_SOURCES += $(cpukitdir)/libmisc/stringto/stringtounsignedlong.c
+
+schedsim_includedir = $(includedir)/schedsim
+schedsim_rtems_includedir = $(includedir)/schedsim/rtems
+schedsim_rtems_score_includedir = $(includedir)/schedsim/rtems/score
+schedsim_rtems_rtems_includedir = $(includedir)/schedsim/rtems/rtems
+
+schedsim_include_HEADERS = \
+ ${cpukitdir}/rtems/include/rtems.h
+
+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 \
+ $(cpukitdir)/sapi/include/rtems/config.h \
+ $(cpukitdir)/sapi/include/rtems/sptables.h \
+ $(cpukitdir)/sapi/include/rtems/io.h \
+ $(cpukitdir)/sapi/include/rtems/mptables.h \
+ $(cpukitdir)/sapi/include/rtems/extension.h \
+ $(cpukitdir)/sapi/include/rtems/chain.h \
+ $(cpukitdir)/sapi/include/confdefs.h \
+ $(cpukitdir)/libcsupport/include/rtems/libio_.h \
+ $(cpukitdir)/libcsupport/include/rtems/watchdogdrv.h \
+ $(cpukitdir)/libcsupport/include/rtems/error.h \
+ $(cpukitdir)/libcsupport/include/rtems/framebuffer.h \
+ $(cpukitdir)/libcsupport/include/rtems/assoc.h \
+ $(cpukitdir)/libcsupport/include/rtems/libio.h \
+ $(cpukitdir)/libcsupport/include/rtems/gxx_wrappers.h \
+ $(cpukitdir)/libcsupport/include/rtems/libcsupport.h \
+ $(cpukitdir)/libcsupport/include/rtems/termiostypes.h \
+ $(cpukitdir)/libcsupport/include/rtems/malloc.h \
+ sched_cpu/rtems/stringto.h \
+ sched_cpu/rtems/asm.h
+
+schedsim_rtems_score_include_HEADERS = \
+ ${cpukitdir}/score/include/rtems/score/address.h \
+ ${cpukitdir}/score/include/rtems/score/coremutex.h \
+ ${cpukitdir}/score/include/rtems/score/corerwlock.h \
+ ${cpukitdir}/score/include/rtems/score/threadsync.h \
+ ${cpukitdir}/score/include/rtems/score/priority.h \
+ ${cpukitdir}/score/include/rtems/score/sysstate.h \
+ ${cpukitdir}/score/include/rtems/score/threadmp.h \
+ ${cpukitdir}/score/include/rtems/score/mppkt.h \
+ ${cpukitdir}/score/include/rtems/score/stack.h \
+ ${cpukitdir}/score/include/rtems/score/context.h \
+ ${cpukitdir}/score/include/rtems/score/heap.h \
+ ${cpukitdir}/score/include/rtems/score/coresem.h \
+ ${cpukitdir}/score/include/rtems/score/corebarrier.h \
+ ${cpukitdir}/score/include/rtems/score/corespinlock.h \
+ ${cpukitdir}/score/include/rtems/score/prioritybitmap.h \
+ ${cpukitdir}/score/include/rtems/score/timestamp.h \
+ ${cpukitdir}/score/include/rtems/score/basedefs.h \
+ ${cpukitdir}/score/include/rtems/score/wkspace.h \
+ ${cpukitdir}/score/include/rtems/score/percpu.h \
+ ${cpukitdir}/score/include/rtems/score/watchdog.h \
+ ${cpukitdir}/score/include/rtems/score/tod.h \
+ ${cpukitdir}/score/include/rtems/score/protectedheap.h \
+ ${cpukitdir}/score/include/rtems/score/timestamp64.h \
+ ${cpukitdir}/score/include/rtems/score/chain.h \
+ ${cpukitdir}/score/include/rtems/score/apiext.h \
+ ${cpukitdir}/score/include/rtems/score/userext.h \
+ ${cpukitdir}/score/include/rtems/score/threadq.h \
+ ${cpukitdir}/score/include/rtems/score/apimutex.h \
+ ${cpukitdir}/score/include/rtems/score/scheduler.h \
+ ${cpukitdir}/score/include/rtems/score/isr.h \
+ ${cpukitdir}/score/include/rtems/score/mpci.h \
+ ${cpukitdir}/score/include/rtems/score/object.h \
+ ${cpukitdir}/score/include/rtems/score/copyrt.h \
+ ${cpukitdir}/score/include/rtems/score/states.h \
+ ${cpukitdir}/score/include/rtems/score/objectmp.h \
+ ${cpukitdir}/score/include/rtems/score/thread.h \
+ ${cpukitdir}/score/include/rtems/score/coremsg.h \
+ ${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 \
+ sched_cpu/rtems/score/cpuopts.h \
+ sched_cpu/rtems/score/cpu.h \
+ sched_cpu/rtems/score/types.h \
+ sched_cpu/rtems/score/no_cpu.h
+
+
+schedsim_rtems_rtems_include_HEADERS = \
+ ${cpukitdir}/rtems/include/rtems/rtems/event.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/cache.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/timer.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/regionmp.h \
+ ${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 \
+ ${cpukitdir}/rtems/include/rtems/rtems/sem.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/barriermp.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/types.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/intr.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/signalmp.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/eventmp.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/part.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/message.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/region.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/object.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/partmp.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/msgmp.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/clock.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/modes.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/taskmp.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/asr.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/semmp.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/options.h \
+ ${cpukitdir}/rtems/include/rtems/rtems/attr.h \
+ ${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
+
+schedsim_include_HEADERS += rtems_sched.h
+
+include $(top_srcdir)/../automake/host.am
diff --git a/schedsim/rtems/interr.c b/schedsim/rtems/interr.c
new file mode 100644
index 0000000..b708f41
--- /dev/null
+++ b/schedsim/rtems/interr.c
@@ -0,0 +1,71 @@
+/*
+ * BASED UPON SOURCE IN RTEMS, MODIFIED FOR SIMULATOR
+ *
+ * Internal Error Handler
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/interr.h>
+#include <rtems/score/sysstate.h>
+#include <rtems/score/userext.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+/*PAGE
+ *
+ * _Internal_error_Occurred
+ *
+ * This routine will invoke the fatal error handler supplied by the user
+ * followed by the the default one provided by the executive. The default
+ * error handler assumes no hardware is present to help inform the user
+ * of the problem. Halt stores the error code in a known register,
+ * disables interrupts, and halts the CPU. If the CPU does not have a
+ * halt instruction, it will loop to itself.
+ *
+ * Input parameters:
+ * the_source - what subsystem the error originated in
+ * is_internal - if the error was internally generated
+ * the_error - fatal error status code
+ *
+ * Output parameters:
+ * As much information as possible is stored in a CPU dependent fashion.
+ * See the CPU dependent code for more information.
+ *
+ * NOTE: The the_error is not necessarily a directive status code.
+ */
+
+void _Internal_error_Occurred(
+ Internal_errors_Source the_source,
+ bool is_internal,
+ Internal_errors_t the_error
+)
+{
+
+ _Internal_errors_What_happened.the_source = the_source;
+ _Internal_errors_What_happened.is_internal = is_internal;
+ _Internal_errors_What_happened.the_error = the_error;
+
+ // _User_extensions_Fatal( the_source, is_internal, the_error );
+
+ _System_state_Set( SYSTEM_STATE_FAILED );
+
+ fprintf( stderr, "FATAL ERROR!!\n" );
+ exit( -1 );
+
+ /* will not return from this routine */
+ while (true);
+}
diff --git a/schedsim/rtems/rtems_init.c b/schedsim/rtems/rtems_init.c
new file mode 100644
index 0000000..4e7ab0d
--- /dev/null
+++ b/schedsim/rtems/rtems_init.c
@@ -0,0 +1,110 @@
+/*
+ * BASED UPON SOURCE IN RTEMS, MODIFIED FOR SIMULATOR
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+
+#define SAPI_INIT
+#define SCORE_INIT
+#define RTEMS_API_INIT
+
+#include <rtems.h>
+#include <rtems/score/apiext.h>
+#include <rtems/score/bitfield.h>
+#include <rtems/score/apimutex.h>
+#include <rtems/score/wkspace.h>
+
+Objects_Information *_Internal_Objects[ OBJECTS_INTERNAL_CLASSES_LAST + 1 ];
+
+Objects_Information *_RTEMS_Objects[ OBJECTS_RTEMS_CLASSES_LAST + 1 ];
+
+extern void check_heir_and_executing(void);
+
+void rtems_initialize_data_structures(void)
+{
+ _System_state_Handler_initialization( FALSE );
+
+ /*
+ * Do this as early as possible to ensure no debugging output
+ * is even attempted to be printed.
+ */
+ _Debug_Manager_initialization();
+
+ _API_extensions_Initialization();
+
+ _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();
+
+ _User_extensions_Handler_initialization();
+
+ // _ISR_Handler_initialization();
+
+ /*
+ * Initialize the internal support API and allocator Mutex
+ */
+ _Objects_Information_table[OBJECTS_INTERNAL_API] = _Internal_Objects;
+
+ _API_Mutex_Initialization( 1 );
+ _API_Mutex_Allocate( &_RTEMS_Allocator_Mutex );
+
+ _Priority_bit_map_Handler_initialization();
+ _Watchdog_Handler_initialization();
+ _TOD_Handler_initialization();
+
+ _Thread_Handler_initialization();
+
+ _Scheduler_Handler_initialization();
+
+
+/* MANAGERS */
+ /*
+ * Install our API Object Management Table and initialize the
+ * various managers.
+ */
+ _Objects_Information_table[OBJECTS_CLASSIC_API] = _RTEMS_Objects;
+
+ _RTEMS_tasks_Manager_initialization();
+ _Semaphore_Manager_initialization();
+
+ _System_state_Set( SYSTEM_STATE_BEFORE_MULTITASKING );
+
+ /*
+ * No threads should be created before this point!!!
+ * _Thread_Executing and _Thread_Heir are not set.
+ *
+ * At this point all API extensions are in place. After the call to
+ * _Thread_Create_idle() _Thread_Executing and _Thread_Heir will be set.
+ */
+ _Thread_Create_idle();
+
+ /*
+ * Scheduling can properly occur now as long as we avoid dispatching.
+ */
+
+ _System_state_Set( SYSTEM_STATE_BEGIN_MULTITASKING );
+
+ _Thread_Start_multitasking();
+
+ /*
+ * Now we are back in a non-dispatching critical section
+ */
+ _Thread_Dispatch_set_disable_level(0);
+
+ /*
+ * Print an initial message
+ */
+ check_heir_and_executing();
+}
diff --git a/schedsim/rtems/rtems_sched.h b/schedsim/rtems/rtems_sched.h
new file mode 100644
index 0000000..f399f0c
--- /dev/null
+++ b/schedsim/rtems/rtems_sched.h
@@ -0,0 +1,27 @@
+/*
+ * RTEMS Scheduler Simulator Interface
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SCHEDULER_SIMULATOR_h
+#define __RTEMS_SCHEDULER_SIMULATOR_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void rtems_initialize_data_structures(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/schedsim/rtems/sched_cpu/cpu.c b/schedsim/rtems/sched_cpu/cpu.c
new file mode 100644
index 0000000..0d2e6f6
--- /dev/null
+++ b/schedsim/rtems/sched_cpu/cpu.c
@@ -0,0 +1,169 @@
+/*
+ * XXX CPU Dependent Source
+ *
+ * BASED UPON SOURCE IN RTEMS, MODIFIED FOR SIMULATOR
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/wkspace.h>
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS: NONE
+ *
+ * NO_CPU Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+
+void _CPU_Initialize(void)
+{
+ /*
+ * If there is not an easy way to initialize the FP context
+ * during Context_Initialize, then it is usually easier to
+ * save an "uninitialized" FP context here and copy it to
+ * the task's during Context_Initialize.
+ */
+
+ /* FP context initialization support goes here */
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ *
+ * NO_CPU Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+
+uint32_t _CPU_ISR_Get_level( void )
+{
+ /*
+ * This routine returns the current interrupt level.
+ */
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_raw_handler
+ *
+ * NO_CPU Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+
+void _CPU_ISR_install_raw_handler(
+ uint32_t vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ /*
+ * This is where we install the interrupt handler into the "raw" interrupt
+ * table used by the CPU to dispatch interrupt handlers.
+ */
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ *
+ * NO_CPU Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+
+void _CPU_ISR_install_vector(
+ uint32_t vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ *old_handler = _ISR_Vector_table[ vector ];
+
+ /*
+ * If the interrupt vector table is a table of pointer to isr entry
+ * points, then we need to install the appropriate RTEMS interrupt
+ * handler for this vector number.
+ */
+
+ _CPU_ISR_install_raw_handler( vector, new_handler, old_handler );
+
+ /*
+ * We put the actual user ISR address in '_ISR_vector_table'. This will
+ * be used by the _ISR_Handler so the user gets control.
+ */
+
+ _ISR_Vector_table[ vector ] = new_handler;
+}
+
+/*PAGE
+ *
+ * _CPU_Install_interrupt_stack
+ *
+ * NO_CPU Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+
+void _CPU_Install_interrupt_stack( void )
+{
+}
+
+/*PAGE
+ *
+ * _CPU_Thread_Idle_body
+ *
+ * NOTES:
+ *
+ * 1. This is the same as the regular CPU independent algorithm.
+ *
+ * 2. If you implement this using a "halt", "idle", or "shutdown"
+ * instruction, then don't forget to put it in an infinite loop.
+ *
+ * 3. Be warned. Some processors with onboard DMA have been known
+ * to stop the DMA if the CPU were put in IDLE mode. This might
+ * also be a problem with other on-chip peripherals. So use this
+ * hook with caution.
+ *
+ * NO_CPU Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+
+void *_CPU_Thread_Idle_body( uintptr_t ignored )
+{
+
+ for( ; ; )
+ /* insert your "halt" instruction here */ ;
+}
diff --git a/schedsim/rtems/sched_cpu/cpu_asm.c b/schedsim/rtems/sched_cpu/cpu_asm.c
new file mode 100644
index 0000000..e31c980
--- /dev/null
+++ b/schedsim/rtems/sched_cpu/cpu_asm.c
@@ -0,0 +1,188 @@
+/* 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
+ *
+ * NOTE: This is supposed to be a .S or .s file NOT a C file.
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+/*
+ * 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
+)
+{
+}
+
+/*
+ * _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
+)
+{
+}
+
+/*
+ * _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/asm.h b/schedsim/rtems/sched_cpu/rtems/asm.h
new file mode 100644
index 0000000..8ad1d57
--- /dev/null
+++ b/schedsim/rtems/sched_cpu/rtems/asm.h
@@ -0,0 +1,127 @@
+/**
+ * @file rtems/asm.h
+ *
+ * BASED UPON SOURCE IN RTEMS, MODIFIED FOR SIMULATOR
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ */
+
+/*
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1994-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+
+#ifndef _RTEMS_ASM_H
+#define _RTEMS_ASM_H
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/cpuopts.h>
+#include <rtems/score/no_cpu.h>
+
+#ifndef __USER_LABEL_PREFIX__
+/**
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ *
+ * This symbol is prefixed to all C program symbols.
+ */
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+/**
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ *
+ * This symbol is prefixed to all register names.
+ */
+#define __REGISTER_PREFIX__
+#endif
+
+#include <rtems/concat.h>
+
+/** Use the right prefix for global labels. */
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/** Use the right prefix for registers. */
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+/*
+ * define macros for all of the registers on this CPU
+ *
+ * EXAMPLE: #define d0 REG (d0)
+ */
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+/** This macro is used to denote the beginning of a code declaration. */
+#define BEGIN_CODE_DCL .text
+/** This macro is used to denote the end of a code declaration. */
+#define END_CODE_DCL
+/** This macro is used to denote the beginning of a data declaration section. */
+#define BEGIN_DATA_DCL .data
+/** This macro is used to denote the end of a data declaration section. */
+#define END_DATA_DCL
+/** This macro is used to denote the beginning of a code section. */
+#define BEGIN_CODE .text
+/** This macro is used to denote the end of a code section. */
+#define END_CODE
+/** This macro is used to denote the beginning of a data section. */
+#define BEGIN_DATA
+/** This macro is used to denote the end of a data section. */
+#define END_DATA
+/** This macro is used to denote the beginning of the
+ * unitialized data section.
+ */
+#define BEGIN_BSS
+/** This macro is used to denote the end of the unitialized data section. */
+#define END_BSS
+/** This macro is used to denote the end of the assembly file. */
+#define END
+
+/**
+ * This macro is used to declare a public global symbol.
+ *
+ * @note This must be tailored for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+#define PUBLIC(sym) .globl SYM (sym)
+
+/**
+ * This macro is used to prototype a public global symbol.
+ *
+ * @note This must be tailored for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
diff --git a/schedsim/rtems/sched_cpu/rtems/score/cpu.h b/schedsim/rtems/sched_cpu/rtems/score/cpu.h
new file mode 100644
index 0000000..7e206fd
--- /dev/null
+++ b/schedsim/rtems/sched_cpu/rtems/score/cpu.h
@@ -0,0 +1,1264 @@
+/**
+ * @file rtems/score/cpu.h
+ */
+
+/*
+ * BASED UPON SOURCE IN RTEMS, MODIFIED FOR SIMULATOR
+ *
+ * This include file contains information pertaining to the XXX
+ * processor.
+ *
+ * @note This file is part of a porting template that is intended
+ * to be used as the starting point when porting RTEMS to a new
+ * CPU family. The following needs to be done when using this as
+ * the starting point for a new port:
+ *
+ * + Anywhere there is an XXX, it should be replaced
+ * with information about the CPU family being ported to.
+ *
+ * + At the end of each comment section, there is a heading which
+ * says "Port Specific Information:". When porting to RTEMS,
+ * add CPU family specific information in this section
+ */
+
+/*
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifndef _RTEMS_SCORE_CPU_H
+#define _RTEMS_SCORE_CPU_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/no_cpu.h> /* pick up machine definitions */
+#ifndef ASM
+#include <rtems/score/types.h>
+#endif
+
+/* conditional compilation parameters */
+
+/**
+ * Should the calls to @ref _Thread_Enable_dispatch be inlined?
+ *
+ * If TRUE, then they are inlined.
+ * If FALSE, then a subroutine call is made.
+ *
+ * This conditional is an example of the classic trade-off of size
+ * versus speed. Inlining the call (TRUE) typically increases the
+ * size of RTEMS while speeding up the enabling of dispatching.
+ *
+ * @note In general, the @ref _Thread_Dispatch_disable_level will
+ * only be 0 or 1 unless you are in an interrupt handler and that
+ * interrupt handler invokes the executive.] When not inlined
+ * something calls @ref _Thread_Enable_dispatch which in turns calls
+ * @ref _Thread_Dispatch. If the enable dispatch is inlined, then
+ * one subroutine call is avoided entirely.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_INLINE_ENABLE_DISPATCH TRUE
+
+/**
+ * Should the body of the search loops in _Thread_queue_Enqueue_priority
+ * be unrolled one time? In unrolled each iteration of the loop examines
+ * two "nodes" on the chain being searched. Otherwise, only one node
+ * is examined per iteration.
+ *
+ * If TRUE, then the loops are unrolled.
+ * If FALSE, then the loops are not unrolled.
+ *
+ * The primary factor in making this decision is the cost of disabling
+ * and enabling interrupts (_ISR_Flash) versus the cost of rest of the
+ * body of the loop. On some CPUs, the flash is more expensive than
+ * one iteration of the loop body. In this case, it might be desirable
+ * to unroll the loop. It is important to note that on some CPUs, this
+ * code is the longest interrupt disable period in RTEMS. So it is
+ * necessary to strike a balance when setting this parameter.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_UNROLL_ENQUEUE_PRIORITY TRUE
+
+/**
+ * Does RTEMS manage a dedicated interrupt stack in software?
+ *
+ * If TRUE, then a stack is allocated in @ref _ISR_Handler_initialization.
+ * If FALSE, nothing is done.
+ *
+ * If the CPU supports a dedicated interrupt stack in hardware,
+ * then it is generally the responsibility of the BSP to allocate it
+ * and set it up.
+ *
+ * If the CPU does not support a dedicated interrupt stack, then
+ * the porter has two options: (1) execute interrupts on the
+ * stack of the interrupted task, and (2) have RTEMS manage a dedicated
+ * interrupt stack.
+ *
+ * If this is TRUE, @ref CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
+ *
+ * Only one of @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK and
+ * @ref CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE. It is
+ * possible that both are FALSE for a particular CPU. Although it
+ * is unclear what that would imply about the interrupt processing
+ * procedure on that CPU.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_HAS_SOFTWARE_INTERRUPT_STACK FALSE
+
+/**
+ * Does the CPU follow the simple vectored interrupt model?
+ *
+ * If TRUE, then RTEMS allocates the vector table it internally manages.
+ * If FALSE, then the BSP is assumed to allocate and manage the vector
+ * table
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
+
+/**
+ * Does this CPU have hardware support for a dedicated interrupt stack?
+ *
+ * If TRUE, then it must be installed during initialization.
+ * If FALSE, then no installation is performed.
+ *
+ * If this is TRUE, @ref CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
+ *
+ * Only one of @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK and
+ * @ref CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE. It is
+ * possible that both are FALSE for a particular CPU. Although it
+ * is unclear what that would imply about the interrupt processing
+ * procedure on that CPU.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_HAS_HARDWARE_INTERRUPT_STACK TRUE
+
+/**
+ * Does RTEMS allocate a dedicated interrupt stack in the Interrupt Manager?
+ *
+ * If TRUE, then the memory is allocated during initialization.
+ * If FALSE, then the memory is allocated during initialization.
+ *
+ * This should be TRUE is CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
+
+/**
+ * Does the RTEMS invoke the user's ISR with the vector number and
+ * a pointer to the saved interrupt frame (1) or just the vector
+ * number (0)?
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_ISR_PASSES_FRAME_POINTER 0
+
+/**
+ * @def CPU_HARDWARE_FP
+ *
+ * Does the CPU have hardware floating point?
+ *
+ * If TRUE, then the RTEMS_FLOATING_POINT task attribute is supported.
+ * If FALSE, then the RTEMS_FLOATING_POINT task attribute is ignored.
+ *
+ * If there is a FP coprocessor such as the i387 or mc68881, then
+ * the answer is TRUE.
+ *
+ * The macro name "NO_CPU_HAS_FPU" should be made CPU specific.
+ * It indicates whether or not this CPU model has FP support. For
+ * example, it would be possible to have an i386_nofp CPU model
+ * which set this to false to indicate that you have an i386 without
+ * an i387 and wish to leave floating point support out of RTEMS.
+ */
+
+/**
+ * @def CPU_SOFTWARE_FP
+ *
+ * Does the CPU have no hardware floating point and GCC provides a
+ * software floating point implementation which must be context
+ * switched?
+ *
+ * This feature conditional is used to indicate whether or not there
+ * is software implemented floating point that must be context
+ * switched. The determination of whether or not this applies
+ * is very tool specific and the state saved/restored is also
+ * compiler specific.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#if ( NO_CPU_HAS_FPU == 1 )
+#define CPU_HARDWARE_FP TRUE
+#else
+#define CPU_HARDWARE_FP FALSE
+#endif
+#define CPU_SOFTWARE_FP FALSE
+
+/**
+ * Are all tasks RTEMS_FLOATING_POINT tasks implicitly?
+ *
+ * If TRUE, then the RTEMS_FLOATING_POINT task attribute is assumed.
+ * If FALSE, then the RTEMS_FLOATING_POINT task attribute is followed.
+ *
+ * So far, the only CPUs in which this option has been used are the
+ * HP PA-RISC and PowerPC. On the PA-RISC, The HP C compiler and
+ * gcc both implicitly used the floating point registers to perform
+ * integer multiplies. Similarly, the PowerPC port of gcc has been
+ * seen to allocate floating point local variables and touch the FPU
+ * even when the flow through a subroutine (like vfprintf()) might
+ * not use floating point formats.
+ *
+ * If a function which you would not think utilize the FP unit DOES,
+ * then one can not easily predict which tasks will use the FP hardware.
+ * In this case, this option should be TRUE.
+ *
+ * If @ref CPU_HARDWARE_FP is FALSE, then this should be FALSE as well.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_ALL_TASKS_ARE_FP TRUE
+
+/**
+ * Should the IDLE task have a floating point context?
+ *
+ * If TRUE, then the IDLE task is created as a RTEMS_FLOATING_POINT task
+ * and it has a floating point context which is switched in and out.
+ * If FALSE, then the IDLE task does not have a floating point context.
+ *
+ * Setting this to TRUE negatively impacts the time required to preempt
+ * the IDLE task from an interrupt because the floating point context
+ * must be saved as part of the preemption.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_IDLE_TASK_IS_FP FALSE
+
+/**
+ * Should the saving of the floating point registers be deferred
+ * until a context switch is made to another different floating point
+ * task?
+ *
+ * If TRUE, then the floating point context will not be stored until
+ * necessary. It will remain in the floating point registers and not
+ * disturned until another floating point task is switched to.
+ *
+ * If FALSE, then the floating point context is saved when a floating
+ * point task is switched out and restored when the next floating point
+ * task is restored. The state of the floating point registers between
+ * those two operations is not specified.
+ *
+ * If the floating point context does NOT have to be saved as part of
+ * interrupt dispatching, then it should be safe to set this to TRUE.
+ *
+ * Setting this flag to TRUE results in using a different algorithm
+ * for deciding when to save and restore the floating point context.
+ * The deferred FP switch algorithm minimizes the number of times
+ * the FP context is saved and restored. The FP context is not saved
+ * until a context switch is made to another, different FP task.
+ * Thus in a system with only one FP task, the FP context will never
+ * be saved or restored.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_USE_DEFERRED_FP_SWITCH TRUE
+
+/**
+ * Does this port provide a CPU dependent IDLE task implementation?
+ *
+ * If TRUE, then the routine @ref _CPU_Thread_Idle_body
+ * must be provided and is the default IDLE thread body instead of
+ * @ref _CPU_Thread_Idle_body.
+ *
+ * If FALSE, then use the generic IDLE thread body if the BSP does
+ * not provide one.
+ *
+ * This is intended to allow for supporting processors which have
+ * a low power or idle mode. When the IDLE thread is executed, then
+ * the CPU can be powered down.
+ *
+ * The order of precedence for selecting the IDLE thread body is:
+ *
+ * -# BSP provided
+ * -# CPU dependent (if provided)
+ * -# generic (if no BSP and no CPU dependent)
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_PROVIDES_IDLE_THREAD_BODY TRUE
+
+/**
+ * Does the stack grow up (toward higher addresses) or down
+ * (toward lower addresses)?
+ *
+ * If TRUE, then the grows upward.
+ * If FALSE, then the grows toward smaller addresses.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_STACK_GROWS_UP TRUE
+
+/**
+ * The following is the variable attribute used to force alignment
+ * of critical RTEMS structures. On some processors it may make
+ * sense to have these aligned on tighter boundaries than
+ * the minimum requirements of the compiler in order to have as
+ * much of the critical data area as possible in a cache line.
+ *
+ * The placement of this macro in the declaration of the variables
+ * is based on the syntactically requirements of the GNU C
+ * "__attribute__" extension. For example with GNU C, use
+ * the following to force a structures to a 32 byte boundary.
+ *
+ * __attribute__ ((aligned (32)))
+ *
+ * @note Currently only the Priority Bit Map table uses this feature.
+ * To benefit from using this, the data must be heavily
+ * used so it will stay in the cache and used frequently enough
+ * in the executive to justify turning this on.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_STRUCTURE_ALIGNMENT
+
+/**
+ * @defgroup CPUEndian Processor Dependent Endianness Support
+ *
+ * This group assists in issues related to processor endianness.
+ */
+
+/**
+ * @ingroup CPUEndian
+ * Define what is required to specify how the network to host conversion
+ * routines are handled.
+ *
+ * @note @a CPU_BIG_ENDIAN and @a CPU_LITTLE_ENDIAN should NOT have the
+ * same values.
+ *
+ * @see CPU_LITTLE_ENDIAN
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_BIG_ENDIAN TRUE
+
+/**
+ * @ingroup CPUEndian
+ * Define what is required to specify how the network to host conversion
+ * routines are handled.
+ *
+ * @note @ref CPU_BIG_ENDIAN and @ref CPU_LITTLE_ENDIAN should NOT have the
+ * same values.
+ *
+ * @see CPU_BIG_ENDIAN
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_LITTLE_ENDIAN FALSE
+
+/**
+ * @ingroup CPUInterrupt
+ * The following defines the number of bits actually used in the
+ * interrupt field of the task mode. How those bits map to the
+ * CPU interrupt levels is defined by the routine @ref _CPU_ISR_Set_level.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_MODES_INTERRUPT_MASK 0x00000001
+
+/*
+ * Processor defined structures required for cpukit/score.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+
+/* may need to put some structures here. */
+
+/**
+ * @defgroup CPUContext Processor Dependent Context Management
+ *
+ * From the highest level viewpoint, there are 2 types of context to save.
+ *
+ * -# Interrupt registers to save
+ * -# Task level registers to save
+ *
+ * Since RTEMS handles integer and floating point contexts separately, this
+ * means we have the following 3 context items:
+ *
+ * -# task level context stuff:: Context_Control
+ * -# floating point task stuff:: Context_Control_fp
+ * -# special interrupt level context :: CPU_Interrupt_frame
+ *
+ * On some processors, it is cost-effective to save only the callee
+ * preserved registers during a task context switch. This means
+ * that the ISR code needs to save those registers which do not
+ * persist across function calls. It is not mandatory to make this
+ * distinctions between the caller/callee saves registers for the
+ * purpose of minimizing context saved during task switch and on interrupts.
+ * If the cost of saving extra registers is minimal, simplicity is the
+ * choice. Save the same context on interrupt entry as for tasks in
+ * this case.
+ *
+ * Additionally, if gdb is to be made aware of RTEMS tasks for this CPU, then
+ * care should be used in designing the context area.
+ *
+ * On some CPUs with hardware floating point support, the Context_Control_fp
+ * structure will not be used or it simply consist of an array of a
+ * fixed number of bytes. This is done when the floating point context
+ * is dumped by a "FP save context" type instruction and the format
+ * is not really defined by the CPU. In this case, there is no need
+ * to figure out the exact format -- only the size. Of course, although
+ * this is enough information for RTEMS, it is probably not enough for
+ * a debugger such as gdb. But that is another problem.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+
+/**
+ * @ingroup CPUContext Management
+ * This defines the minimal set of integer and processor state registers
+ * that must be saved during a voluntary context switch from one thread
+ * to another.
+ */
+typedef struct {
+ /** This field is a hint that a port will have a number of integer
+ * registers that need to be saved at a context switch.
+ */
+ uint32_t some_integer_register;
+ /** This field is a hint that a port will have a number of system
+ * registers that need to be saved at a context switch.
+ */
+ uint32_t some_system_register;
+
+ /** This field is a hint that a port will have a register that
+ * is the stack pointer.
+ */
+ uint32_t stack_pointer;
+} Context_Control;
+
+/**
+ * @ingroup CPUContext Management
+ *
+ * This macro returns the stack pointer associated with @a _context.
+ *
+ * @param[in] _context is the thread context area to access
+ *
+ * @return This method returns the stack pointer.
+ */
+#define _CPU_Context_Get_SP( _context ) \
+ (_context)->stack_pointer
+
+/**
+ * @ingroup CPUContext Management
+ * This defines the complete set of floating point registers that must
+ * be saved during any context switch from one thread to another.
+ */
+typedef struct {
+ /** FPU registers are listed here */
+ double some_float_register;
+} Context_Control_fp;
+
+/**
+ * @ingroup CPUContext Management
+ * This defines the set of integer and processor state registers that must
+ * be saved during an interrupt. This set does not include any which are
+ * in @ref Context_Control.
+ */
+typedef struct {
+ /** This field is a hint that a port will have a number of integer
+ * registers that need to be saved when an interrupt occurs or
+ * when a context switch occurs at the end of an ISR.
+ */
+ uint32_t special_interrupt_register;
+} CPU_Interrupt_frame;
+
+/**
+ * This variable is optional. It is used on CPUs on which it is difficult
+ * to generate an "uninitialized" FP context. It is filled in by
+ * @ref _CPU_Initialize and copied into the task's FP context area during
+ * @ref _CPU_Context_Initialize.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+SCORE_EXTERN Context_Control_fp _CPU_Null_fp_context;
+
+/**
+ * @defgroup CPUInterrupt Processor Dependent Interrupt Management
+ *
+ * On some CPUs, RTEMS supports a software managed interrupt stack.
+ * This stack is allocated by the Interrupt Manager and the switch
+ * is performed in @ref _ISR_Handler. These variables contain pointers
+ * to the lowest and highest addresses in the chunk of memory allocated
+ * for the interrupt stack. Since it is unknown whether the stack
+ * grows up or down (in general), this give the CPU dependent
+ * code the option of picking the version it wants to use.
+ *
+ * @note These two variables are required if the macro
+ * @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK is defined as TRUE.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+
+/**
+ * @ingroup CPUInterrupt
+ * This variable points to the lowest physical address of the interrupt
+ * stack.
+ */
+SCORE_EXTERN void *_CPU_Interrupt_stack_low;
+
+/**
+ * @ingroup CPUInterrupt
+ * This variable points to the lowest physical address of the interrupt
+ * stack.
+ */
+SCORE_EXTERN void *_CPU_Interrupt_stack_high;
+
+/*
+ * Nothing prevents the porter from declaring more CPU specific variables.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+
+/* XXX: if needed, put more variables here */
+
+/**
+ * @ingroup CPUContext
+ * The size of the floating point context area. On some CPUs this
+ * will not be a "sizeof" because the format of the floating point
+ * area is not defined -- only the size is. This is usually on
+ * CPUs with a "floating point save context" instruction.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_CONTEXT_FP_SIZE sizeof( Context_Control_fp )
+
+/**
+ * Amount of extra stack (above minimum stack size) required by
+ * MPCI receive server thread. Remember that in a multiprocessor
+ * system this thread must exist and be able to process all directives.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 0
+
+/**
+ * @ingroup CPUInterrupt
+ * This defines the number of entries in the @ref _ISR_Vector_table managed
+ * by RTEMS.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_INTERRUPT_NUMBER_OF_VECTORS 32
+
+/**
+ * @ingroup CPUInterrupt
+ * This defines the highest interrupt vector number for this port.
+ */
+#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)
+
+/**
+ * @ingroup CPUInterrupt
+ * This is defined if the port has a special way to report the ISR nesting
+ * level. Most ports maintain the variable @a _ISR_Nest_level.
+ */
+#define CPU_PROVIDES_ISR_IS_IN_PROGRESS FALSE
+
+/**
+ * @ingroup CPUContext
+ * Should be large enough to run all RTEMS tests. This ensures
+ * that a "reasonable" small application should not have any problems.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_STACK_MINIMUM_SIZE (1024*4)
+
+/**
+ * CPU's worst alignment requirement for data types on a byte boundary. This
+ * alignment does not take into account the requirements for the stack.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_ALIGNMENT 8
+
+/**
+ * This number corresponds to the byte alignment requirement for the
+ * heap handler. This alignment requirement may be stricter than that
+ * for the data types alignment specified by @ref CPU_ALIGNMENT. It is
+ * common for the heap to follow the same alignment requirement as
+ * @ref CPU_ALIGNMENT. If the @ref CPU_ALIGNMENT is strict enough for
+ * the heap, then this should be set to @ref CPU_ALIGNMENT.
+ *
+ * @note This does not have to be a power of 2 although it should be
+ * a multiple of 2 greater than or equal to 2. The requirement
+ * to be a multiple of 2 is because the heap uses the least
+ * significant field of the front and back flags to indicate
+ * that a block is in use or free. So you do not want any odd
+ * length blocks really putting length data in that bit.
+ *
+ * On byte oriented architectures, @ref CPU_HEAP_ALIGNMENT normally will
+ * have to be greater or equal to than @ref CPU_ALIGNMENT to ensure that
+ * elements allocated from the heap meet all restrictions.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
+
+/**
+ * This number corresponds to the byte alignment requirement for memory
+ * buffers allocated by the partition manager. This alignment requirement
+ * may be stricter than that for the data types alignment specified by
+ * @ref CPU_ALIGNMENT. It is common for the partition to follow the same
+ * alignment requirement as @ref CPU_ALIGNMENT. If the @ref CPU_ALIGNMENT is
+ * strict enough for the partition, then this should be set to
+ * @ref CPU_ALIGNMENT.
+ *
+ * @note This does not have to be a power of 2. It does have to
+ * be greater or equal to than @ref CPU_ALIGNMENT.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_PARTITION_ALIGNMENT CPU_ALIGNMENT
+
+/**
+ * This number corresponds to the byte alignment requirement for the
+ * stack. This alignment requirement may be stricter than that for the
+ * data types alignment specified by @ref CPU_ALIGNMENT. If the
+ * @ref CPU_ALIGNMENT is strict enough for the stack, then this should be
+ * set to 0.
+ *
+ * @note This must be a power of 2 either 0 or greater than @ref CPU_ALIGNMENT.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define CPU_STACK_ALIGNMENT 0
+
+/*
+ * ISR handler macros
+ */
+
+/**
+ * @ingroup CPUInterrupt
+ * Support routine to initialize the RTEMS vector table after it is allocated.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define _CPU_Initialize_vectors()
+
+/**
+ * @ingroup CPUInterrupt
+ * Disable all interrupts for an RTEMS critical section. The previous
+ * level is returned in @a _isr_cookie.
+ *
+ * @param[out] _isr_cookie will contain the previous level cookie
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define _CPU_ISR_Disable( _isr_cookie ) \
+ { \
+ (_isr_cookie) = 0; /* do something to prevent warnings */ \
+ }
+
+/**
+ * @ingroup CPUInterrupt
+ * Enable interrupts to the previous level (returned by _CPU_ISR_Disable).
+ * This indicates the end of an RTEMS critical section. The parameter
+ * @a _isr_cookie is not modified.
+ *
+ * @param[in] _isr_cookie contain the previous level cookie
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define _CPU_ISR_Enable( _isr_cookie ) \
+ { \
+ }
+
+/**
+ * @ingroup CPUInterrupt
+ * This temporarily restores the interrupt to @a _isr_cookie before immediately
+ * disabling them again. This is used to divide long RTEMS critical
+ * sections into two or more parts. The parameter @a _isr_cookie is not
+ * modified.
+ *
+ * @param[in] _isr_cookie contain the previous level cookie
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define _CPU_ISR_Flash( _isr_cookie ) \
+ { \
+ }
+
+/**
+ * @ingroup CPUInterrupt
+ *
+ * This routine and @ref _CPU_ISR_Get_level
+ * Map the interrupt level in task mode onto the hardware that the CPU
+ * actually provides. Currently, interrupt levels which do not
+ * map onto the CPU in a generic fashion are undefined. Someday,
+ * it would be nice if these were "mapped" by the application
+ * via a callout. For example, m68k has 8 levels 0 - 7, levels
+ * 8 - 255 would be available for bsp/application specific meaning.
+ * This could be used to manage a programmable interrupt controller
+ * via the rtems_task_mode directive.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define _CPU_ISR_Set_level( new_level ) \
+ { \
+ }
+
+/**
+ * @ingroup CPUInterrupt
+ * Return the current interrupt disable level for this task in
+ * the format used by the interrupt level portion of the task mode.
+ *
+ * @note This routine usually must be implemented as a subroutine.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+uint32_t _CPU_ISR_Get_level( void );
+
+/* end of ISR handler macros */
+
+/* Context handler macros */
+
+/**
+ * @ingroup CPUContext
+ * Initialize the context to a state suitable for starting a
+ * task after a context restore operation. Generally, this
+ * involves:
+ *
+ * - setting a starting address
+ * - preparing the stack
+ * - preparing the stack and frame pointers
+ * - setting the proper interrupt level in the context
+ * - initializing the floating point context
+ *
+ * This routine generally does not set any unnecessary register
+ * in the context. The state of the "general data" registers is
+ * undefined at task start time.
+ *
+ * @param[in] _the_context is the context structure to be initialized
+ * @param[in] _stack_base is the lowest physical address of this task's stack
+ * @param[in] _size is the size of this task's stack
+ * @param[in] _isr is the interrupt disable level
+ * @param[in] _entry_point is the thread's entry point. This is
+ * always @a _Thread_Handler
+ * @param[in] _is_fp is TRUE if the thread is to be a floating
+ * point thread. This is typically only used on CPUs where the
+ * FPU may be easily disabled by software such as on the SPARC
+ * where the PSR contains an enable FPU bit.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define _CPU_Context_Initialize( _the_context, _stack_base, _size, \
+ _isr, _entry_point, _is_fp ) \
+ { \
+ }
+
+/**
+ * This routine is responsible for somehow restarting the currently
+ * executing task. If you are lucky, then all that is necessary
+ * is restoring the context. Otherwise, there will need to be
+ * a special assembly routine which does something special in this
+ * case. For many ports, simply adding a label to the restore path
+ * of @ref _CPU_Context_switch will work. On other ports, it may be
+ * possibly to load a few arguments and jump to the restore path. It will
+ * not work if restarting self conflicts with the stack frame
+ * assumptions of restoring a context.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define _CPU_Context_Restart_self( _the_context ) \
+ _CPU_Context_restore( (_the_context) );
+
+/**
+ * @ingroup CPUContext
+ * The purpose of this macro is to allow the initial pointer into
+ * a floating point context area (used to save the floating point
+ * context) to be at an arbitrary place in the floating point
+ * context area.
+ *
+ * This is necessary because some FP units are designed to have
+ * their context saved as a stack which grows into lower addresses.
+ * Other FP units can be saved by simply moving registers into offsets
+ * from the base of the context area. Finally some FP units provide
+ * a "dump context" instruction which could fill in from high to low
+ * or low to high based on the whim of the CPU designers.
+ *
+ * @param[in] _base is the lowest physical address of the floating point
+ * context area
+ * @param[in] _offset is the offset into the floating point area
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define _CPU_Context_Fp_start( _base, _offset ) \
+ ( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
+
+/**
+ * This routine initializes the FP context area passed to it to.
+ * There are a few standard ways in which to initialize the
+ * floating point context. The code included for this macro assumes
+ * that this is a CPU in which a "initial" FP context was saved into
+ * @a _CPU_Null_fp_context and it simply copies it to the destination
+ * context passed to it.
+ *
+ * Other floating point context save/restore models include:
+ * -# not doing anything, and
+ * -# putting a "null FP status word" in the correct place in the FP context.
+ *
+ * @param[in] _destination is the floating point context area
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define _CPU_Context_Initialize_fp( _destination ) \
+ { \
+ *(*(_destination)) = _CPU_Null_fp_context; \
+ }
+
+/* end of Context handler macros */
+
+/* Fatal Error manager macros */
+
+/**
+ * This routine copies _error into a known place -- typically a stack
+ * location or a register, optionally disables interrupts, and
+ * halts/stops the CPU.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#define _CPU_Fatal_halt( _error ) \
+ { \
+ }
+
+/* end of Fatal Error manager macros */
+
+/* Bitfield handler macros */
+
+/**
+ * @defgroup CPUBitfield Processor Dependent Bitfield Manipulation
+ *
+ * This set of routines are used to implement fast searches for
+ * the most important ready task.
+ */
+
+/**
+ * @ingroup CPUBitfield
+ * This definition is set to TRUE if the port uses the generic bitfield
+ * manipulation implementation.
+ */
+#define CPU_USE_GENERIC_BITFIELD_CODE TRUE
+
+/**
+ * @ingroup CPUBitfield
+ * This definition is set to TRUE if the port uses the data tables provided
+ * by the generic bitfield manipulation implementation.
+ * This can occur when actually using the generic bitfield manipulation
+ * implementation or when implementing the same algorithm in assembly
+ * language for improved performance. It is unlikely that a port will use
+ * the data if it has a bitfield scan instruction.
+ */
+#define CPU_USE_GENERIC_BITFIELD_DATA TRUE
+
+/**
+ * @ingroup CPUBitfield
+ * This routine sets @a _output to the bit number of the first bit
+ * set in @a _value. @a _value is of CPU dependent type
+ * @a Priority_Bit_map_control. This type may be either 16 or 32 bits
+ * wide although only the 16 least significant bits will be used.
+ *
+ * There are a number of variables in using a "find first bit" type
+ * instruction.
+ *
+ * -# What happens when run on a value of zero?
+ * -# Bits may be numbered from MSB to LSB or vice-versa.
+ * -# The numbering may be zero or one based.
+ * -# The "find first bit" instruction may search from MSB or LSB.
+ *
+ * RTEMS guarantees that (1) will never happen so it is not a concern.
+ * (2),(3), (4) are handled by the macros @ref _CPU_Priority_Mask and
+ * @ref _CPU_Priority_bits_index. These three form a set of routines
+ * which must logically operate together. Bits in the _value are
+ * set and cleared based on masks built by @ref _CPU_Priority_Mask.
+ * The basic major and minor values calculated by @ref _Priority_Major
+ * and @ref _Priority_Minor are "massaged" by @ref _CPU_Priority_bits_index
+ * to properly range between the values returned by the "find first bit"
+ * instruction. This makes it possible for @ref _Priority_Get_highest to
+ * calculate the major and directly index into the minor table.
+ * This mapping is necessary to ensure that 0 (a high priority major/minor)
+ * is the first bit found.
+ *
+ * This entire "find first bit" and mapping process depends heavily
+ * on the manner in which a priority is broken into a major and minor
+ * components with the major being the 4 MSB of a priority and minor
+ * the 4 LSB. Thus (0 << 4) + 0 corresponds to priority 0 -- the highest
+ * priority. And (15 << 4) + 14 corresponds to priority 254 -- the next
+ * to the lowest priority.
+ *
+ * If your CPU does not have a "find first bit" instruction, then
+ * there are ways to make do without it. Here are a handful of ways
+ * to implement this in software:
+ *
+@verbatim
+ - a series of 16 bit test instructions
+ - a "binary search using if's"
+ - _number = 0
+ if _value > 0x00ff
+ _value >>=8
+ _number = 8;
+
+ if _value > 0x0000f
+ _value >=8
+ _number += 4
+
+ _number += bit_set_table[ _value ]
+@endverbatim
+
+ * where bit_set_table[ 16 ] has values which indicate the first
+ * bit set
+ *
+ * @param[in] _value is the value to be scanned
+ * @param[in] _output is the first bit set
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+
+#if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
+#define _CPU_Bitfield_Find_first_bit( _value, _output ) \
+ { \
+ (_output) = 0; /* do something to prevent warnings */ \
+ }
+#endif
+
+/* end of Bitfield handler macros */
+
+/**
+ * This routine builds the mask which corresponds to the bit fields
+ * as searched by @ref _CPU_Bitfield_Find_first_bit. See the discussion
+ * for that routine.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
+
+#define _CPU_Priority_Mask( _bit_number ) \
+ ( 1 << (_bit_number) )
+
+#endif
+
+/**
+ * @ingroup CPUBitfield
+ * This routine translates the bit numbers returned by
+ * @ref _CPU_Bitfield_Find_first_bit into something suitable for use as
+ * a major or minor component of a priority. See the discussion
+ * for that routine.
+ *
+ * @param[in] _priority is the major or minor number to translate
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+#if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
+
+#define _CPU_Priority_bits_index( _priority ) \
+ (_priority)
+
+#endif
+
+/* end of Priority handler macros */
+
+/* functions */
+
+/**
+ * This routine performs CPU dependent initialization.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+void _CPU_Initialize(void);
+
+/**
+ * @ingroup CPUInterrupt
+ * This routine installs a "raw" interrupt handler directly into the
+ * processor's vector table.
+ *
+ * @param[in] vector is the vector number
+ * @param[in] new_handler is the raw ISR handler to install
+ * @param[in] old_handler is the previously installed ISR Handler
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+void _CPU_ISR_install_raw_handler(
+ uint32_t vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/**
+ * @ingroup CPUInterrupt
+ * This routine installs an interrupt vector.
+ *
+ * @param[in] vector is the vector number
+ * @param[in] new_handler is the RTEMS ISR handler to install
+ * @param[in] old_handler is the previously installed ISR Handler
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+void _CPU_ISR_install_vector(
+ uint32_t vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/**
+ * @ingroup CPUInterrupt
+ * This routine installs the hardware interrupt stack pointer.
+ *
+ * @note It need only be provided if @ref CPU_HAS_HARDWARE_INTERRUPT_STACK
+ * is TRUE.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+void _CPU_Install_interrupt_stack( void );
+
+/**
+ * This routine is the CPU dependent IDLE thread body.
+ *
+ * @note It need only be provided if @ref CPU_PROVIDES_IDLE_THREAD_BODY
+ * is TRUE.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+void *_CPU_Thread_Idle_body( uintptr_t ignored );
+
+/**
+ * @ingroup CPUContext
+ * This routine switches from the run context to the heir context.
+ *
+ * @param[in] run points to the context of the currently executing task
+ * @param[in] heir points to the context of the heir task
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+void _CPU_Context_switch(
+ Context_Control *run,
+ Context_Control *heir
+);
+
+/**
+ * @ingroup CPUContext
+ * This routine is generally used only to restart self in an
+ * efficient manner. It may simply be a label in @ref _CPU_Context_switch.
+ *
+ * @param[in] new_context points to the context to be restored.
+ *
+ * @note May be unnecessary to reload some registers.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+void _CPU_Context_restore(
+ Context_Control *new_context
+);
+
+/**
+ * @ingroup CPUContext
+ * This routine saves the floating point context passed to it.
+ *
+ * @param[in] fp_context_ptr is a pointer to a pointer to a floating
+ * point context area
+ *
+ * @return on output @a *fp_context_ptr will contain the address that
+ * should be used with @ref _CPU_Context_restore_fp to restore this context.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+void _CPU_Context_save_fp(
+ Context_Control_fp **fp_context_ptr
+);
+
+/**
+ * @ingroup CPUContext
+ * This routine restores the floating point context passed to it.
+ *
+ * @param[in] fp_context_ptr is a pointer to a pointer to a floating
+ * point context area to restore
+ *
+ * @return on output @a *fp_context_ptr will contain the address that
+ * should be used with @ref _CPU_Context_save_fp to save this context.
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+void _CPU_Context_restore_fp(
+ Context_Control_fp **fp_context_ptr
+);
+
+/**
+ * @ingroup CPUEndian
+ * The following routine swaps the endian format of an unsigned int.
+ * It must be static because it is referenced indirectly.
+ *
+ * This version will work on any processor, but if there is a better
+ * way for your CPU PLEASE use it. The most common way to do this is to:
+ *
+ * swap least significant two bytes with 16-bit rotate
+ * swap upper and lower 16-bits
+ * swap most significant two bytes with 16-bit rotate
+ *
+ * Some CPUs have special instructions which swap a 32-bit quantity in
+ * a single instruction (e.g. i486). It is probably best to avoid
+ * an "endian swapping control bit" in the CPU. One good reason is
+ * that interrupts would probably have to be disabled to ensure that
+ * an interrupt does not try to access the same "chunk" with the wrong
+ * endian. Another good reason is that on some CPUs, the endian bit
+ * endianness for ALL fetches -- both code and data -- so the code
+ * will be fetched incorrectly.
+ *
+ * @param[in] value is the value to be swapped
+ * @return the value after being endian swapped
+ *
+ * Port Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+static inline uint32_t CPU_swap_u32(
+ uint32_t value
+)
+{
+ uint32_t byte1, byte2, byte3, byte4, swapped;
+
+ byte4 = (value >> 24) & 0xff;
+ byte3 = (value >> 16) & 0xff;
+ byte2 = (value >> 8) & 0xff;
+ byte1 = value & 0xff;
+
+ swapped = (byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4;
+ return swapped;
+}
+
+/**
+ * @ingroup CPUEndian
+ * This routine swaps a 16 bir quantity.
+ *
+ * @param[in] value is the value to be swapped
+ * @return the value after being endian swapped
+ */
+#define CPU_swap_u16( value ) \
+ (((value&0xff) << 8) | ((value >> 8)&0xff))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/schedsim/rtems/sched_cpu/rtems/score/cpu_asm.h b/schedsim/rtems/sched_cpu/rtems/score/cpu_asm.h
new file mode 100644
index 0000000..7c80adb
--- /dev/null
+++ b/schedsim/rtems/sched_cpu/rtems/score/cpu_asm.h
@@ -0,0 +1,74 @@
+/**
+ * @file rtems/score/cpu_asm.h
+ */
+
+/*
+ * BASED UPON SOURCE IN RTEMS, MODIFIED FOR SIMULATOR
+ *
+ * Very loose template for an include file for the cpu_asm.? file
+ * if it is implemented as a ".S" file (preprocessed by cpp) instead
+ * of a ".s" file (preprocessed by gm4 or gasp).
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ *
+ */
+
+#ifndef _RTEMS_SCORE_CPU_ASM_H
+#define _RTEMS_SCORE_CPU_ASM_H
+
+/* pull in the generated offsets */
+
+#include <rtems/score/offsets.h>
+
+/*
+ * Hardware General Registers
+ */
+
+/* put something here */
+
+/*
+ * Hardware Floating Point Registers
+ */
+
+/* put something here */
+
+/*
+ * Hardware Control Registers
+ */
+
+/* put something here */
+
+/*
+ * Calling Convention
+ */
+
+/* put something here */
+
+/*
+ * Temporary registers
+ */
+
+/* put something here */
+
+/*
+ * Floating Point Registers - SW Conventions
+ */
+
+/* put something here */
+
+/*
+ * Temporary floating point registers
+ */
+
+/* put something here */
+
+#endif
+
+/* end of file */
diff --git a/schedsim/rtems/sched_cpu/rtems/score/cpuopts.h b/schedsim/rtems/sched_cpu/rtems/score/cpuopts.h
new file mode 100644
index 0000000..1db8d43
--- /dev/null
+++ b/schedsim/rtems/sched_cpu/rtems/score/cpuopts.h
@@ -0,0 +1,72 @@
+/**
+ * @file rtems/score/cpuopts.h
+ */
+
+/* BASED UPON SOURCE IN RTEMS, MODIFIED FOR SIMULATOR */
+
+/* target cpu dependent options file */
+/* automatically generated -- DO NOT EDIT!! */
+#ifndef _RTEMS_SCORE_CPUOPTS_H
+#define _RTEMS_SCORE_CPUOPTS_H
+
+/* This is added by hand to indicate we are on the RTEMS Scheduler Simulator */
+#define RTEMS_SCHEDSIM
+
+/* if RTEMS_DEBUG is enabled */
+/* #undef RTEMS_DEBUG */
+
+/* if itron api is supported */
+/* #undef RTEMS_ITRON_API */
+
+/* if multiprocessing is enabled */
+/* #undef RTEMS_MULTIPROCESSING */
+
+/* if using newlib */
+#define RTEMS_NEWLIB 1
+
+/* if posix api is supported */
+/* #undef RTEMS_POSIX_API */
+
+/* if networking is enabled */
+#define RTEMS_NETWORKING 1
+
+/* if RTEMS uses tar.h */
+#define RTEMS_USES_TAR_H 1
+
+/* RTEMS version string */
+#define RTEMS_VERSION "4.10.99.0"
+
+/* disable nanosecond granularity for statistics */
+/* #undef __RTEMS_USE_TICKS_FOR_STATISTICS__ */
+
+/* disable nanosecond granularity for cpu usage statistics */
+/* #undef __RTEMS_USE_TICKS_CPU_USAGE_STATISTICS__ */
+
+/* disable nanosecond granularity for period statistics */
+/* #undef __RTEMS_USE_TICKS_RATE_MONOTONIC_STATISTICS__ */
+
+/* disable inlining _Thread_Enable_dispatch */
+/* #undef __RTEMS_DO_NOT_INLINE_THREAD_ENABLE_DISPATCH__ */
+
+/* disable inlining _Thread_Enable_dispatch */
+/* #undef __RTEMS_DO_NOT_INLINE_CORE_MUTEX_SEIZE__ */
+
+/* disable inlining _Thread_queue_Enqueue_priority */
+/* #undef __RTEMS_DO_NOT_UNROLL_THREADQ_ENQUEUE_PRIORITY__ */
+
+/* disable strict order mutex */
+/* #undef __RTEMS_STRICT_ORDER_MUTEX__ */
+
+/* Define to 1 if ada/gnat bindings are built-in */
+#define __RTEMS_ADA__ 1
+
+/* major version portion of an RTEMS release */
+#define __RTEMS_MAJOR__ 4
+
+/* minor version portion of an RTEMS release */
+#define __RTEMS_MINOR__ 10
+
+/* revision version portion of an RTEMS release */
+#define __RTEMS_REVISION__ 99
+
+#endif /* _RTEMS_SCORE_CPUOPTS_H */
diff --git a/schedsim/rtems/sched_cpu/rtems/score/no_cpu.h b/schedsim/rtems/sched_cpu/rtems/score/no_cpu.h
new file mode 100644
index 0000000..bb0706f
--- /dev/null
+++ b/schedsim/rtems/sched_cpu/rtems/score/no_cpu.h
@@ -0,0 +1,59 @@
+/* no_cpu.h
+ *
+ * BASED UPON SOURCE IN RTEMS, MODIFIED FOR SIMULATOR
+ *
+ * This file sets up basic CPU dependency settings based on
+ * compiler settings. For example, it can determine if
+ * floating point is available. This particular implementation
+ * is specified to the NO CPU port.
+ *
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ *
+ */
+
+#ifndef _RTEMS_SCORE_NO_CPU_H
+#define _RTEMS_SCORE_NO_CPU_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This file contains the information required to build
+ * RTEMS for a particular member of the NO CPU family.
+ * It does this by setting variables to indicate which
+ * implementation dependent features are present in a particular
+ * member of the family.
+ *
+ * This is a good place to list all the known CPU models
+ * that this port supports and which RTEMS CPU model they correspond
+ * to.
+ */
+
+/*
+ * Figure out all CPU Model Feature Flags based upon compiler
+ * predefines.
+ */
+
+#define CPU_MODEL_NAME ""
+#define NOCPU_HAS_FPU 1
+
+/*
+ * Define the name of the CPU family.
+ */
+
+#define CPU_NAME "RTEMS Sheduler Simulator"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTEMS_SCORE_NO_CPU_H */
diff --git a/schedsim/rtems/sched_cpu/rtems/score/types.h b/schedsim/rtems/sched_cpu/rtems/score/types.h
new file mode 100644
index 0000000..10e4f03
--- /dev/null
+++ b/schedsim/rtems/sched_cpu/rtems/score/types.h
@@ -0,0 +1,51 @@
+/**
+ * @file rtems/score/types.h
+ */
+
+/*
+ * BASED UPON SOURCE IN RTEMS, MODIFIED FOR SIMULATOR
+ *
+ * This include file contains type definitions pertaining to the Intel
+ * no_cpu processor family.
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifndef _RTEMS_SCORE_TYPES_H
+#define _RTEMS_SCORE_TYPES_H
+
+#include <rtems/score/basedefs.h>
+
+#ifndef ASM
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * 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;
+
+/** This defines the return type for an ISR entry point. */
+typedef void no_cpu_isr;
+
+/** This defines the prototype for an ISR entry point. */
+typedef no_cpu_isr ( *no_cpu_isr_entry )( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !ASM */
+
+#endif
diff --git a/schedsim/rtems/sched_cpu/rtems/stringto.h b/schedsim/rtems/sched_cpu/rtems/stringto.h
new file mode 100644
index 0000000..9201f5b
--- /dev/null
+++ b/schedsim/rtems/sched_cpu/rtems/stringto.h
@@ -0,0 +1 @@
+#include <stringto.h>
diff --git a/schedsim/rtems/wkspace.c b/schedsim/rtems/wkspace.c
new file mode 100644
index 0000000..f4209d5
--- /dev/null
+++ b/schedsim/rtems/wkspace.c
@@ -0,0 +1,100 @@
+/*
+ * BASED UPON SOURCE IN RTEMS, MODIFIED FOR SIMULATOR
+ *
+ * Workspace Handler
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/interr.h>
+
+#include <stdlib.h>
+
+#if defined(DEBUG_WORKSPACE)
+ #include <stdio.h>
+#endif
+
+/*
+ * _Workspace_Handler_initialization
+ */
+void _Workspace_Handler_initialization(void)
+{
+}
+
+/*
+ * _Workspace_Allocate
+ */
+void *_Workspace_Allocate(
+ size_t size
+)
+{
+ void *memory;
+
+ memory = calloc( 1, size );
+ #if defined(DEBUG_WORKSPACE)
+ fprintf(
+ stderr,
+ "Workspace_Allocate(%d) from %p/%p -> %p\n",
+ size,
+ __builtin_return_address( 0 ),
+ __builtin_return_address( 1 ),
+ memory
+ );
+ #endif
+ return memory;
+}
+
+/*
+ * _Workspace_Free
+ */
+void _Workspace_Free(
+ void *block
+)
+{
+ #if defined(DEBUG_WORKSPACE)
+ fprintf(
+ stderr,
+ block,
+ __builtin_return_address( 0 ),
+ __builtin_return_address( 1 )
+ );
+ #endif
+ free( block );
+}
+
+/*
+ * _Workspace_Allocate_or_fatal_error
+ */
+void *_Workspace_Allocate_or_fatal_error(
+ size_t size
+)
+{
+ void *memory;
+
+ memory = calloc( 1, size );
+ #if defined(DEBUG_WORKSPACE)
+ fprintf(
+ stderr,
+ "Workspace_Allocate_or_fatal_error(%d) from %p/%p -> %p\n",
+ size,
+ __builtin_return_address( 0 ),
+ __builtin_return_address( 1 ),
+ memory
+ );
+ #endif
+
+ return memory;
+}
diff --git a/schedsim/shell/.cvsignore b/schedsim/shell/.cvsignore
new file mode 100644
index 0000000..282522d
--- /dev/null
+++ b/schedsim/shell/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/schedsim/shell/ChangeLog b/schedsim/shell/ChangeLog
new file mode 100644
index 0000000..ca335db
--- /dev/null
+++ b/schedsim/shell/ChangeLog
@@ -0,0 +1,37 @@
+2011-04-07 Joel Sherrill <joel.sherrill@oarcorp.com>
+
+ * shared/main_clocktick.c, shared/main_semcreate.c,
+ shared/main_semdelete.c, shared/main_semflush.c,
+ shared/main_semobtain.c, shared/main_semrelease.c,
+ shared/main_taskcreate.c, shared/main_taskdelete.c,
+ shared/main_taskmode.c, shared/main_taskpriority.c,
+ shared/main_taskresume.c, shared/main_tasksuspend.c,
+ shared/main_taskwakeafter.c, shared/schedsim_shell.h: Compiles now
+ and do not core dump when RTEMS is not initialized.
+
+2010-12-17 Joel Sherrill <joel.sherrill@oarcorp.com>
+ Jennifer Averett <jennifer.averett@oarcorp.com>
+
+ Add RTEMS Scheduler Simulator. This is the shell scripting portion.
+ * .cvsignore, ChangeLog, Makefile.am, schedsim_priority/.cvsignore,
+ schedsim_priority/Makefile.am, schedsim_priority/config.c,
+ schedsim_priority/printheir_executing.c,
+ schedsim_priority/schedsim.cc,
+ schedsim_priority/wrap_thread_dispatch.c, scripts/script01,
+ scripts/script02, scripts/script03, scripts/script04,
+ scripts/script05, scripts/script06, shared/.cvsignore,
+ shared/Makefile.am, shared/commands.c, shared/getopt.c,
+ shared/lookup_semaphore.c, shared/lookup_task.c,
+ shared/main_clocktick.c, shared/main_echo.c, shared/main_executing.c,
+ shared/main_heir.c, shared/main_help.c, shared/main_rtemsinit.c,
+ shared/main_semcreate.c, shared/main_semdelete.c,
+ shared/main_semflush.c, shared/main_semobtain.c,
+ shared/main_semrelease.c, shared/main_taskcreate.c,
+ shared/main_taskdelete.c, shared/main_taskmode.c,
+ shared/main_taskpriority.c, shared/main_taskresume.c,
+ shared/main_tasksuspend.c, shared/main_taskwakeafter.c,
+ shared/schedsim_shell.h, shared/shell_cmdset.c,
+ shared/shell_makeargs.c, shared/include/shell.h,
+ shared/include/newlib/_ansi.h, shared/include/newlib/getopt.h: New
+ files.
+
diff --git a/schedsim/shell/Makefile.am b/schedsim/shell/Makefile.am
new file mode 100644
index 0000000..9cd86f5
--- /dev/null
+++ b/schedsim/shell/Makefile.am
@@ -0,0 +1,12 @@
+##
+## $Id$
+##
+
+ACLOCAL_AMFLAGS = -I ./../aclocal
+
+SUBDIRS = shared schedsim_priority
+
+DIST_SUBDIRS = shared schedsim_priority
+
+include $(top_srcdir)/../automake/subdirs.am
+include $(top_srcdir)/../automake/host.am
diff --git a/schedsim/shell/schedsim_priority/.cvsignore b/schedsim/shell/schedsim_priority/.cvsignore
new file mode 100644
index 0000000..282522d
--- /dev/null
+++ b/schedsim/shell/schedsim_priority/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/schedsim/shell/schedsim_priority/Makefile.am b/schedsim/shell/schedsim_priority/Makefile.am
new file mode 100644
index 0000000..edd2e62
--- /dev/null
+++ b/schedsim/shell/schedsim_priority/Makefile.am
@@ -0,0 +1,32 @@
+##
+## $Id$
+##
+
+bin_PROGRAMS = schedsim
+schedsim_SOURCES = config.c \
+ schedsim.cc wrap_thread_dispatch.c printheir_executing.c
+
+cpukitdir=@rtems_srcdir@/cpukit
+schedsim_CPPFLAGS = -I$(srcdir)/sched_cpu
+schedsim_CPPFLAGS += -I$(srcdir)/../../rtems
+schedsim_CPPFLAGS += -I$(cpukitdir)/include
+schedsim_CPPFLAGS += -I$(cpukitdir)/score/include
+schedsim_CPPFLAGS += -I$(cpukitdir)/score/inline
+schedsim_CPPFLAGS += -I$(cpukitdir)/rtems/include
+schedsim_CPPFLAGS += -I$(cpukitdir)/rtems/inline
+schedsim_CPPFLAGS += -I$(cpukitdir)/sapi/include
+schedsim_CPPFLAGS += -I$(cpukitdir)/sapi/inline
+schedsim_CPPFLAGS += -I$(cpukitdir)/libcsupport/include
+schedsim_CPPFLAGS += -I$(cpukitdir)/libmisc/stringto
+schedsim_CPPFLAGS += -I$(srcdir)/../../rtems/sched_cpu
+schedsim_CPPFLAGS += -I$(srcdir)/../shared/include
+schedsim_CPPFLAGS += -I$(srcdir)/../shared
+
+schedsim_LDFLAGS =-Wl,--wrap=_Thread_Dispatch
+## schedsim_LDADD +=-Wl,--start-group
+schedsim_LDADD = ../shared/libschedsim.a
+schedsim_LDADD += ../../rtems/librtems.a
+schedsim_LDADD += ../shared/libschedsim.a
+## schedsim_LDADD +=-Wl,--end-group
+
+include $(top_srcdir)/../automake/host.am
diff --git a/schedsim/shell/schedsim_priority/config.c b/schedsim/shell/schedsim_priority/config.c
new file mode 100644
index 0000000..227f912
--- /dev/null
+++ b/schedsim/shell/schedsim_priority/config.c
@@ -0,0 +1,7 @@
+#include <rtems.h>
+
+#define CONFIGURE_INIT
+#define CONFIGURE_MAXIMUM_TASKS 1000
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1000
+#include <confdefs.h>
+
diff --git a/schedsim/shell/schedsim_priority/printheir_executing.c b/schedsim/shell/schedsim_priority/printheir_executing.c
new file mode 100644
index 0000000..b0855d3
--- /dev/null
+++ b/schedsim/shell/schedsim_priority/printheir_executing.c
@@ -0,0 +1,31 @@
+/*
+ * printheir_executing
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <rtems.h>
+
+void PRINT_EXECUTING() {
+ printf(
+ " Thread Executing: 0x%08x priority=%ld\n",
+ _Thread_Executing->Object.id,
+ (long) _Thread_Executing->current_priority
+ );
+}
+
+void PRINT_HEIR() {
+ printf(
+ " Thread Heir: 0x%08x priority=%ld\n",
+ _Thread_Heir->Object.id,
+ (long) _Thread_Heir->current_priority
+ );
+}
diff --git a/schedsim/shell/schedsim_priority/scenarios/script01 b/schedsim/shell/schedsim_priority/scenarios/script01
new file mode 100644
index 0000000..9a40dc3
--- /dev/null
+++ b/schedsim/shell/schedsim_priority/scenarios/script01
@@ -0,0 +1,11 @@
+echo "*** TEST 01 ***"
+rtems_init
+echo "=== Create and delete 0x0a010001 ==="
+task_create TA1 3
+task_delete TA1
+echo "=== Create and delete 0x0a010002 ==="
+task_create TA1 3
+task_delete 0x0a010002
+echo "*** END OF TEST 01 ***"
+exit
+# We will not get here
diff --git a/schedsim/shell/schedsim_priority/scenarios/script02 b/schedsim/shell/schedsim_priority/scenarios/script02
new file mode 100644
index 0000000..294956c
--- /dev/null
+++ b/schedsim/shell/schedsim_priority/scenarios/script02
@@ -0,0 +1,9 @@
+echo "*** TEST 02 ***"
+rtems_init
+echo "=== Create 0x0a010001 ==="
+task_create TA1 1
+task_wake_after 5
+clock_tick 7
+echo "*** END OF TEST 2 ***"
+exit
+# We will not get here
diff --git a/schedsim/shell/schedsim_priority/scenarios/script03 b/schedsim/shell/schedsim_priority/scenarios/script03
new file mode 100644
index 0000000..a05ab26
--- /dev/null
+++ b/schedsim/shell/schedsim_priority/scenarios/script03
@@ -0,0 +1,19 @@
+echo "*** TEST 03 ***"
+rtems_init
+echo "=== Create 0x0a010001 ==="
+task_create TA1 1
+echo "** Mode - query"
+task_mode
+echo "** Mode - set no timeslicing"
+task_mode -t
+echo "** Mode - set timeslicing"
+task_mode -T
+echo "** Mode - set no timeslicing and no preempt"
+task_mode -t -p
+echo "** Mode - set timeslicing and preempt"
+task_mode -T -P
+echo "** Mode - query"
+task_mode
+echo "*** END OF TEST 03 ***"
+exit
+# We will not get here
diff --git a/schedsim/shell/schedsim_priority/scenarios/script04 b/schedsim/shell/schedsim_priority/scenarios/script04
new file mode 100644
index 0000000..4eebcd7
--- /dev/null
+++ b/schedsim/shell/schedsim_priority/scenarios/script04
@@ -0,0 +1,10 @@
+echo "*** TEST 04 ***"
+rtems_init
+echo Create 0x0a010001
+task_create TA1 1
+task_suspend TA1
+task_create TA1 2
+task_resume TA1
+echo "*** END OF TEST 04 ***"
+exit
+# We will not get here
diff --git a/schedsim/shell/schedsim_priority/scenarios/script05 b/schedsim/shell/schedsim_priority/scenarios/script05
new file mode 100644
index 0000000..c57ea4c
--- /dev/null
+++ b/schedsim/shell/schedsim_priority/scenarios/script05
@@ -0,0 +1,22 @@
+echo "*** TEST 05 ***"
+rtems_init
+echo Create 0x0a010001
+task_create TA1 1
+task_create TA2 2
+task_create TA3 3
+semaphore_create SEM1
+semaphore_obtain SEM1 0
+semaphore_obtain SEM1 0
+semaphore_obtain SEM1 0
+semaphore_flush SEM1
+echo "*** Now back to TA1 to do it differently"
+semaphore_obtain SEM1 0
+semaphore_obtain SEM1 0
+semaphore_release SEM1
+# as TA1
+semaphore_obtain SEM1 0
+semaphore_delete SEM1
+# should preempt
+echo "*** END OF TEST 05 ***"
+exit
+# We will not get here
diff --git a/schedsim/shell/schedsim_priority/scenarios/script06 b/schedsim/shell/schedsim_priority/scenarios/script06
new file mode 100644
index 0000000..962568d
--- /dev/null
+++ b/schedsim/shell/schedsim_priority/scenarios/script06
@@ -0,0 +1,14 @@
+echo "*** TEST 06 ***"
+rtems_init
+echo Create 0x0a010001
+task_create TA1 1
+task_create TA2 2
+task_create TA3 3
+semaphore_create SEM1
+semaphore_obtain SEM1 0
+semaphore_obtain SEM1 0
+semaphore_release SEM1
+semaphore_delete SEM1
+echo "*** END OF TEST 06 ***"
+exit
+# We will not get here
diff --git a/schedsim/shell/schedsim_priority/schedsim.cc b/schedsim/shell/schedsim_priority/schedsim.cc
new file mode 100644
index 0000000..b70dd71
--- /dev/null
+++ b/schedsim/shell/schedsim_priority/schedsim.cc
@@ -0,0 +1,169 @@
+/*
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#include <newlib/getopt.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "shell.h"
+#include "rtems_sched.h"
+
+/*
+ * Variables to control global behavior
+ */
+int verbose = 0;
+const char *progname;
+const char *scriptname;
+
+FILE *Script;
+int ScriptFileLine = 0;
+
+/*
+ * Print program usage message
+ */
+void usage()
+{
+ fprintf(
+ stderr,
+ "Usage: %s [-v] script\n"
+ "\n"
+ " -v - enable verbose output\n",
+ progname
+ );
+ exit( -1 );
+}
+
+#define RTEMS_SHELL_MAXIMUM_ARGUMENTS (128)
+
+void ProcessScript(
+ FILE *script
+)
+{
+ char buffer[512];
+ char *cStatus;
+ char *c;
+ size_t length;
+ int argc;
+ char *argv[RTEMS_SHELL_MAXIMUM_ARGUMENTS];
+ rtems_shell_cmd_t *shell_cmd;
+
+
+ while ( 1 ) {
+ cStatus = fgets( buffer, sizeof(buffer), script );
+ if ( cStatus == NULL )
+ break;
+
+ // If the last line does not have a CR, then we don't want to
+ // arbitrarily clobber an = instead of a \n.
+ length = strlen(buffer);
+ if ( buffer[ length - 1] == '\n' )
+ buffer[ length - 1] = '\0';
+
+ if ( verbose )
+ fprintf( stderr, "%d: %s\n", ++ScriptFileLine, buffer );
+
+ if ( buffer[0] == '#' )
+ continue;
+
+ for ( c = buffer ; *c ; c++ ) {
+ if (!isblank((int)*c))
+ break;
+ }
+
+
+ if (!strcmp(c,"bye") || !strcmp(c,"exit")) {
+ return;
+ }
+
+ if (rtems_shell_make_args(c, &argc, argv, RTEMS_SHELL_MAXIMUM_ARGUMENTS)) {
+ fprintf(stderr, "Error parsing arguments\n" );
+ continue;
+ }
+
+ shell_cmd = rtems_shell_lookup_cmd(argv[0]);
+ if ( !shell_cmd ) {
+ fprintf(stderr, "%s is unknown command\n", c );
+ continue;
+ }
+
+ shell_cmd->command(argc, argv);
+ }
+}
+
+int main(
+ int argc,
+ char **argv
+)
+{
+ int opt;
+ progname = argv[0];
+
+ while ((opt = getopt(argc, argv, "v")) != -1) {
+ switch (opt) {
+ case 'v': verbose = 1; break;
+ default: /* '?' */
+ usage();
+ }
+ }
+
+ if ( optind >= argc ) {
+ fprintf( stderr, "no script to process\n" );
+ usage();
+ }
+
+ scriptname = argv[ optind ];
+
+ if ( verbose ) {
+ fprintf(
+ stderr,
+ "Script File : %s\n"
+ "verbose : %d\n",
+ scriptname,
+ verbose
+ );
+ }
+
+ //
+ // Initialize the command interpreter
+ //
+ rtems_shell_initialize_command_set();
+
+ //
+ // Open the script file
+ //
+ Script = fopen( scriptname, "r" );
+ if ( !Script ) {
+ fprintf( stderr, "Unable to open script file (%s)\n", scriptname );
+ exit( -1 );
+ }
+
+ //
+ // Process the Script
+ //
+ ProcessScript( Script );
+
+ //
+ // Open the script file
+ //
+ (void) fclose( Script );
+
+ //
+ // Just in case something throws
+ //
+ try {
+ } catch (...) {
+ exit(-1);
+ }
+
+ return 0;
+}
diff --git a/schedsim/shell/schedsim_priority/wrap_thread_dispatch.c b/schedsim/shell/schedsim_priority/wrap_thread_dispatch.c
new file mode 100644
index 0000000..3432188
--- /dev/null
+++ b/schedsim/shell/schedsim_priority/wrap_thread_dispatch.c
@@ -0,0 +1,42 @@
+/*
+ * Thread Dispatch Wrapper Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#include "shell.h"
+#include <schedsim_shell.h>
+
+#include <stdio.h>
+#include <rtems.h>
+
+Thread_Control *last_heir = NULL;
+Thread_Control *last_executing = NULL;
+
+extern void __real__Thread_Dispatch(void);
+
+void check_heir_and_executing(void)
+{
+ if ( last_heir != _Thread_Heir )
+ PRINT_HEIR();
+
+ if ( last_executing != _Thread_Executing )
+ PRINT_EXECUTING();
+
+ last_heir = _Thread_Heir;
+ last_executing = _Thread_Executing;
+}
+
+void __wrap__Thread_Dispatch(void)
+{
+ check_heir_and_executing();
+ __real__Thread_Dispatch();
+ check_heir_and_executing();
+}
diff --git a/schedsim/shell/shared/.cvsignore b/schedsim/shell/shared/.cvsignore
new file mode 100644
index 0000000..282522d
--- /dev/null
+++ b/schedsim/shell/shared/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/schedsim/shell/shared/Makefile.am b/schedsim/shell/shared/Makefile.am
new file mode 100644
index 0000000..06684b4
--- /dev/null
+++ b/schedsim/shell/shared/Makefile.am
@@ -0,0 +1,61 @@
+##
+## $Id$
+##
+
+ACLOCAL_AMFLAGS = -I ../../../aclocal
+
+lib_LIBRARIES = libschedsim.a
+
+cpukitdir=@rtems_srcdir@/cpukit
+libschedsim_a_CPPFLAGS = -D__RTEMS_VIOLATE_KERNEL_VISIBILITY__
+libschedsim_a_CPPFLAGS += -I$(srcdir)/sched_cpu
+libschedsim_a_CPPFLAGS += -I$(srcdir)/../../rtems
+libschedsim_a_CPPFLAGS += -I$(cpukitdir)/include
+libschedsim_a_CPPFLAGS += -I$(cpukitdir)/score/include
+libschedsim_a_CPPFLAGS += -I$(cpukitdir)/score/inline
+libschedsim_a_CPPFLAGS += -I$(cpukitdir)/rtems/include
+libschedsim_a_CPPFLAGS += -I$(cpukitdir)/rtems/inline
+libschedsim_a_CPPFLAGS += -I$(cpukitdir)/sapi/include
+libschedsim_a_CPPFLAGS += -I$(cpukitdir)/sapi/inline
+libschedsim_a_CPPFLAGS += -I$(cpukitdir)/libcsupport/include
+libschedsim_a_CPPFLAGS += -I$(cpukitdir)/libmisc/stringto
+libschedsim_a_CPPFLAGS += -I$(srcdir)/../../rtems/sched_cpu
+libschedsim_a_CPPFLAGS += -I$(srcdir)/include
+
+
+libschedsim_a_SOURCES = \
+ commands.c \
+ getopt.c \
+ lookup_semaphore.c \
+ lookup_task.c \
+ main_echo.c \
+ main_executing.c \
+ main_heir.c \
+ main_help.c \
+ main_rtemsinit.c \
+ main_clocktick.c \
+ main_semcreate.c \
+ main_semdelete.c \
+ main_semflush.c \
+ main_semobtain.c \
+ main_semrelease.c \
+ main_taskcreate.c \
+ main_taskdelete.c \
+ main_taskmode.c \
+ main_taskpriority.c \
+ main_taskresume.c \
+ main_tasksuspend.c \
+ main_taskwakeafter.c \
+ shell_cmdset.c \
+ shell_makeargs.c
+
+schedsim_shell_includedir = $(includedir)/schedsim
+schedsim_newlib_includedir = $(includedir)/schedsim/newlib
+
+schedsim_shell_include_HEADERS = include/shell.h schedsim_shell.h
+
+schedsim_newlib_include_HEADERS = \
+ include/newlib/getopt.h \
+ include/newlib/_ansi.h
+
+include $(top_srcdir)/../automake/host.am
diff --git a/schedsim/shell/shared/commands.c b/schedsim/shell/shared/commands.c
new file mode 100644
index 0000000..c872c2e
--- /dev/null
+++ b/schedsim/shell/shared/commands.c
@@ -0,0 +1,73 @@
+/*
+ * BASED UPON SOURCE IN RTEMS, MODIFIED FOR SIMULATOR
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#include "shell.h"
+#include <stdio.h>
+
+extern rtems_shell_cmd_t rtems_shell_ECHO_Command;
+extern rtems_shell_cmd_t rtems_shell_HELP_Command;
+
+extern rtems_shell_cmd_t rtems_shell_RTEMS_INIT_Command;
+extern rtems_shell_cmd_t rtems_shell_TASK_CREATE_Command;
+extern rtems_shell_cmd_t rtems_shell_TASK_DELETE_Command;
+extern rtems_shell_cmd_t rtems_shell_TASK_MODE_Command;
+extern rtems_shell_cmd_t rtems_shell_TASK_PRIORITY_Command;
+extern rtems_shell_cmd_t rtems_shell_TASK_SUSPEND_Command;
+extern rtems_shell_cmd_t rtems_shell_TASK_RESUME_Command;
+extern rtems_shell_cmd_t rtems_shell_TASK_WAKE_AFTER_Command;
+
+extern rtems_shell_cmd_t rtems_shell_CLOCK_TICK_Command;
+
+
+extern rtems_shell_cmd_t rtems_shell_SEMAPHORE_CREATE_Command;
+extern rtems_shell_cmd_t rtems_shell_SEMAPHORE_DELETE_Command;
+extern rtems_shell_cmd_t rtems_shell_SEMAPHORE_OBTAIN_Command;
+extern rtems_shell_cmd_t rtems_shell_SEMAPHORE_RELEASE_Command;
+extern rtems_shell_cmd_t rtems_shell_SEMAPHORE_FLUSH_Command;
+
+extern rtems_shell_cmd_t rtems_shell_TASK_EXECUTING_Command;
+extern rtems_shell_cmd_t rtems_shell_TASK_HEIR_Command;
+
+rtems_shell_cmd_t *rtems_shell_Initial_commands[] = {
+ /* Generic Commands */
+ &rtems_shell_ECHO_Command,
+ &rtems_shell_HELP_Command,
+
+ /* RTEMS Classic API Type Commands */
+ &rtems_shell_RTEMS_INIT_Command,
+ &rtems_shell_TASK_CREATE_Command,
+ &rtems_shell_TASK_DELETE_Command,
+ &rtems_shell_TASK_MODE_Command,
+ &rtems_shell_TASK_PRIORITY_Command,
+ &rtems_shell_TASK_SUSPEND_Command,
+ &rtems_shell_TASK_RESUME_Command,
+ &rtems_shell_TASK_WAKE_AFTER_Command,
+
+ &rtems_shell_CLOCK_TICK_Command,
+
+ &rtems_shell_SEMAPHORE_CREATE_Command,
+ &rtems_shell_SEMAPHORE_DELETE_Command,
+ &rtems_shell_SEMAPHORE_OBTAIN_Command,
+ &rtems_shell_SEMAPHORE_RELEASE_Command,
+ &rtems_shell_SEMAPHORE_FLUSH_Command,
+
+ /* RTEMS Helper Commands */
+ &rtems_shell_TASK_EXECUTING_Command,
+ &rtems_shell_TASK_HEIR_Command,
+ NULL
+};
+
+rtems_shell_alias_t *rtems_shell_Initial_aliases[] = {
+ NULL
+};
+
diff --git a/schedsim/shell/shared/getopt.c b/schedsim/shell/shared/getopt.c
new file mode 100644
index 0000000..df7d27a
--- /dev/null
+++ b/schedsim/shell/shared/getopt.c
@@ -0,0 +1,477 @@
+/****************************************************************************
+
+getopt.c - Read command line options
+
+AUTHOR: Gregory Pietsch
+CREATED Fri Jan 10 21:13:05 1997
+
+DESCRIPTION:
+
+The getopt() function parses the command line arguments. Its arguments argc
+and argv are the argument count and array as passed to the main() function
+on program invocation. The argument optstring is a list of available option
+characters. If such a character is followed by a colon (`:'), the option
+takes an argument, which is placed in optarg. If such a character is
+followed by two colons, the option takes an optional argument, which is
+placed in optarg. If the option does not take an argument, optarg is NULL.
+
+The external variable optind is the index of the next array element of argv
+to be processed; it communicates from one call to the next which element to
+process.
+
+The getopt_long() function works like getopt() except that it also accepts
+long options started by two dashes `--'. If these take values, it is either
+in the form
+
+--arg=value
+
+ or
+
+--arg value
+
+It takes the additional arguments longopts which is a pointer to the first
+element of an array of type struct option. The last element of the array
+has to be filled with NULL for the name field.
+
+The longind pointer points to the index of the current long option relative
+to longopts if it is non-NULL.
+
+The getopt() function returns the option character if the option was found
+successfully, `:' if there was a missing parameter for one of the options,
+`?' for an unknown option character, and EOF for the end of the option list.
+
+The getopt_long() function's return value is described in the header file.
+
+The function getopt_long_only() is identical to getopt_long(), except that a
+plus sign `+' can introduce long options as well as `--'.
+
+The following describes how to deal with options that follow non-option
+argv-elements.
+
+If the caller did not specify anything, the default is REQUIRE_ORDER if the
+environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+REQUIRE_ORDER means don't recognize them as options; stop option processing
+when the first non-option is seen. This is what Unix does. This mode of
+operation is selected by either setting the environment variable
+POSIXLY_CORRECT, or using `+' as the first character of the optstring
+parameter.
+
+PERMUTE is the default. We permute the contents of ARGV as we scan, so that
+eventually all the non-options are at the end. This allows options to be
+given in any order, even with programs that were not written to expect this.
+
+RETURN_IN_ORDER is an option available to programs that were written to
+expect options and other argv-elements in any order and that care about the
+ordering of the two. We describe each non-option argv-element as if it were
+the argument of an option with character code 1. Using `-' as the first
+character of the optstring parameter selects this mode of operation.
+
+The special argument `--' forces an end of option-scanning regardless of the
+value of ordering. In the case of RETURN_IN_ORDER, only `--' can cause
+getopt() and friends to return EOF with optind != argc.
+
+COPYRIGHT NOTICE AND DISCLAIMER:
+
+Copyright (C) 1997 Gregory Pietsch
+
+This file and the accompanying getopt.h header file are hereby placed in the
+public domain without restrictions. Just give the author credit, don't
+claim you wrote it or prevent anyone else from using it.
+
+Gregory Pietsch's current e-mail address:
+gpietsch@comcast.net
+****************************************************************************/
+
+/* include files */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <newlib/getopt.h>
+
+/* macros */
+#define NO_ARG 0
+#define REQUIRED_ARG 1
+#define OPTIONAL_ARG 2
+
+/* types */
+typedef enum GETOPT_ORDERING_T
+{
+ PERMUTE,
+ RETURN_IN_ORDER,
+ REQUIRE_ORDER
+} GETOPT_ORDERING_T;
+
+/* globally-defined variables */
+char *optarg = 0;
+int optind = 0;
+int opterr = 1;
+int optopt = '?';
+
+/* static variables */
+static int optwhere = 0;
+
+/* functions */
+
+/* reverse_argv_elements: reverses num elements starting at argv */
+static void
+reverse_argv_elements (char **argv, int num)
+{
+ int i;
+ char *tmp;
+
+ for (i = 0; i < (num >> 1); i++)
+ {
+ tmp = argv[i];
+ argv[i] = argv[num - i - 1];
+ argv[num - i - 1] = tmp;
+ }
+}
+
+/* permute: swap two blocks of argv-elements given their lengths */
+static void
+permute (char *const argv[], int len1, int len2)
+{
+ reverse_argv_elements ((char **) argv, len1);
+ reverse_argv_elements ((char **) argv, len1 + len2);
+ reverse_argv_elements ((char **) argv, len2);
+}
+
+/* is_option: is this argv-element an option or the end of the option list? */
+static int
+is_option (char *argv_element, int only)
+{
+ return ((argv_element == 0)
+ || (argv_element[0] == '-') || (only && argv_element[0] == '+'));
+}
+
+/* read_globals: read the values from the globals into a getopt_data
+ structure */
+static void
+read_globals (struct getopt_data *data)
+{
+ data->optarg = optarg;
+ data->optind = optind;
+ data->opterr = opterr;
+ data->optopt = optopt;
+ data->optwhere = optwhere;
+}
+
+/* write_globals: write the values into the globals from a getopt_data
+ structure */
+static void
+write_globals (struct getopt_data *data)
+{
+ optarg = data->optarg;
+ optind = data->optind;
+ opterr = data->opterr;
+ optopt = data->optopt;
+ optwhere = data->optwhere;
+}
+
+/* getopt_internal: the function that does all the dirty work */
+static int
+getopt_internal (int argc, char *const argv[], const char *shortopts,
+ const struct option *longopts, int *longind, int only,
+ struct getopt_data *data)
+{
+ GETOPT_ORDERING_T ordering = PERMUTE;
+ size_t permute_from = 0;
+ int num_nonopts = 0;
+ int optindex = 0;
+ size_t match_chars = 0;
+ char *possible_arg = 0;
+ int longopt_match = -1;
+ int has_arg = -1;
+ char *cp = 0;
+ int arg_next = 0;
+
+ /* first, deal with silly parameters and easy stuff */
+ if (argc == 0 || argv == 0 || (shortopts == 0 && longopts == 0)
+ || data->optind >= argc || argv[data->optind] == 0)
+ return EOF;
+ if (strcmp (argv[data->optind], "--") == 0)
+ {
+ data->optind++;
+ return EOF;
+ }
+
+ /* if this is our first time through */
+ if (data->optind == 0)
+ data->optind = data->optwhere = 1;
+
+ /* define ordering */
+ if (shortopts != 0 && (*shortopts == '-' || *shortopts == '+'))
+ {
+ ordering = (*shortopts == '-') ? RETURN_IN_ORDER : REQUIRE_ORDER;
+ shortopts++;
+ }
+ else
+ ordering = (getenv ("POSIXLY_CORRECT") != 0) ? REQUIRE_ORDER : PERMUTE;
+
+ /*
+ * based on ordering, find our next option, if we're at the beginning of
+ * one
+ */
+ if (data->optwhere == 1)
+ {
+ switch (ordering)
+ {
+ default: /* shouldn't happen */
+ case PERMUTE:
+ permute_from = data->optind;
+ num_nonopts = 0;
+ while (!is_option (argv[data->optind], only))
+ {
+ data->optind++;
+ num_nonopts++;
+ }
+ if (argv[data->optind] == 0)
+ {
+ /* no more options */
+ data->optind = permute_from;
+ return EOF;
+ }
+ else if (strcmp (argv[data->optind], "--") == 0)
+ {
+ /* no more options, but have to get `--' out of the way */
+ permute (argv + permute_from, num_nonopts, 1);
+ data->optind = permute_from + 1;
+ return EOF;
+ }
+ break;
+ case RETURN_IN_ORDER:
+ if (!is_option (argv[data->optind], only))
+ {
+ data->optarg = argv[data->optind++];
+ return (data->optopt = 1);
+ }
+ break;
+ case REQUIRE_ORDER:
+ if (!is_option (argv[data->optind], only))
+ return EOF;
+ break;
+ }
+ }
+ /* we've got an option, so parse it */
+
+ /* first, is it a long option? */
+ if (longopts != 0
+ && (memcmp (argv[data->optind], "--", 2) == 0
+ || (only && argv[data->optind][0] == '+')) && data->optwhere == 1)
+ {
+ /* handle long options */
+ if (memcmp (argv[data->optind], "--", 2) == 0)
+ data->optwhere = 2;
+ longopt_match = -1;
+ possible_arg = strchr (argv[data->optind] + data->optwhere, '=');
+ if (possible_arg == 0)
+ {
+ /* no =, so next argv might be arg */
+ match_chars = strlen (argv[data->optind]);
+ possible_arg = argv[data->optind] + match_chars;
+ match_chars = match_chars - data->optwhere;
+ }
+ else
+ match_chars = (possible_arg - argv[data->optind]) - data->optwhere;
+ for (optindex = 0; longopts[optindex].name != 0; ++optindex)
+ {
+ if (memcmp
+ (argv[data->optind] + data->optwhere, longopts[optindex].name,
+ match_chars) == 0)
+ {
+ /* do we have an exact match? */
+ if (match_chars == (int) (strlen (longopts[optindex].name)))
+ {
+ longopt_match = optindex;
+ break;
+ }
+ /* do any characters match? */
+ else
+ {
+ if (longopt_match < 0)
+ longopt_match = optindex;
+ else
+ {
+ /* we have ambiguous options */
+ if (data->opterr)
+ fprintf (stderr, "%s: option `%s' is ambiguous "
+ "(could be `--%s' or `--%s')\n",
+ argv[0],
+ argv[data->optind],
+ longopts[longopt_match].name,
+ longopts[optindex].name);
+ return (data->optopt = '?');
+ }
+ }
+ }
+ }
+ if (longopt_match >= 0)
+ has_arg = longopts[longopt_match].has_arg;
+ }
+
+ /* if we didn't find a long option, is it a short option? */
+ if (longopt_match < 0 && shortopts != 0)
+ {
+ cp = strchr (shortopts, argv[data->optind][data->optwhere]);
+ if (cp == 0)
+ {
+ /* couldn't find option in shortopts */
+ if (data->opterr)
+ fprintf (stderr,
+ "%s: invalid option -- `-%c'\n",
+ argv[0], argv[data->optind][data->optwhere]);
+ data->optwhere++;
+ if (argv[data->optind][data->optwhere] == '\0')
+ {
+ data->optind++;
+ data->optwhere = 1;
+ }
+ return (data->optopt = '?');
+ }
+ has_arg = ((cp[1] == ':')
+ ? ((cp[2] == ':') ? OPTIONAL_ARG : REQUIRED_ARG) : NO_ARG);
+ possible_arg = argv[data->optind] + data->optwhere + 1;
+ data->optopt = *cp;
+ }
+
+ /* get argument and reset data->optwhere */
+ arg_next = 0;
+ switch (has_arg)
+ {
+ case OPTIONAL_ARG:
+ if (*possible_arg == '=')
+ possible_arg++;
+ data->optarg = (*possible_arg != '\0') ? possible_arg : 0;
+ data->optwhere = 1;
+ break;
+ case REQUIRED_ARG:
+ if (*possible_arg == '=')
+ possible_arg++;
+ if (*possible_arg != '\0')
+ {
+ data->optarg = possible_arg;
+ data->optwhere = 1;
+ }
+ else if (data->optind + 1 >= argc)
+ {
+ if (data->opterr)
+ {
+ fprintf (stderr, "%s: argument required for option `", argv[0]);
+ if (longopt_match >= 0)
+ fprintf (stderr, "--%s'\n", longopts[longopt_match].name);
+ else
+ fprintf (stderr, "-%c'\n", *cp);
+ }
+ data->optind++;
+ return (data->optopt = ':');
+ }
+ else
+ {
+ data->optarg = argv[data->optind + 1];
+ arg_next = 1;
+ data->optwhere = 1;
+ }
+ break;
+ default: /* shouldn't happen */
+ case NO_ARG:
+ if (longopt_match < 0)
+ {
+ data->optwhere++;
+ if (argv[data->optind][data->optwhere] == '\0')
+ data->optwhere = 1;
+ }
+ else
+ data->optwhere = 1;
+ data->optarg = 0;
+ break;
+ }
+
+ /* do we have to permute or otherwise modify data->optind? */
+ if (ordering == PERMUTE && data->optwhere == 1 && num_nonopts != 0)
+ {
+ permute (argv + permute_from, num_nonopts, 1 + arg_next);
+ data->optind = permute_from + 1 + arg_next;
+ }
+ else if (data->optwhere == 1)
+ data->optind = data->optind + 1 + arg_next;
+
+ /* finally return */
+ if (longopt_match >= 0)
+ {
+ if (longind != 0)
+ *longind = longopt_match;
+ if (longopts[longopt_match].flag != 0)
+ {
+ *(longopts[longopt_match].flag) = longopts[longopt_match].val;
+ return 0;
+ }
+ else
+ return longopts[longopt_match].val;
+ }
+ else
+ return data->optopt;
+}
+
+int
+getopt (int argc, char *const argv[], const char *optstring)
+{
+ struct getopt_data data;
+ int r;
+
+ read_globals (&data);
+ r = getopt_internal (argc, argv, optstring, 0, 0, 0, &data);
+ write_globals (&data);
+ return r;
+}
+
+int
+getopt_long (int argc, char *const argv[], const char *shortopts,
+ const struct option *longopts, int *longind)
+{
+ struct getopt_data data;
+ int r;
+
+ read_globals (&data);
+ r = getopt_internal (argc, argv, shortopts, longopts, longind, 0, &data);
+ write_globals (&data);
+ return r;
+}
+
+int
+getopt_long_only (int argc, char *const argv[], const char *shortopts,
+ const struct option *longopts, int *longind)
+{
+ struct getopt_data data;
+ int r;
+
+ read_globals (&data);
+ r = getopt_internal (argc, argv, shortopts, longopts, longind, 1, &data);
+ write_globals (&data);
+ return r;
+}
+
+int
+__getopt_r (int argc, char *const argv[], const char *optstring,
+ struct getopt_data *data)
+{
+ return getopt_internal (argc, argv, optstring, 0, 0, 0, data);
+}
+
+int
+__getopt_long_r (int argc, char *const argv[], const char *shortopts,
+ const struct option *longopts, int *longind,
+ struct getopt_data *data)
+{
+ return getopt_internal (argc, argv, shortopts, longopts, longind, 0, data);
+}
+
+int
+__getopt_long_only_r (int argc, char *const argv[], const char *shortopts,
+ const struct option *longopts, int *longind,
+ struct getopt_data *data)
+{
+ return getopt_internal (argc, argv, shortopts, longopts, longind, 1, data);
+}
+
+/* end of file GETOPT.C */
diff --git a/schedsim/shell/shared/include/newlib/_ansi.h b/schedsim/shell/shared/include/newlib/_ansi.h
new file mode 100644
index 0000000..c52ba60
--- /dev/null
+++ b/schedsim/shell/shared/include/newlib/_ansi.h
@@ -0,0 +1,99 @@
+/* Provide support for both ANSI and non-ANSI environments. */
+
+/* Some ANSI environments are "broken" in the sense that __STDC__ cannot be
+ relied upon to have it's intended meaning. Therefore we must use our own
+ concoction: _HAVE_STDC. Always use _HAVE_STDC instead of __STDC__ in newlib
+ sources!
+
+ To get a strict ANSI C environment, define macro __STRICT_ANSI__. This will
+ "comment out" the non-ANSI parts of the ANSI header files (non-ANSI header
+ files aren't affected). */
+
+#ifndef _ANSIDECL_H_
+#define _ANSIDECL_H_
+
+/* #include <newlib.h> */
+/* #include <sys/config.h> */
+
+/* First try to figure out whether we really are in an ANSI C environment. */
+/* FIXME: This probably needs some work. Perhaps sys/config.h can be
+ prevailed upon to give us a clue. */
+
+#ifdef __STDC__
+#define _HAVE_STDC
+#endif
+
+#ifdef _HAVE_STDC
+#define _PTR void *
+#define _AND ,
+#define _NOARGS void
+#define _CONST const
+#define _VOLATILE volatile
+#define _SIGNED signed
+#define _DOTS , ...
+#define _VOID void
+#ifdef __CYGWIN__
+#define _EXFUN(name, proto) __cdecl name proto
+#define _EXPARM(name, proto) (* __cdecl name) proto
+#else
+#define _EXFUN(name, proto) name proto
+#define _EXPARM(name, proto) (* name) proto
+#endif
+#define _DEFUN(name, arglist, args) name(args)
+#define _DEFUN_VOID(name) name(_NOARGS)
+#define _CAST_VOID (void)
+#ifndef _LONG_DOUBLE
+#define _LONG_DOUBLE long double
+#endif
+#ifndef _LONG_LONG
+#define _LONG_LONG long long
+#endif
+#ifndef _PARAMS
+#define _PARAMS(paramlist) paramlist
+#endif
+#else
+#define _PTR char *
+#define _AND ;
+#define _NOARGS
+#define _CONST
+#define _VOLATILE
+#define _SIGNED
+#define _DOTS
+#define _VOID void
+#define _EXFUN(name, proto) name()
+#define _DEFUN(name, arglist, args) name arglist args;
+#define _DEFUN_VOID(name) name()
+#define _CAST_VOID
+#define _LONG_DOUBLE double
+#define _LONG_LONG long
+#ifndef _PARAMS
+#define _PARAMS(paramlist) ()
+#endif
+#endif
+
+/* Support gcc's __attribute__ facility. */
+
+#ifdef __GNUC__
+#define _ATTRIBUTE(attrs) __attribute__ (attrs)
+#else
+#define _ATTRIBUTE(attrs)
+#endif
+
+/* ISO C++. */
+
+#ifdef __cplusplus
+#if !(defined(_BEGIN_STD_C) && defined(_END_STD_C))
+#ifdef _HAVE_STD_CXX
+#define _BEGIN_STD_C namespace std { extern "C" {
+#define _END_STD_C } }
+#else
+#define _BEGIN_STD_C extern "C" {
+#define _END_STD_C }
+#endif
+#endif
+#else
+#define _BEGIN_STD_C
+#define _END_STD_C
+#endif
+
+#endif /* _ANSIDECL_H_ */
diff --git a/schedsim/shell/shared/include/newlib/getopt.h b/schedsim/shell/shared/include/newlib/getopt.h
new file mode 100644
index 0000000..2d397eb
--- /dev/null
+++ b/schedsim/shell/shared/include/newlib/getopt.h
@@ -0,0 +1,167 @@
+/****************************************************************************
+
+getopt.h - Read command line options
+
+AUTHOR: Gregory Pietsch
+CREATED Thu Jan 09 22:37:00 1997
+
+DESCRIPTION:
+
+The getopt() function parses the command line arguments. Its arguments argc
+and argv are the argument count and array as passed to the main() function
+on program invocation. The argument optstring is a list of available option
+characters. If such a character is followed by a colon (`:'), the option
+takes an argument, which is placed in optarg. If such a character is
+followed by two colons, the option takes an optional argument, which is
+placed in optarg. If the option does not take an argument, optarg is NULL.
+
+The external variable optind is the index of the next array element of argv
+to be processed; it communicates from one call to the next which element to
+process.
+
+The getopt_long() function works like getopt() except that it also accepts
+long options started by two dashes `--'. If these take values, it is either
+in the form
+
+--arg=value
+
+ or
+
+--arg value
+
+It takes the additional arguments longopts which is a pointer to the first
+element of an array of type GETOPT_LONG_OPTION_T, defined below. The last
+element of the array has to be filled with NULL for the name field.
+
+The longind pointer points to the index of the current long option relative
+to longopts if it is non-NULL.
+
+The getopt() function returns the option character if the option was found
+successfully, `:' if there was a missing parameter for one of the options,
+`?' for an unknown option character, and EOF for the end of the option list.
+
+The getopt_long() function's return value is described below.
+
+The function getopt_long_only() is identical to getopt_long(), except that a
+plus sign `+' can introduce long options as well as `--'.
+
+Describe how to deal with options that follow non-option ARGV-elements.
+
+If the caller did not specify anything, the default is REQUIRE_ORDER if the
+environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+REQUIRE_ORDER means don't recognize them as options; stop option processing
+when the first non-option is seen. This is what Unix does. This mode of
+operation is selected by either setting the environment variable
+POSIXLY_CORRECT, or using `+' as the first character of the optstring
+parameter.
+
+PERMUTE is the default. We permute the contents of ARGV as we scan, so that
+eventually all the non-options are at the end. This allows options to be
+given in any order, even with programs that were not written to expect this.
+
+RETURN_IN_ORDER is an option available to programs that were written to
+expect options and other ARGV-elements in any order and that care about the
+ordering of the two. We describe each non-option ARGV-element as if it were
+the argument of an option with character code 1. Using `-' as the first
+character of the optstring parameter selects this mode of operation.
+
+The special argument `--' forces an end of option-scanning regardless of the
+value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause
+getopt() and friends to return EOF with optind != argc.
+
+COPYRIGHT NOTICE AND DISCLAIMER:
+
+Copyright (C) 1997 Gregory Pietsch
+
+This file and the accompanying getopt.c implementation file are hereby
+placed in the public domain without restrictions. Just give the author
+credit, don't claim you wrote it or prevent anyone else from using it.
+
+Gregory Pietsch's current e-mail address:
+gpietsch@comcast.net
+****************************************************************************/
+
+/* use _GETOPT_H so we avoid dupe include of glibc getopt.h */
+#ifndef _GETOPT_H
+#define _GETOPT_H
+
+#include <newlib/_ansi.h>
+
+/* include files needed by this include file */
+
+ /* These #defines are to keep the namespace clear... */
+#define getopt_r __getopt_r
+#define getopt_long_r __getopt_long_r
+#define getopt_long_only_r __getopt_long_only_r
+
+#ifdef __cplusplus
+extern "C"
+{
+
+#endif /* __cplusplus */
+
+/* types defined by this include file */
+ struct option
+ {
+ char *name; /* the name of the long option */
+ int has_arg; /* one of the above macros */
+ int *flag; /* determines if getopt_long() returns a
+ * value for a long option; if it is
+ * non-NULL, 0 is returned as a function
+ * value and the value of val is stored in
+ * the area pointed to by flag. Otherwise,
+ * val is returned. */
+ int val; /* determines the value to return if flag is
+ * NULL. */
+
+ };
+
+ /* The getopt_data structure is for reentrancy. Its members are similar to
+ the externally-defined variables. */
+ typedef struct getopt_data
+ {
+ char *optarg;
+ int optind, opterr, optopt, optwhere;
+ } getopt_data;
+
+ /* externally-defined variables */
+ extern char *optarg;
+ extern int optind;
+ extern int opterr;
+ extern int optopt;
+
+ /* function prototypes */
+ int _EXFUN (getopt,
+ (int __argc, char *const __argv[], const char *__optstring));
+
+ int _EXFUN (getopt_long,
+ (int __argc, char *const __argv[], const char *__shortopts,
+ const struct option * __longopts, int *__longind));
+
+ int _EXFUN (getopt_long_only,
+ (int __argc, char *const __argv[], const char *__shortopts,
+ const struct option * __longopts, int *__longind));
+
+ int _EXFUN (__getopt_r,
+ (int __argc, char *const __argv[], const char *__optstring,
+ struct getopt_data * __data));
+
+ int _EXFUN (__getopt_long_r,
+ (int __argc, char *const __argv[], const char *__shortopts,
+ const struct option * __longopts, int *__longind,
+ struct getopt_data * __data));
+
+ int _EXFUN (__getopt_long_only_r,
+ (int __argc, char *const __argv[], const char *__shortopts,
+ const struct option * __longopts, int *__longind,
+ struct getopt_data * __data));
+
+#ifdef __cplusplus
+};
+
+#endif /* __cplusplus */
+
+#endif /* GETOPT_H */
+
+/* END OF FILE getopt.h */
diff --git a/schedsim/shell/shared/include/shell.h b/schedsim/shell/shared/include/shell.h
new file mode 100644
index 0000000..d5209f6
--- /dev/null
+++ b/schedsim/shell/shared/include/shell.h
@@ -0,0 +1,61 @@
+/*
+ * BASED UPON SOURCE IN RTEMS, MODIFIED FOR SIMULATOR
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+
+#ifndef __SHELL_h
+#define __SHELL_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef int (*rtems_shell_command_t)(int argc, char **argv);
+
+struct rtems_shell_cmd_tt;
+typedef struct rtems_shell_cmd_tt rtems_shell_cmd_t;
+
+struct rtems_shell_cmd_tt {
+ const char *name;
+ const char *usage;
+ const char *topic;
+ rtems_shell_command_t command;
+ rtems_shell_cmd_t *alias;
+ rtems_shell_cmd_t *next;
+};
+
+typedef struct {
+ const char *name;
+ const char *alias;
+} rtems_shell_alias_t;
+
+void rtems_shell_initialize_command_set(void);
+
+rtems_shell_cmd_t * rtems_shell_lookup_cmd(const char *cmd);
+
+rtems_shell_cmd_t * rtems_shell_alias_cmd(
+ const char *cmd,
+ const char *alias
+);
+
+int rtems_shell_make_args(
+ char *commandLine,
+ int *argc_p,
+ char **argv_p,
+ int max_args
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/schedsim/shell/shared/lookup_semaphore.c b/schedsim/shell/shared/lookup_semaphore.c
new file mode 100644
index 0000000..70b0887
--- /dev/null
+++ b/schedsim/shell/shared/lookup_semaphore.c
@@ -0,0 +1,15 @@
+/*
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#define METHOD_NAME lookup_semaphore
+#define RTEMS_IDENT_NAME rtems_semaphore_ident
+
+#include "lookup_task.c"
diff --git a/schedsim/shell/shared/lookup_task.c b/schedsim/shell/shared/lookup_task.c
new file mode 100644
index 0000000..0180886
--- /dev/null
+++ b/schedsim/shell/shared/lookup_task.c
@@ -0,0 +1,58 @@
+/*
+ * Given Name or ID String, give Id
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include <rtems/stringto.h>
+
+#ifndef METHOD_NAME
+ #define METHOD_NAME lookup_task
+#endif
+#ifndef RTEMS_IDENT_NAME
+ #define RTEMS_IDENT_NAME rtems_task_ident
+#endif
+
+int METHOD_NAME(
+ const char *string,
+ rtems_id *id
+)
+{
+ char name[5];
+ rtems_status_code status;
+ unsigned long tmp;
+
+ if ( string[0] != '0' ) {
+ memset( name, '\0', sizeof(name) );
+ strncpy( name, string, 4 );
+ status = RTEMS_IDENT_NAME(
+ rtems_build_name( name[0], name[1], name[2], name[3] ),
+ OBJECTS_SEARCH_ALL_NODES,
+ id
+ );
+ if ( status != RTEMS_SUCCESSFUL )
+ return 1;
+ } else {
+ if ( rtems_string_to_unsigned_long( string, &tmp, NULL, 0) ) {
+ fprintf( stderr, "Argument (%s) is not a number\n", string );
+ return 1;
+ }
+ *id = (rtems_id) tmp;
+ }
+
+ return 0;
+}
diff --git a/schedsim/shell/shared/main_clocktick.c b/schedsim/shell/shared/main_clocktick.c
new file mode 100644
index 0000000..ab6918a
--- /dev/null
+++ b/schedsim/shell/shared/main_clocktick.c
@@ -0,0 +1,77 @@
+/*
+ * Task Priority Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_clock_tick(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_status_code status;
+ rtems_interval ticks;
+ unsigned long tmp;
+ rtems_interval t;
+
+ CHECK_RTEMS_IS_UP();
+
+ if (argc != 2) {
+ fprintf( stderr, "%s: Usage ticks\n", argv[0] );
+ return -1;
+ }
+
+ if ( rtems_string_to_unsigned_long( argv[1], &tmp, NULL, 0) ) {
+ fprintf( stderr, "Argument (%s) is not a number\n", argv[2] );
+ return 1;
+ }
+
+ ticks = (rtems_interval) tmp;
+
+ /*
+ * Now delete the task
+ */
+ for ( t=1 ; t<=ticks ; t++ ) {
+ fprintf( stderr, "ClockTick (%d) ...\n", t );
+ status = rtems_clock_tick();
+ if ( status != RTEMS_SUCCESSFUL ) {
+ fprintf(
+ stderr,
+ "Clock Tick (%s) returned %s\n",
+ argv[1],
+ rtems_status_text( status )
+ );
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_CLOCK_TICK_Command = {
+ "clock_tick", /* name */
+ "clock_tick ticks", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_clock_tick, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/schedsim/shell/shared/main_echo.c b/schedsim/shell/shared/main_echo.c
new file mode 100644
index 0000000..f3c9013
--- /dev/null
+++ b/schedsim/shell/shared/main_echo.c
@@ -0,0 +1,140 @@
+/* $NetBSD: echo.c,v 1.12 2005/02/06 04:43:43 perry Exp $ */
+
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Kenneth Almquist.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)echo.c 8.1 (Berkeley) 5/31/93
+ */
+
+/*
+ * Echo command.
+ *
+ * echo is steeped in tradition - several of them!
+ * netbsd has supported 'echo [-n | -e] args' in spite of -e not being
+ * documented anywhere.
+ * Posix requires that -n be supported, output from strings containing
+ * \ is implementation defined
+ * The Single Unix Spec requires that \ escapes be treated as if -e
+ * were set, but that -n not be treated as an option.
+ * (ksh supports 'echo [-eEn] args', but not -- so that it is actually
+ * impossible to actually output '-n')
+ *
+ * It is suggested that 'printf "%b" "string"' be used to get \ sequences
+ * expanded. printf is now a builtin of netbsd's sh and csh.
+ */
+
+/*
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+#include "shell.h"
+
+
+
+int rtems_shell_main_echo(
+ int argc,
+ char *argv[]
+)
+{
+ char **ap;
+ char *p;
+ char c;
+ int count;
+ int nflag = 0;
+ int eflag = 0;
+
+ ap = argv;
+ if (argc)
+ ap++;
+
+ if ((p = *ap) != NULL) {
+ if (!strcmp(p, "-n")) {
+ nflag = 1;
+ ap++;
+ } else if (!strcmp(p, "-e")) {
+ eflag = 1;
+ ap++;
+ }
+ }
+
+ while ((p = *ap++) != NULL) {
+ while ((c = *p++) != '\0') {
+ if (c == '\\' && eflag) {
+ switch (*p++) {
+ case 'a': c = '\a'; break; /* bell */
+ case 'b': c = '\b'; break;
+ case 'c': return 0; /* exit */
+ case 'e': c = 033; break; /* escape */
+ case 'f': c = '\f'; break;
+ case 'n': c = '\n'; break;
+ case 'r': c = '\r'; break;
+ case 't': c = '\t'; break;
+ case 'v': c = '\v'; break;
+ case '\\': break; /* c = '\\' */
+ case '0':
+ c = 0;
+ count = 3;
+ while (--count >= 0 && (unsigned)(*p - '0') < 8)
+ c = (c << 3) + (*p++ - '0');
+ break;
+ default:
+ /* Output the '/' and char following */
+ p--;
+ break;
+ }
+ }
+ putchar(c);
+ }
+ if (*ap)
+ putchar(' ');
+ }
+ if (! nflag)
+ putchar('\n');
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_ECHO_Command = {
+ "echo", /* name */
+ "echo [args]", /* usage */
+ "misc", /* topic */
+ rtems_shell_main_echo, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/schedsim/shell/shared/main_executing.c b/schedsim/shell/shared/main_executing.c
new file mode 100644
index 0000000..31b9402
--- /dev/null
+++ b/schedsim/shell/shared/main_executing.c
@@ -0,0 +1,42 @@
+/*
+ * Thread Executing Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_executing(
+ int argc,
+ char *argv[]
+)
+{
+ PRINT_EXECUTING();
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_TASK_EXECUTING_Command = {
+ "executing", /* name */
+ "executing", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_executing, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/schedsim/shell/shared/main_heir.c b/schedsim/shell/shared/main_heir.c
new file mode 100644
index 0000000..a2a6e19
--- /dev/null
+++ b/schedsim/shell/shared/main_heir.c
@@ -0,0 +1,42 @@
+/*
+ * Thread Heir Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_heir(
+ int argc,
+ char *argv[]
+)
+{
+ PRINT_HEIR();
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_TASK_HEIR_Command = {
+ "heir", /* name */
+ "heir", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_heir, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/schedsim/shell/shared/main_help.c b/schedsim/shell/shared/main_help.c
new file mode 100644
index 0000000..1938b1c
--- /dev/null
+++ b/schedsim/shell/shared/main_help.c
@@ -0,0 +1,150 @@
+/*
+ * Shell Help Command
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <time.h>
+#include <string.h>
+
+#include "shell.h"
+#include <schedsim_shell.h>
+
+/*
+ * show the help for one command.
+ */
+int rtems_shell_help_cmd(
+ rtems_shell_cmd_t *shell_cmd
+)
+{
+ const char * pc;
+ int col,line;
+
+ printf("%-20.20s - ",shell_cmd->name);
+ col = 14;
+ line = 1;
+ if (shell_cmd->alias) {
+ printf("is an <alias> for command '%s'",shell_cmd->alias->name);
+ } else if (shell_cmd->usage) {
+ pc = shell_cmd->usage;
+ while (*pc) {
+ switch(*pc) {
+ case '\r':
+ break;
+ case '\n':
+ putchar('\n');
+ col = 0;
+ break;
+ default:
+ putchar(*pc);
+ col++;
+ break;
+ }
+ pc++;
+ if (col>78) { /* What daring... 78?*/
+ if (*pc) {
+ putchar('\n');
+ col = 0;
+ }
+ }
+ if (!col && *pc) {
+ printf(" ");
+ col = 12;line++;
+ }
+ }
+ }
+ puts("");
+ return line;
+}
+
+/*
+ * show the help. The first command implemented.
+ * Can you see the header of routine? Known?
+ * The same with all the commands....
+ */
+int rtems_shell_help(
+ int argc,
+ char * argv[]
+)
+{
+ int col,line,arg;
+ rtems_shell_topic_t *topic;
+ rtems_shell_cmd_t * shell_cmd = rtems_shell_first_cmd;
+
+ if (argc<2) {
+ printf("help: ('r' repeat last cmd - 'e' edit last cmd)\n"
+ " TOPIC? The topics are\n");
+ topic = rtems_shell_first_topic;
+ col = 0;
+ while (topic) {
+ if (!col){
+ col = printf(" %s",topic->topic);
+ } else {
+ if ((col+strlen(topic->topic)+2)>78){
+ printf("\n");
+ col = printf(" %s",topic->topic);
+ } else {
+ col+= printf(", %s",topic->topic);
+ }
+ }
+ topic = topic->next;
+ }
+ printf("\n");
+ return 1;
+ }
+ line = 0;
+ for (arg = 1;arg<argc;arg++) {
+ if (line>16) {
+ printf("Press any key to continue...");getchar();
+ printf("\n");
+ line = 0;
+ }
+ topic = rtems_shell_lookup_topic(argv[arg]);
+ if (!topic){
+ if ((shell_cmd = rtems_shell_lookup_cmd(argv[arg])) == NULL) {
+ printf("help: topic or cmd '%s' not found. Try <help> alone for a list\n",
+ argv[arg]);
+ line++;
+ } else {
+ line+= rtems_shell_help_cmd(shell_cmd);
+ }
+ continue;
+ }
+ printf("help: list for the topic '%s'\n",argv[arg]);
+ line++;
+ while (shell_cmd) {
+ if (!strcmp(topic->topic,shell_cmd->topic))
+ line+= rtems_shell_help_cmd(shell_cmd);
+ if (line>16) {
+ printf("Press any key to continue...");
+ getchar();
+ printf("\n");
+ line = 0;
+ }
+ shell_cmd = shell_cmd->next;
+ }
+ }
+ puts("");
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_HELP_Command = {
+ "help", /* name */
+ "help [topic] # list of usage of commands", /* usage */
+ "help", /* topic */
+ rtems_shell_help, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/schedsim/shell/shared/main_rtemsinit.c b/schedsim/shell/shared/main_rtemsinit.c
new file mode 100644
index 0000000..906aa26
--- /dev/null
+++ b/schedsim/shell/shared/main_rtemsinit.c
@@ -0,0 +1,43 @@
+/*
+ * Initialize RTEMS Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <schedsim_shell.h>
+
+int rtems_shell_main_rtems_init(
+ int argc,
+ char *argv[]
+)
+{
+ //
+ // Initialize RTEMS
+ //
+ rtems_initialize_data_structures();
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_RTEMS_INIT_Command = {
+ "rtems_init", /* name */
+ "rtems_init", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_rtems_init, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/schedsim/shell/shared/main_semcreate.c b/schedsim/shell/shared/main_semcreate.c
new file mode 100644
index 0000000..ad2c9f8
--- /dev/null
+++ b/schedsim/shell/shared/main_semcreate.c
@@ -0,0 +1,124 @@
+/*
+ * Task Create Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define __need_getopt_newlib
+#include <newlib/getopt.h>
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_semaphore_create(
+ int argc,
+ char *argv[]
+)
+{
+ char name[5];
+ rtems_id id;
+ rtems_status_code status;
+ long tmp;
+ rtems_task_priority ceiling;
+ rtems_attribute attr;
+ struct getopt_data getopt_reent;
+ char option;
+ int value;
+
+ CHECK_RTEMS_IS_UP();
+
+ ceiling = 0;
+ attr = RTEMS_DEFAULT_ATTRIBUTES;
+ value = 0;
+
+ memset(&getopt_reent, 0, sizeof(getopt_data));
+ while ( (option = getopt_r( argc, argv, "bcsfpiC:V:", &getopt_reent)) != -1 ) {
+ switch (option) {
+ case 'b': attr |= RTEMS_BINARY_SEMAPHORE; break;
+ case 'c': attr |= RTEMS_COUNTING_SEMAPHORE; break;
+ case 's': attr |= RTEMS_SIMPLE_BINARY_SEMAPHORE; break;
+
+ case 'f': attr |= RTEMS_FIFO; break;
+ case 'p': attr |= RTEMS_PRIORITY; break;
+
+ case 'i': attr |= RTEMS_INHERIT_PRIORITY; break;
+ case 'C':
+ attr |= RTEMS_PRIORITY_CEILING;
+ if ( rtems_string_to_long(getopt_reent.optarg, &tmp, NULL, 0) ) {
+ printf( "Ceiling argument (%s) is not a number\n", argv[1] );
+ return -1;
+ }
+ ceiling = tmp;
+ break;
+
+ case 'V':
+ if ( rtems_string_to_long(getopt_reent.optarg, &tmp, NULL, 0) ) {
+ printf( "Ceiling argument (%s) is not a number\n", argv[1] );
+ return -1;
+ }
+ value = tmp;
+ break;
+
+ default:
+ fprintf( stderr, "%s: Usage [-bcsfpiC:V:] name\n", argv[0] );
+ return -1;
+ }
+ }
+
+ if ( getopt_reent.optind >= argc ) {
+ fprintf( stderr, "No name specified\n" );
+ return -1;
+ }
+
+ /*
+ * Now create the semaphore
+ */
+ memset( name, '\0', sizeof(name) );
+ strncpy( name, argv[getopt_reent.optind], 4 );
+
+ status = rtems_semaphore_create(
+ rtems_build_name( name[0], name[1], name[2], name[3] ),
+ value,
+ attr,
+ ceiling,
+ &id
+ );
+ if ( status ) {
+ fprintf(
+ stderr,
+ "Semaphore create(%s) returned %s\n",
+ argv[1],
+ rtems_status_text( status )
+ );
+ return -1;
+ }
+
+ printf( "Semaphore (%s) created: id=0x%08x\n", argv[1], id );
+
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_SEMAPHORE_CREATE_Command = {
+ "semaphore_create", /* name */
+ "semaphore_create name priority", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_semaphore_create, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/schedsim/shell/shared/main_semdelete.c b/schedsim/shell/shared/main_semdelete.c
new file mode 100644
index 0000000..a3e93b7
--- /dev/null
+++ b/schedsim/shell/shared/main_semdelete.c
@@ -0,0 +1,70 @@
+/*
+ * Task Delete Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_semaphore_delete(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ CHECK_RTEMS_IS_UP();
+
+ if (argc != 2) {
+ fprintf( stderr, "%s: Usage [name|id]\n", argv[0] );
+ return -1;
+ }
+
+ if ( lookup_semaphore( argv[1], &id ) )
+ return -1;
+
+ /*
+ * Now delete the semaphore
+ */
+ printf("Deleting semaphore (0x%08x)\n", id );
+
+ status = rtems_semaphore_delete( id );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ fprintf(
+ stderr,
+ "Semaphore Delete(%s) returned %s\n",
+ argv[1],
+ rtems_status_text( status )
+ );
+ return -1;
+ }
+
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_SEMAPHORE_DELETE_Command = {
+ "semaphore_delete", /* name */
+ "semaphore_delete name priority", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_semaphore_delete, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/schedsim/shell/shared/main_semflush.c b/schedsim/shell/shared/main_semflush.c
new file mode 100644
index 0000000..17638e8
--- /dev/null
+++ b/schedsim/shell/shared/main_semflush.c
@@ -0,0 +1,69 @@
+/*
+ * Task Delete Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_semaphore_flush(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ CHECK_RTEMS_IS_UP();
+
+ if (argc != 2) {
+ fprintf( stderr, "%s: Usage [name|id]\n", argv[0] );
+ return -1;
+ }
+
+ if ( lookup_semaphore( argv[1], &id ) )
+ return -1;
+
+ /*
+ * Now flush the semaphore
+ */
+ printf("Flushing semaphore (0x%08x)\n", id );
+ status = rtems_semaphore_flush( id );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ fprintf(
+ stderr,
+ "Semaphore flush(%s) returned %s\n",
+ argv[1],
+ rtems_status_text( status )
+ );
+ return -1;
+ }
+
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_SEMAPHORE_FLUSH_Command = {
+ "semaphore_flush", /* name */
+ "semaphore_flush name", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_semaphore_flush, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/schedsim/shell/shared/main_semobtain.c b/schedsim/shell/shared/main_semobtain.c
new file mode 100644
index 0000000..83ac8d3
--- /dev/null
+++ b/schedsim/shell/shared/main_semobtain.c
@@ -0,0 +1,87 @@
+/*
+ * Task Delete Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_semaphore_obtain(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+ long tmp;
+ rtems_interval ticks;
+ Thread_Control *caller;
+
+ /* XXX for now, do not support polling */
+
+ CHECK_RTEMS_IS_UP();
+
+ if (argc != 3) {
+ fprintf( stderr, "%s: Usage name|id timeout\n", argv[0] );
+ return -1;
+ }
+
+ if ( lookup_semaphore( argv[1], &id ) )
+ return -1;
+
+ if ( rtems_string_to_long(argv[2], &tmp, NULL, 0) ) {
+ printf( "Ceiling argument (%s) is not a number\n", argv[1] );
+ return -1;
+ }
+ ticks = tmp;
+
+ /*
+ * Now obtain the semaphore
+ *
+ * If the calling thread blocks, we will return as another thread
+ * but with a "unsatisfied" return code. So we check that we did
+ * a thread switch inside the semaphore obtain. If we did, then
+ * just return successfully.
+ */
+ caller = _Thread_Executing;
+ printf("Obtain semaphore (0x%08x) with timeout %d\n", id, ticks );
+ status = rtems_semaphore_obtain( id, RTEMS_DEFAULT_OPTIONS, ticks );
+ if ( caller == _Thread_Executing ) {
+ if ( status != RTEMS_SUCCESSFUL ) {
+ fprintf(
+ stderr,
+ "Semaphore obtain(%s) returned %s\n",
+ argv[1],
+ rtems_status_text( status )
+ );
+ return -1;
+ }
+ }
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_SEMAPHORE_OBTAIN_Command = {
+ "semaphore_obtain", /* name */
+ "semaphore_obtain name ticks", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_semaphore_obtain, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/schedsim/shell/shared/main_semrelease.c b/schedsim/shell/shared/main_semrelease.c
new file mode 100644
index 0000000..1cfd632
--- /dev/null
+++ b/schedsim/shell/shared/main_semrelease.c
@@ -0,0 +1,69 @@
+/*
+ * Task Delete Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_semaphore_release(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ CHECK_RTEMS_IS_UP();
+
+ if (argc != 2) {
+ fprintf( stderr, "%s: Usage [name|id]\n", argv[0] );
+ return -1;
+ }
+
+ if ( lookup_semaphore( argv[1], &id ) )
+ return -1;
+
+ /*
+ * Now release the semaphore
+ */
+ printf("Releasing semaphore (0x%08x)\n", id );
+ status = rtems_semaphore_release( id );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ fprintf(
+ stderr,
+ "Semaphore release(%s) returned %s\n",
+ argv[1],
+ rtems_status_text( status )
+ );
+ return -1;
+ }
+
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_SEMAPHORE_RELEASE_Command = {
+ "semaphore_release", /* name */
+ "semaphore_release name", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_semaphore_release, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/schedsim/shell/shared/main_taskcreate.c b/schedsim/shell/shared/main_taskcreate.c
new file mode 100644
index 0000000..b4fb505
--- /dev/null
+++ b/schedsim/shell/shared/main_taskcreate.c
@@ -0,0 +1,113 @@
+/*
+ * Task Create Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+rtems_task dummy_task(
+ rtems_task_argument arg
+)
+{
+}
+
+int rtems_shell_main_task_create(
+ int argc,
+ char *argv[]
+)
+{
+ char name[5];
+ rtems_id id;
+ rtems_status_code status;
+ long priority;
+
+ CHECK_RTEMS_IS_UP();
+
+ if (argc != 3) {
+ fprintf( stderr, "%s: Usage name priority\n", argv[0] );
+ return -1;
+ }
+
+ if ( rtems_string_to_long(argv[2], &priority, NULL, 0) ) {
+ printf( "Seconds argument (%s) is not a number\n", argv[1] );
+ return -1;
+ }
+
+ /*
+ * Now create the task
+ */
+ memset( name, '\0', sizeof(name) );
+ strncpy( name, argv[1], 4 );
+
+ status = rtems_task_create(
+ rtems_build_name( name[0], name[1], name[2], name[3] ),
+ (rtems_task_priority) priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ if ( status ) {
+ fprintf(
+ stderr,
+ "Task Create(%s) returned %s\n",
+ argv[1],
+ rtems_status_text( status )
+ );
+ return -1;
+ }
+
+ printf(
+ "Task (%s) created: id=0x%08x, priority=%ld\n",
+ argv[1],
+ id,
+ priority
+ );
+
+ printf(
+ "Task (%s) starting: id=0x%08x, priority=%ld\n",
+ argv[1],
+ id,
+ priority
+ );
+
+ status = rtems_task_start( id, dummy_task, 1 );
+ if ( status ) {
+ fprintf(
+ stderr,
+ "Task Start(%s) returned %s\n",
+ argv[1],
+ rtems_status_text( status )
+ );
+ return -1;
+ }
+
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_TASK_CREATE_Command = {
+ "task_create", /* name */
+ "task_create name priority", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_task_create, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/schedsim/shell/shared/main_taskdelete.c b/schedsim/shell/shared/main_taskdelete.c
new file mode 100644
index 0000000..8ba68cc
--- /dev/null
+++ b/schedsim/shell/shared/main_taskdelete.c
@@ -0,0 +1,70 @@
+/*
+ * Task Delete Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_task_delete(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ CHECK_RTEMS_IS_UP();
+
+ if (argc != 2) {
+ fprintf( stderr, "%s: Usage [name|id]\n", argv[0] );
+ return -1;
+ }
+
+ if ( lookup_task( argv[1], &id ) )
+ return -1;
+
+ /*
+ * Now delete the task
+ */
+ status = rtems_task_delete( id );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ fprintf(
+ stderr,
+ "Task Delete(%s) returned %s\n",
+ argv[1],
+ rtems_status_text( status )
+ );
+ return -1;
+ }
+
+ printf("Task (0x%08x) deleted\n", id );
+
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_TASK_DELETE_Command = {
+ "task_delete", /* name */
+ "task_delete name priority", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_task_delete, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/schedsim/shell/shared/main_taskmode.c b/schedsim/shell/shared/main_taskmode.c
new file mode 100644
index 0000000..7b9c263
--- /dev/null
+++ b/schedsim/shell/shared/main_taskmode.c
@@ -0,0 +1,113 @@
+/*
+ * Task Delete Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define __need_getopt_newlib
+#include <newlib/getopt.h>
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+void print_mode(
+ const char *prefix,
+ rtems_mode mode
+)
+{
+ fprintf(
+ stderr,
+ "%sPreemption: %s Timeslicing: %s\n",
+ prefix,
+ ((mode & RTEMS_NO_PREEMPT) ? "no" : "yes"),
+ ((mode & RTEMS_TIMESLICE) ? "yes" : "no")
+ );
+}
+
+int rtems_shell_main_task_mode(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_status_code status;
+ rtems_mode mode;
+ rtems_mode mask;
+ rtems_mode old;
+ struct getopt_data getopt_reent;
+ char option;
+
+ CHECK_RTEMS_IS_UP();
+
+ mode = 0;
+ mask = 0;
+ memset(&getopt_reent, 0, sizeof(getopt_data));
+ while ( (option = getopt_r( argc, argv, "tTpP", &getopt_reent)) != -1 ) {
+ switch (option) {
+ case 't':
+ mask |= RTEMS_TIMESLICE_MASK;
+ mode = (mode & ~RTEMS_TIMESLICE_MASK) | RTEMS_NO_TIMESLICE;
+ break;
+ case 'T':
+ mask |= RTEMS_TIMESLICE_MASK;
+ mode = (mode & ~RTEMS_TIMESLICE_MASK) | RTEMS_TIMESLICE;
+ break;
+ case 'p':
+ mask |= RTEMS_PREEMPT_MASK;
+ mode = (mode & ~RTEMS_PREEMPT_MASK) | RTEMS_NO_PREEMPT;
+ break;
+ case 'P':
+ mask |= RTEMS_PREEMPT_MASK;
+ mode = (mode & ~RTEMS_PREEMPT_MASK) | RTEMS_PREEMPT;
+ break;
+ default:
+ fprintf( stderr, "%s: Usage [-tTpP]\n", argv[0] );
+ return -1;
+ }
+ }
+
+ /*
+ * Now change the task mode
+ */
+ status = rtems_task_mode( mode, mask, &old );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ fprintf(
+ stderr,
+ "Task Mode returned %s\n",
+ rtems_status_text( status )
+ );
+ return -1;
+ }
+
+ print_mode( "Previous Mode: ", old );
+ if ( mask ) {
+ (void) rtems_task_mode( RTEMS_CURRENT_MODE , RTEMS_CURRENT_MODE, &old );
+ print_mode( "Current Mode: ", mode );
+ }
+
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_TASK_MODE_Command = {
+ "task_mode", /* name */
+ "task_mode [-tTpP]", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_task_mode, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/schedsim/shell/shared/main_taskpriority.c b/schedsim/shell/shared/main_taskpriority.c
new file mode 100644
index 0000000..fd48124
--- /dev/null
+++ b/schedsim/shell/shared/main_taskpriority.c
@@ -0,0 +1,83 @@
+/*
+ * Task Delete Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_task_priority(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+ unsigned long tmp;
+ rtems_task_priority old;
+ rtems_task_priority new;
+
+ CHECK_RTEMS_IS_UP();
+
+ if (argc != 3) {
+ fprintf( stderr, "%s: Usage [name|id] priority\n", argv[0] );
+ return -1;
+ }
+
+ if ( lookup_task( argv[1], &id ) )
+ return -1;
+
+ if ( rtems_string_to_unsigned_long( argv[2], &tmp, NULL, 0) ) {
+ fprintf( stderr, "Argument (%s) is not a number\n", argv[2] );
+ return 1;
+ }
+
+ new = (rtems_task_priority) tmp;
+
+ /*
+ * Now priority the task
+ */
+ status = rtems_task_set_priority( id, new, &old );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ fprintf(
+ stderr,
+ "Task Set Priority(%s) returned %s\n",
+ argv[1],
+ rtems_status_text( status )
+ );
+ return -1;
+ }
+
+ if ( new != 0 )
+ printf("Task (0x%08x) Change Priority from %d to %d\n", id, old, new );
+ else
+ printf("Task (0x%08x) Current Priority is %d\n", id, new );
+
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_TASK_PRIORITY_Command = {
+ "task_priority", /* name */
+ "task_priority name priority", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_task_priority, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/schedsim/shell/shared/main_taskresume.c b/schedsim/shell/shared/main_taskresume.c
new file mode 100644
index 0000000..a155896
--- /dev/null
+++ b/schedsim/shell/shared/main_taskresume.c
@@ -0,0 +1,70 @@
+/*
+ * Task Delete Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_task_resume(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ CHECK_RTEMS_IS_UP();
+
+ if (argc != 2) {
+ fprintf( stderr, "%s: Usage [name|id]\n", argv[0] );
+ return -1;
+ }
+
+ if ( lookup_task( argv[1], &id ) )
+ return -1;
+
+ /*
+ * Now resume the task
+ */
+ printf("Resuming task (0x%08x)\n", id );
+
+ status = rtems_task_resume( id );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ fprintf(
+ stderr,
+ "Task resume(%s) returned %s\n",
+ argv[1],
+ rtems_status_text( status )
+ );
+ return -1;
+ }
+
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_TASK_RESUME_Command = {
+ "task_resume", /* name */
+ "task_resume name priority", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_task_resume, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/schedsim/shell/shared/main_tasksuspend.c b/schedsim/shell/shared/main_tasksuspend.c
new file mode 100644
index 0000000..1649639
--- /dev/null
+++ b/schedsim/shell/shared/main_tasksuspend.c
@@ -0,0 +1,69 @@
+/*
+ * Task Delete Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_task_suspend(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ CHECK_RTEMS_IS_UP();
+
+ if (argc != 2) {
+ fprintf( stderr, "%s: Usage [name|id]\n", argv[0] );
+ return -1;
+ }
+
+ if ( lookup_task( argv[1], &id ) )
+ return -1;
+
+ /*
+ * Now suspend the task
+ */
+ printf("Suspending task (0x%08x)\n", id );
+ status = rtems_task_suspend( id );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ fprintf(
+ stderr,
+ "Task suspend(%s) returned %s\n",
+ argv[1],
+ rtems_status_text( status )
+ );
+ return -1;
+ }
+
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_TASK_SUSPEND_Command = {
+ "task_suspend", /* name */
+ "task_suspend name priority", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_task_suspend, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/schedsim/shell/shared/main_taskwakeafter.c b/schedsim/shell/shared/main_taskwakeafter.c
new file mode 100644
index 0000000..9ed343c
--- /dev/null
+++ b/schedsim/shell/shared/main_taskwakeafter.c
@@ -0,0 +1,77 @@
+/*
+ * Task Priority Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_task_wake_after(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_status_code status;
+ rtems_interval ticks;
+ unsigned long tmp;
+ rtems_id self;
+
+ CHECK_RTEMS_IS_UP();
+
+ if (argc != 2) {
+ fprintf( stderr, "%s: Usage ticks\n", argv[0] );
+ return -1;
+ }
+
+ if ( rtems_string_to_unsigned_long( argv[1], &tmp, NULL, 0) ) {
+ fprintf( stderr, "Argument (%s) is not a number\n", argv[2] );
+ return 1;
+ }
+
+ ticks = (rtems_interval) tmp;
+ self = _Thread_Executing->Object.id,
+
+ /*
+ * Now sleep
+ */
+ printf( "Task (0x%08x) sleeping for %d ticks\n", self, ticks );
+
+ status = rtems_task_wake_after( ticks );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ fprintf(
+ stderr,
+ "Task Wake After (%s) returned %s\n",
+ argv[1],
+ rtems_status_text( status )
+ );
+ return -1;
+ }
+
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_TASK_WAKE_AFTER_Command = {
+ "task_wake_after", /* name */
+ "task_wake_after ticks", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_task_wake_after, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/schedsim/shell/shared/schedsim_shell.h b/schedsim/shell/shared/schedsim_shell.h
new file mode 100644
index 0000000..f9fc0b1
--- /dev/null
+++ b/schedsim/shell/shared/schedsim_shell.h
@@ -0,0 +1,64 @@
+/*
+ * BASED UPON SOURCE IN RTEMS, MODIFIED FOR SIMULATOR
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifndef __SCHEDSIM_SHELL_h
+#define __SCHEDSIM_SHELL_h
+
+#include <rtems.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CHECK_RTEMS_IS_UP() \
+ do { \
+ if ( _System_state_Current != SYSTEM_STATE_UP ) { \
+ fprintf( stderr, "RTEMS is not initialized yet\n" ); \
+ return -1; \
+ } \
+ } while (0)
+
+void PRINT_EXECUTING(void);
+void PRINT_HEIR(void);
+
+struct rtems_shell_topic_tt;
+typedef struct rtems_shell_topic_tt rtems_shell_topic_t;
+
+struct rtems_shell_topic_tt {
+ const char *topic;
+ rtems_shell_topic_t *next;
+};
+
+extern rtems_shell_cmd_t * rtems_shell_first_cmd;
+extern rtems_shell_topic_t * rtems_shell_first_topic;
+
+rtems_shell_topic_t * rtems_shell_lookup_topic(const char *topic);
+
+extern rtems_shell_cmd_t *rtems_shell_Initial_commands[];
+extern rtems_shell_alias_t *rtems_shell_Initial_aliases[];
+
+int lookup_task(
+ const char *string,
+ rtems_id *id
+);
+
+int lookup_semaphore(
+ const char *string,
+ rtems_id *id
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/schedsim/shell/shared/shell_cmdset.c b/schedsim/shell/shared/shell_cmdset.c
new file mode 100644
index 0000000..83330b0
--- /dev/null
+++ b/schedsim/shell/shared/shell_cmdset.c
@@ -0,0 +1,229 @@
+/*
+ * Shell Command Set Management
+ *
+ * Author:
+ * WORK: fernando.ruiz@ctv.es
+ * HOME: correo@fernando-ruiz.com
+ *
+ * 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.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <time.h>
+#include <termios.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <errno.h>
+
+
+#include "shell.h"
+#include <schedsim_shell.h>
+
+/*
+ * Common linked list of shell commands.
+ *
+ * Because the help report is very long, there is a topic for each command.
+ *
+ * Help list the topics
+ * help [topic] list the commands for the topic
+ * help [command] help for the command
+ *
+ */
+
+rtems_shell_cmd_t * rtems_shell_first_cmd;
+rtems_shell_topic_t * rtems_shell_first_topic;
+
+/*
+ * Find the topic from the set of topics registered.
+ */
+rtems_shell_topic_t * rtems_shell_lookup_topic(const char * topic) {
+ rtems_shell_topic_t * shell_topic;
+ shell_topic=rtems_shell_first_topic;
+
+ while (shell_topic) {
+ if (!strcmp(shell_topic->topic,topic))
+ return shell_topic;
+ shell_topic=shell_topic->next;
+ }
+ return (rtems_shell_topic_t *) NULL;
+}
+
+/*
+ * Add a new topic to the list of topics
+ */
+rtems_shell_topic_t * rtems_shell_add_topic(const char * topic) {
+ rtems_shell_topic_t * current,*aux;
+
+ if (!rtems_shell_first_topic) {
+ aux = malloc(sizeof(rtems_shell_topic_t));
+ aux->topic = topic;
+ aux->next = (rtems_shell_topic_t*)NULL;
+ return rtems_shell_first_topic = aux;
+ }
+ current=rtems_shell_first_topic;
+ if (!strcmp(topic,current->topic))
+ return current;
+
+ while (current->next) {
+ if (!strcmp(topic,current->next->topic))
+ return current->next;
+ current=current->next;
+ }
+ aux = malloc(sizeof(rtems_shell_topic_t));
+ aux->topic = topic;
+ aux->next = (rtems_shell_topic_t*)NULL;
+ current->next = aux;
+ return aux;
+}
+
+/*
+ * Find the command in the set
+ */
+rtems_shell_cmd_t * rtems_shell_lookup_cmd(const char * cmd) {
+ rtems_shell_cmd_t * shell_cmd;
+ shell_cmd=rtems_shell_first_cmd;
+ while (shell_cmd) {
+ if (!strcmp(shell_cmd->name,cmd)) return shell_cmd;
+ shell_cmd=shell_cmd->next;
+ };
+ return (rtems_shell_cmd_t *) NULL;
+}
+
+/*
+ * Add a command structure to the set of known commands
+ */
+rtems_shell_cmd_t *rtems_shell_add_cmd_struct(
+ rtems_shell_cmd_t *shell_cmd
+)
+{
+ rtems_shell_cmd_t *shell_pvt;
+
+ shell_pvt = rtems_shell_first_cmd;
+ while (shell_pvt) {
+ if (strcmp(shell_pvt->name, shell_cmd->name) == 0)
+ return NULL;
+ shell_pvt = shell_pvt->next;
+ }
+
+ if ( !rtems_shell_first_cmd ) {
+ rtems_shell_first_cmd = shell_cmd;
+ } else {
+ shell_pvt = rtems_shell_first_cmd;
+ while (shell_pvt->next)
+ shell_pvt = shell_pvt->next;
+ shell_pvt->next = shell_cmd;
+ }
+ rtems_shell_add_topic( shell_cmd->topic );
+ return shell_cmd;
+}
+
+/*
+ * Add a command as a set of arguments to the set and
+ * allocate the command structure on the fly.
+ */
+rtems_shell_cmd_t * rtems_shell_add_cmd(
+ const char *name,
+ const char *topic,
+ const char *usage,
+ rtems_shell_command_t command
+)
+{
+ rtems_shell_cmd_t *shell_cmd = NULL;
+ char *my_name = NULL;
+ char *my_topic = NULL;
+ char *my_usage = NULL;
+
+ /* Reject empty commands */
+ if (name == NULL || command == NULL) {
+ return NULL;
+ }
+
+ /* Allocate command stucture */
+ shell_cmd = (rtems_shell_cmd_t *) malloc(sizeof(rtems_shell_cmd_t));
+ if (shell_cmd == NULL) {
+ return NULL;
+ }
+
+ /* Allocate strings */
+ my_name = strdup(name);
+ my_topic = strdup(topic);
+ my_usage = strdup(usage);
+
+ /* Assign values */
+ shell_cmd->name = my_name;
+ shell_cmd->topic = my_topic;
+ shell_cmd->usage = my_usage;
+ shell_cmd->command = command;
+ shell_cmd->alias = NULL;
+ shell_cmd->next = NULL;
+
+ if (rtems_shell_add_cmd_struct(shell_cmd) == NULL) {
+ /* Something is wrong, free allocated resources */
+ free(my_usage);
+ free(my_topic);
+ free(my_name);
+ free(shell_cmd);
+
+ return NULL;
+ }
+
+ return shell_cmd;
+}
+
+
+void rtems_shell_initialize_command_set(void)
+{
+ rtems_shell_cmd_t **c;
+ rtems_shell_alias_t **a;
+
+ for ( c = rtems_shell_Initial_commands ; *c ; c++ ) {
+ rtems_shell_add_cmd_struct( *c );
+ }
+
+ for ( a = rtems_shell_Initial_aliases ; *a ; a++ ) {
+ rtems_shell_alias_cmd( (*a)->name, (*a)->alias );
+ }
+}
+
+/* ----------------------------------------------- *
+ * you can make an alias for every command.
+ * ----------------------------------------------- */
+rtems_shell_cmd_t *rtems_shell_alias_cmd(
+ const char *cmd,
+ const char *alias
+)
+{
+ rtems_shell_cmd_t *shell_cmd, *shell_aux;
+
+ shell_aux = (rtems_shell_cmd_t *) NULL;
+
+ if (alias) {
+ shell_aux = rtems_shell_lookup_cmd(alias);
+ if (shell_aux != NULL) {
+ return NULL;
+ }
+ shell_cmd = rtems_shell_lookup_cmd(cmd);
+ if (shell_cmd != NULL) {
+ shell_aux = rtems_shell_add_cmd(
+ alias,
+ shell_cmd->topic,
+ shell_cmd->usage,
+ shell_cmd->command
+ );
+ if (shell_aux)
+ shell_aux->alias = shell_cmd;
+ }
+ }
+ return shell_aux;
+}
diff --git a/schedsim/shell/shared/shell_makeargs.c b/schedsim/shell/shared/shell_makeargs.c
new file mode 100644
index 0000000..e959138
--- /dev/null
+++ b/schedsim/shell/shared/shell_makeargs.c
@@ -0,0 +1,68 @@
+/*
+ * Split string into argc/argv style argument list
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * 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.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <ctype.h>
+
+int rtems_shell_make_args(
+ char *commandLine,
+ int *argc_p,
+ char **argv_p,
+ int max_args
+)
+{
+ int argc;
+ char *ch;
+ int status = 0;
+
+ argc = 0;
+ ch = commandLine;
+
+ while ( *ch ) {
+
+ while ( isspace((unsigned char)*ch) ) ch++;
+
+ if ( *ch == '\0' )
+ break;
+
+ if ( *ch == '"' ) {
+ argv_p[ argc ] = ++ch;
+ while ( ( *ch != '\0' ) && ( *ch != '"' ) ) ch++;
+ } else {
+ argv_p[ argc ] = ch;
+ while ( ( *ch != '\0' ) && ( !isspace((unsigned char)*ch) ) ) ch++;
+ }
+
+ argc++;
+
+ if ( *ch == '\0' )
+ break;
+
+ *ch++ = '\0';
+
+ if ( argc == (max_args-1) ) {
+ status = -1;
+ break;
+ }
+
+
+ }
+ argv_p[ argc ] = NULL;
+ *argc_p = argc;
+ return status;
+}
+