From abb18dc4eb102a15a67990ad1b0c515176808a5b Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Mon, 25 Apr 2011 15:53:10 +0000 Subject: Initial import. --- .configure.swp | Bin 0 -> 16384 bytes LICENSE | 23 + Makefile.am | 41 + SUPPORT | 22 + VERSION | 0 acinclude.m4 | 399 ++++++ aclocal/bsp-alias.m4 | 22 + aclocal/canonical-target-name.m4 | 25 + aclocal/check-bsps.m4 | 27 + aclocal/check-custom-bsp.m4 | 19 + aclocal/enable-cxx.m4 | 13 + aclocal/enable-multiprocessing.m4 | 13 + aclocal/enable-networking.m4 | 15 + aclocal/enable-posix.m4 | 23 + aclocal/enable-rtems-debug.m4 | 12 + aclocal/enable-rtemsbsp.m4 | 17 + aclocal/enable-rtemsdir.m4 | 16 + aclocal/enable-smp.m4 | 18 + aclocal/enable-tests.m4 | 13 + aclocal/multilib.m4 | 17 + aclocal/path-ksh.m4 | 14 + aclocal/project-root.m4 | 25 + aclocal/quoting.m4 | 41 + aclocal/rpm.m4 | 20 + aclocal/rtems-top.m4 | 36 + aclocal/tool-paths.m4 | 23 + aclocal/version.m4 | 4 + automake/host.am | 10 + automake/local.am | 7 + automake/subdirs.am | 32 + configure.ac | 57 + schedsim/.cvsignore | 16 + schedsim/ChangeLog | 21 + schedsim/Makefile.am | 12 + schedsim/README | 100 ++ schedsim/configure.ac | 48 + schedsim/rtems/.cvsignore | 2 + schedsim/rtems/ChangeLog | 29 + schedsim/rtems/Makefile.am | 395 ++++++ schedsim/rtems/interr.c | 71 ++ schedsim/rtems/rtems_init.c | 110 ++ schedsim/rtems/rtems_sched.h | 27 + schedsim/rtems/sched_cpu/cpu.c | 169 +++ schedsim/rtems/sched_cpu/cpu_asm.c | 188 +++ schedsim/rtems/sched_cpu/rtems/asm.h | 127 ++ schedsim/rtems/sched_cpu/rtems/score/cpu.h | 1264 ++++++++++++++++++++ schedsim/rtems/sched_cpu/rtems/score/cpu_asm.h | 74 ++ schedsim/rtems/sched_cpu/rtems/score/cpuopts.h | 72 ++ schedsim/rtems/sched_cpu/rtems/score/no_cpu.h | 59 + schedsim/rtems/sched_cpu/rtems/score/types.h | 51 + schedsim/rtems/sched_cpu/rtems/stringto.h | 1 + schedsim/rtems/wkspace.c | 100 ++ schedsim/shell/.cvsignore | 2 + schedsim/shell/ChangeLog | 37 + schedsim/shell/Makefile.am | 12 + schedsim/shell/schedsim_priority/.cvsignore | 2 + schedsim/shell/schedsim_priority/Makefile.am | 32 + schedsim/shell/schedsim_priority/config.c | 7 + .../shell/schedsim_priority/printheir_executing.c | 31 + .../shell/schedsim_priority/scenarios/script01 | 11 + .../shell/schedsim_priority/scenarios/script02 | 9 + .../shell/schedsim_priority/scenarios/script03 | 19 + .../shell/schedsim_priority/scenarios/script04 | 10 + .../shell/schedsim_priority/scenarios/script05 | 22 + .../shell/schedsim_priority/scenarios/script06 | 14 + schedsim/shell/schedsim_priority/schedsim.cc | 169 +++ .../shell/schedsim_priority/wrap_thread_dispatch.c | 42 + schedsim/shell/shared/.cvsignore | 2 + schedsim/shell/shared/Makefile.am | 61 + schedsim/shell/shared/commands.c | 73 ++ schedsim/shell/shared/getopt.c | 477 ++++++++ schedsim/shell/shared/include/newlib/_ansi.h | 99 ++ schedsim/shell/shared/include/newlib/getopt.h | 167 +++ schedsim/shell/shared/include/shell.h | 61 + schedsim/shell/shared/lookup_semaphore.c | 15 + schedsim/shell/shared/lookup_task.c | 58 + schedsim/shell/shared/main_clocktick.c | 77 ++ schedsim/shell/shared/main_echo.c | 140 +++ schedsim/shell/shared/main_executing.c | 42 + schedsim/shell/shared/main_heir.c | 42 + schedsim/shell/shared/main_help.c | 150 +++ schedsim/shell/shared/main_rtemsinit.c | 43 + schedsim/shell/shared/main_semcreate.c | 124 ++ schedsim/shell/shared/main_semdelete.c | 70 ++ schedsim/shell/shared/main_semflush.c | 69 ++ schedsim/shell/shared/main_semobtain.c | 87 ++ schedsim/shell/shared/main_semrelease.c | 69 ++ schedsim/shell/shared/main_taskcreate.c | 113 ++ schedsim/shell/shared/main_taskdelete.c | 70 ++ schedsim/shell/shared/main_taskmode.c | 113 ++ schedsim/shell/shared/main_taskpriority.c | 83 ++ schedsim/shell/shared/main_taskresume.c | 70 ++ schedsim/shell/shared/main_tasksuspend.c | 69 ++ schedsim/shell/shared/main_taskwakeafter.c | 77 ++ schedsim/shell/shared/schedsim_shell.h | 64 + schedsim/shell/shared/shell_cmdset.c | 229 ++++ schedsim/shell/shared/shell_makeargs.c | 68 ++ 97 files changed, 7241 insertions(+) create mode 100644 .configure.swp create mode 100644 LICENSE create mode 100644 Makefile.am create mode 100644 SUPPORT create mode 100644 VERSION create mode 100644 acinclude.m4 create mode 100644 aclocal/bsp-alias.m4 create mode 100644 aclocal/canonical-target-name.m4 create mode 100644 aclocal/check-bsps.m4 create mode 100644 aclocal/check-custom-bsp.m4 create mode 100644 aclocal/enable-cxx.m4 create mode 100644 aclocal/enable-multiprocessing.m4 create mode 100644 aclocal/enable-networking.m4 create mode 100644 aclocal/enable-posix.m4 create mode 100644 aclocal/enable-rtems-debug.m4 create mode 100644 aclocal/enable-rtemsbsp.m4 create mode 100644 aclocal/enable-rtemsdir.m4 create mode 100644 aclocal/enable-smp.m4 create mode 100644 aclocal/enable-tests.m4 create mode 100644 aclocal/multilib.m4 create mode 100644 aclocal/path-ksh.m4 create mode 100644 aclocal/project-root.m4 create mode 100644 aclocal/quoting.m4 create mode 100644 aclocal/rpm.m4 create mode 100644 aclocal/rtems-top.m4 create mode 100644 aclocal/tool-paths.m4 create mode 100644 aclocal/version.m4 create mode 100644 automake/host.am create mode 100644 automake/local.am create mode 100644 automake/subdirs.am create mode 100644 configure.ac create mode 100644 schedsim/.cvsignore create mode 100644 schedsim/ChangeLog create mode 100644 schedsim/Makefile.am create mode 100644 schedsim/README create mode 100644 schedsim/configure.ac create mode 100644 schedsim/rtems/.cvsignore create mode 100644 schedsim/rtems/ChangeLog create mode 100644 schedsim/rtems/Makefile.am create mode 100644 schedsim/rtems/interr.c create mode 100644 schedsim/rtems/rtems_init.c create mode 100644 schedsim/rtems/rtems_sched.h create mode 100644 schedsim/rtems/sched_cpu/cpu.c create mode 100644 schedsim/rtems/sched_cpu/cpu_asm.c create mode 100644 schedsim/rtems/sched_cpu/rtems/asm.h create mode 100644 schedsim/rtems/sched_cpu/rtems/score/cpu.h create mode 100644 schedsim/rtems/sched_cpu/rtems/score/cpu_asm.h create mode 100644 schedsim/rtems/sched_cpu/rtems/score/cpuopts.h create mode 100644 schedsim/rtems/sched_cpu/rtems/score/no_cpu.h create mode 100644 schedsim/rtems/sched_cpu/rtems/score/types.h create mode 100644 schedsim/rtems/sched_cpu/rtems/stringto.h create mode 100644 schedsim/rtems/wkspace.c create mode 100644 schedsim/shell/.cvsignore create mode 100644 schedsim/shell/ChangeLog create mode 100644 schedsim/shell/Makefile.am create mode 100644 schedsim/shell/schedsim_priority/.cvsignore create mode 100644 schedsim/shell/schedsim_priority/Makefile.am create mode 100644 schedsim/shell/schedsim_priority/config.c create mode 100644 schedsim/shell/schedsim_priority/printheir_executing.c create mode 100644 schedsim/shell/schedsim_priority/scenarios/script01 create mode 100644 schedsim/shell/schedsim_priority/scenarios/script02 create mode 100644 schedsim/shell/schedsim_priority/scenarios/script03 create mode 100644 schedsim/shell/schedsim_priority/scenarios/script04 create mode 100644 schedsim/shell/schedsim_priority/scenarios/script05 create mode 100644 schedsim/shell/schedsim_priority/scenarios/script06 create mode 100644 schedsim/shell/schedsim_priority/schedsim.cc create mode 100644 schedsim/shell/schedsim_priority/wrap_thread_dispatch.c create mode 100644 schedsim/shell/shared/.cvsignore create mode 100644 schedsim/shell/shared/Makefile.am create mode 100644 schedsim/shell/shared/commands.c create mode 100644 schedsim/shell/shared/getopt.c create mode 100644 schedsim/shell/shared/include/newlib/_ansi.h create mode 100644 schedsim/shell/shared/include/newlib/getopt.h create mode 100644 schedsim/shell/shared/include/shell.h create mode 100644 schedsim/shell/shared/lookup_semaphore.c create mode 100644 schedsim/shell/shared/lookup_task.c create mode 100644 schedsim/shell/shared/main_clocktick.c create mode 100644 schedsim/shell/shared/main_echo.c create mode 100644 schedsim/shell/shared/main_executing.c create mode 100644 schedsim/shell/shared/main_heir.c create mode 100644 schedsim/shell/shared/main_help.c create mode 100644 schedsim/shell/shared/main_rtemsinit.c create mode 100644 schedsim/shell/shared/main_semcreate.c create mode 100644 schedsim/shell/shared/main_semdelete.c create mode 100644 schedsim/shell/shared/main_semflush.c create mode 100644 schedsim/shell/shared/main_semobtain.c create mode 100644 schedsim/shell/shared/main_semrelease.c create mode 100644 schedsim/shell/shared/main_taskcreate.c create mode 100644 schedsim/shell/shared/main_taskdelete.c create mode 100644 schedsim/shell/shared/main_taskmode.c create mode 100644 schedsim/shell/shared/main_taskpriority.c create mode 100644 schedsim/shell/shared/main_taskresume.c create mode 100644 schedsim/shell/shared/main_tasksuspend.c create mode 100644 schedsim/shell/shared/main_taskwakeafter.c create mode 100644 schedsim/shell/shared/schedsim_shell.h create mode 100644 schedsim/shell/shared/shell_cmdset.c create mode 100644 schedsim/shell/shared/shell_makeargs.c diff --git a/.configure.swp b/.configure.swp new file mode 100644 index 0000000..c15b5d8 Binary files /dev/null and b/.configure.swp 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 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= 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 + + * README: New file. + +2011-02-02 Ralf Corsépius + + * configure.ac: Require autoconf-2.68, automake-1.11.1. + +2011-01-28 Ralf Corsépius + + * 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 + Jennifer Averett + + 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 + + * 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 + + * 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 + + * 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 + + * Makefile.am: Add schedulersimple.h + +2011-04-07 Joel Sherrill + + * Makefile.am, wkspace.c: Compiles now and do not core dump when RTEMS + is not initialized. + +2011-02-28 Joel Sherrill + + * sched_cpu/rtems/score/cpuopts.h: Bump to 4.10.99.0 + +2010-12-17 Joel Sherrill + + * .cvsignore: New file. + +2010-12-17 Joel Sherrill + Jennifer Averett + + 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 +#include +#include +#include + +#include +#include + +/*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 +#include +#include +#include +#include + +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 +#include +#include + +/* _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 +#include +/* #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 +#include + +#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 + +/** 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 /* pick up machine definitions */ +#ifndef ASM +#include +#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 + +/* + * 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 + +#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 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 +#include +#include + +#include + +#if defined(DEBUG_WORKSPACE) + #include +#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 + + * 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 + Jennifer Averett + + 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 + +#define CONFIGURE_INIT +#define CONFIGURE_MAXIMUM_TASKS 1000 +#define CONFIGURE_MAXIMUM_SEMAPHORES 1000 +#include + 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 +#include + +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 +#include +#include +#include +#include + +#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 + +#include +#include + +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 + +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 +#include +#include +#include + +/* 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 */ +/* #include */ + +/* 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 + +/* 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 + +#include +#include + +#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 + +#include +#include "shell.h" +#include +#include +#include + +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 +#include +#include +#include + +#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 + +#include +#include "shell.h" +#include +#include +#include + +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 + +#include +#include "shell.h" +#include +#include +#include + +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 +#include +#include + +#include "shell.h" +#include + +/* + * 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 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;arg16) { + 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 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 + +#include +#include "shell.h" +#include + +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 + +#include + +#include +#include "shell.h" +#include +#include +#include + +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 + +#include +#include "shell.h" +#include +#include +#include + +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 + +#include +#include "shell.h" +#include +#include +#include + +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 + +#include +#include "shell.h" +#include +#include +#include + +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 + +#include +#include "shell.h" +#include +#include +#include + +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 + +#include +#include "shell.h" +#include +#include +#include + +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 + +#include +#include "shell.h" +#include +#include +#include + +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 + +#include + +#include +#include "shell.h" +#include +#include +#include + +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 + +#include +#include "shell.h" +#include +#include +#include + +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 + +#include +#include "shell.h" +#include +#include +#include + +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 + +#include +#include "shell.h" +#include +#include +#include + +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 + +#include +#include "shell.h" +#include +#include +#include + +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 + +#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 +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "shell.h" +#include + +/* + * 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 +#include + +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; +} + -- cgit v1.2.3