summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2010-12-17 14:49:40 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2010-12-17 14:49:40 +0000
commitabff6d226a55f3453b085c0d920e02973b971743 (patch)
treef5f15ca1e598f61d5ce78a01ce333e83d7c2f8af /tools
parent2010-12-16 Joel Sherrill <joel.sherrill@oarcorp.com> (diff)
downloadrtems-abff6d226a55f3453b085c0d920e02973b971743.tar.bz2
2010-12-17 Joel Sherrill <joel.sherrill@oarcorp.com>
Jennifer Averett <jennifer.averett@oarcorp.com> Add RTEMS Scheduler Simulator. This is the shell scripting portion. * .cvsignore, ChangeLog, Makefile.am, schedsim_priority/.cvsignore, schedsim_priority/Makefile.am, schedsim_priority/config.c, schedsim_priority/printheir_executing.c, schedsim_priority/schedsim.cc, schedsim_priority/wrap_thread_dispatch.c, scripts/script01, scripts/script02, scripts/script03, scripts/script04, scripts/script05, scripts/script06, shared/.cvsignore, shared/Makefile.am, shared/commands.c, shared/getopt.c, shared/lookup_semaphore.c, shared/lookup_task.c, shared/main_clocktick.c, shared/main_echo.c, shared/main_executing.c, shared/main_heir.c, shared/main_help.c, shared/main_rtemsinit.c, shared/main_semcreate.c, shared/main_semdelete.c, shared/main_semflush.c, shared/main_semobtain.c, shared/main_semrelease.c, shared/main_taskcreate.c, shared/main_taskdelete.c, shared/main_taskmode.c, shared/main_taskpriority.c, shared/main_taskresume.c, shared/main_tasksuspend.c, shared/main_taskwakeafter.c, shared/schedsim_shell.h, shared/shell_cmdset.c, shared/shell_makeargs.c, shared/include/shell.h, shared/include/newlib/_ansi.h, shared/include/newlib/getopt.h: New files.
Diffstat (limited to 'tools')
-rw-r--r--tools/schedsim/shell/.cvsignore2
-rw-r--r--tools/schedsim/shell/ChangeLog26
-rw-r--r--tools/schedsim/shell/Makefile.am12
-rw-r--r--tools/schedsim/shell/schedsim_priority/.cvsignore2
-rw-r--r--tools/schedsim/shell/schedsim_priority/Makefile.am32
-rw-r--r--tools/schedsim/shell/schedsim_priority/config.c7
-rw-r--r--tools/schedsim/shell/schedsim_priority/printheir_executing.c31
-rw-r--r--tools/schedsim/shell/schedsim_priority/schedsim.cc169
-rw-r--r--tools/schedsim/shell/schedsim_priority/wrap_thread_dispatch.c42
-rw-r--r--tools/schedsim/shell/scripts/script0111
-rw-r--r--tools/schedsim/shell/scripts/script029
-rw-r--r--tools/schedsim/shell/scripts/script0319
-rw-r--r--tools/schedsim/shell/scripts/script0410
-rw-r--r--tools/schedsim/shell/scripts/script0522
-rw-r--r--tools/schedsim/shell/scripts/script0614
-rw-r--r--tools/schedsim/shell/shared/.cvsignore2
-rw-r--r--tools/schedsim/shell/shared/Makefile.am61
-rw-r--r--tools/schedsim/shell/shared/commands.c73
-rw-r--r--tools/schedsim/shell/shared/getopt.c477
-rw-r--r--tools/schedsim/shell/shared/include/newlib/_ansi.h99
-rw-r--r--tools/schedsim/shell/shared/include/newlib/getopt.h167
-rw-r--r--tools/schedsim/shell/shared/include/shell.h61
-rw-r--r--tools/schedsim/shell/shared/lookup_semaphore.c15
-rw-r--r--tools/schedsim/shell/shared/lookup_task.c58
-rw-r--r--tools/schedsim/shell/shared/main_clocktick.c75
-rw-r--r--tools/schedsim/shell/shared/main_echo.c140
-rw-r--r--tools/schedsim/shell/shared/main_executing.c42
-rw-r--r--tools/schedsim/shell/shared/main_heir.c42
-rw-r--r--tools/schedsim/shell/shared/main_help.c150
-rw-r--r--tools/schedsim/shell/shared/main_rtemsinit.c43
-rw-r--r--tools/schedsim/shell/shared/main_semcreate.c122
-rw-r--r--tools/schedsim/shell/shared/main_semdelete.c68
-rw-r--r--tools/schedsim/shell/shared/main_semflush.c67
-rw-r--r--tools/schedsim/shell/shared/main_semobtain.c85
-rw-r--r--tools/schedsim/shell/shared/main_semrelease.c67
-rw-r--r--tools/schedsim/shell/shared/main_taskcreate.c111
-rw-r--r--tools/schedsim/shell/shared/main_taskdelete.c68
-rw-r--r--tools/schedsim/shell/shared/main_taskmode.c111
-rw-r--r--tools/schedsim/shell/shared/main_taskpriority.c78
-rw-r--r--tools/schedsim/shell/shared/main_taskresume.c68
-rw-r--r--tools/schedsim/shell/shared/main_tasksuspend.c67
-rw-r--r--tools/schedsim/shell/shared/main_taskwakeafter.c75
-rw-r--r--tools/schedsim/shell/shared/schedsim_shell.h56
-rw-r--r--tools/schedsim/shell/shared/shell_cmdset.c229
-rw-r--r--tools/schedsim/shell/shared/shell_makeargs.c68
45 files changed, 3253 insertions, 0 deletions
diff --git a/tools/schedsim/shell/.cvsignore b/tools/schedsim/shell/.cvsignore
new file mode 100644
index 0000000000..282522db03
--- /dev/null
+++ b/tools/schedsim/shell/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/tools/schedsim/shell/ChangeLog b/tools/schedsim/shell/ChangeLog
new file mode 100644
index 0000000000..fbd9ea94d7
--- /dev/null
+++ b/tools/schedsim/shell/ChangeLog
@@ -0,0 +1,26 @@
+2010-12-17 Joel Sherrill <joel.sherrill@oarcorp.com>
+ Jennifer Averett <jennifer.averett@oarcorp.com>
+
+ Add RTEMS Scheduler Simulator. This is the shell scripting portion.
+ * .cvsignore, ChangeLog, Makefile.am, schedsim_priority/.cvsignore,
+ schedsim_priority/Makefile.am, schedsim_priority/config.c,
+ schedsim_priority/printheir_executing.c,
+ schedsim_priority/schedsim.cc,
+ schedsim_priority/wrap_thread_dispatch.c, scripts/script01,
+ scripts/script02, scripts/script03, scripts/script04,
+ scripts/script05, scripts/script06, shared/.cvsignore,
+ shared/Makefile.am, shared/commands.c, shared/getopt.c,
+ shared/lookup_semaphore.c, shared/lookup_task.c,
+ shared/main_clocktick.c, shared/main_echo.c, shared/main_executing.c,
+ shared/main_heir.c, shared/main_help.c, shared/main_rtemsinit.c,
+ shared/main_semcreate.c, shared/main_semdelete.c,
+ shared/main_semflush.c, shared/main_semobtain.c,
+ shared/main_semrelease.c, shared/main_taskcreate.c,
+ shared/main_taskdelete.c, shared/main_taskmode.c,
+ shared/main_taskpriority.c, shared/main_taskresume.c,
+ shared/main_tasksuspend.c, shared/main_taskwakeafter.c,
+ shared/schedsim_shell.h, shared/shell_cmdset.c,
+ shared/shell_makeargs.c, shared/include/shell.h,
+ shared/include/newlib/_ansi.h, shared/include/newlib/getopt.h: New
+ files.
+
diff --git a/tools/schedsim/shell/Makefile.am b/tools/schedsim/shell/Makefile.am
new file mode 100644
index 0000000000..0ed7f0b3b9
--- /dev/null
+++ b/tools/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/tools/schedsim/shell/schedsim_priority/.cvsignore b/tools/schedsim/shell/schedsim_priority/.cvsignore
new file mode 100644
index 0000000000..282522db03
--- /dev/null
+++ b/tools/schedsim/shell/schedsim_priority/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/tools/schedsim/shell/schedsim_priority/Makefile.am b/tools/schedsim/shell/schedsim_priority/Makefile.am
new file mode 100644
index 0000000000..597cbefb16
--- /dev/null
+++ b/tools/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=$(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/tools/schedsim/shell/schedsim_priority/config.c b/tools/schedsim/shell/schedsim_priority/config.c
new file mode 100644
index 0000000000..227f912389
--- /dev/null
+++ b/tools/schedsim/shell/schedsim_priority/config.c
@@ -0,0 +1,7 @@
+#include <rtems.h>
+
+#define CONFIGURE_INIT
+#define CONFIGURE_MAXIMUM_TASKS 1000
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1000
+#include <confdefs.h>
+
diff --git a/tools/schedsim/shell/schedsim_priority/printheir_executing.c b/tools/schedsim/shell/schedsim_priority/printheir_executing.c
new file mode 100644
index 0000000000..b0855d3fc4
--- /dev/null
+++ b/tools/schedsim/shell/schedsim_priority/printheir_executing.c
@@ -0,0 +1,31 @@
+/*
+ * printheir_executing
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <rtems.h>
+
+void PRINT_EXECUTING() {
+ printf(
+ " Thread Executing: 0x%08x priority=%ld\n",
+ _Thread_Executing->Object.id,
+ (long) _Thread_Executing->current_priority
+ );
+}
+
+void PRINT_HEIR() {
+ printf(
+ " Thread Heir: 0x%08x priority=%ld\n",
+ _Thread_Heir->Object.id,
+ (long) _Thread_Heir->current_priority
+ );
+}
diff --git a/tools/schedsim/shell/schedsim_priority/schedsim.cc b/tools/schedsim/shell/schedsim_priority/schedsim.cc
new file mode 100644
index 0000000000..b70dd718ec
--- /dev/null
+++ b/tools/schedsim/shell/schedsim_priority/schedsim.cc
@@ -0,0 +1,169 @@
+/*
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#include <newlib/getopt.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "shell.h"
+#include "rtems_sched.h"
+
+/*
+ * Variables to control global behavior
+ */
+int verbose = 0;
+const char *progname;
+const char *scriptname;
+
+FILE *Script;
+int ScriptFileLine = 0;
+
+/*
+ * Print program usage message
+ */
+void usage()
+{
+ fprintf(
+ stderr,
+ "Usage: %s [-v] script\n"
+ "\n"
+ " -v - enable verbose output\n",
+ progname
+ );
+ exit( -1 );
+}
+
+#define RTEMS_SHELL_MAXIMUM_ARGUMENTS (128)
+
+void ProcessScript(
+ FILE *script
+)
+{
+ char buffer[512];
+ char *cStatus;
+ char *c;
+ size_t length;
+ int argc;
+ char *argv[RTEMS_SHELL_MAXIMUM_ARGUMENTS];
+ rtems_shell_cmd_t *shell_cmd;
+
+
+ while ( 1 ) {
+ cStatus = fgets( buffer, sizeof(buffer), script );
+ if ( cStatus == NULL )
+ break;
+
+ // If the last line does not have a CR, then we don't want to
+ // arbitrarily clobber an = instead of a \n.
+ length = strlen(buffer);
+ if ( buffer[ length - 1] == '\n' )
+ buffer[ length - 1] = '\0';
+
+ if ( verbose )
+ fprintf( stderr, "%d: %s\n", ++ScriptFileLine, buffer );
+
+ if ( buffer[0] == '#' )
+ continue;
+
+ for ( c = buffer ; *c ; c++ ) {
+ if (!isblank((int)*c))
+ break;
+ }
+
+
+ if (!strcmp(c,"bye") || !strcmp(c,"exit")) {
+ return;
+ }
+
+ if (rtems_shell_make_args(c, &argc, argv, RTEMS_SHELL_MAXIMUM_ARGUMENTS)) {
+ fprintf(stderr, "Error parsing arguments\n" );
+ continue;
+ }
+
+ shell_cmd = rtems_shell_lookup_cmd(argv[0]);
+ if ( !shell_cmd ) {
+ fprintf(stderr, "%s is unknown command\n", c );
+ continue;
+ }
+
+ shell_cmd->command(argc, argv);
+ }
+}
+
+int main(
+ int argc,
+ char **argv
+)
+{
+ int opt;
+ progname = argv[0];
+
+ while ((opt = getopt(argc, argv, "v")) != -1) {
+ switch (opt) {
+ case 'v': verbose = 1; break;
+ default: /* '?' */
+ usage();
+ }
+ }
+
+ if ( optind >= argc ) {
+ fprintf( stderr, "no script to process\n" );
+ usage();
+ }
+
+ scriptname = argv[ optind ];
+
+ if ( verbose ) {
+ fprintf(
+ stderr,
+ "Script File : %s\n"
+ "verbose : %d\n",
+ scriptname,
+ verbose
+ );
+ }
+
+ //
+ // Initialize the command interpreter
+ //
+ rtems_shell_initialize_command_set();
+
+ //
+ // Open the script file
+ //
+ Script = fopen( scriptname, "r" );
+ if ( !Script ) {
+ fprintf( stderr, "Unable to open script file (%s)\n", scriptname );
+ exit( -1 );
+ }
+
+ //
+ // Process the Script
+ //
+ ProcessScript( Script );
+
+ //
+ // Open the script file
+ //
+ (void) fclose( Script );
+
+ //
+ // Just in case something throws
+ //
+ try {
+ } catch (...) {
+ exit(-1);
+ }
+
+ return 0;
+}
diff --git a/tools/schedsim/shell/schedsim_priority/wrap_thread_dispatch.c b/tools/schedsim/shell/schedsim_priority/wrap_thread_dispatch.c
new file mode 100644
index 0000000000..3432188072
--- /dev/null
+++ b/tools/schedsim/shell/schedsim_priority/wrap_thread_dispatch.c
@@ -0,0 +1,42 @@
+/*
+ * Thread Dispatch Wrapper Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#include "shell.h"
+#include <schedsim_shell.h>
+
+#include <stdio.h>
+#include <rtems.h>
+
+Thread_Control *last_heir = NULL;
+Thread_Control *last_executing = NULL;
+
+extern void __real__Thread_Dispatch(void);
+
+void check_heir_and_executing(void)
+{
+ if ( last_heir != _Thread_Heir )
+ PRINT_HEIR();
+
+ if ( last_executing != _Thread_Executing )
+ PRINT_EXECUTING();
+
+ last_heir = _Thread_Heir;
+ last_executing = _Thread_Executing;
+}
+
+void __wrap__Thread_Dispatch(void)
+{
+ check_heir_and_executing();
+ __real__Thread_Dispatch();
+ check_heir_and_executing();
+}
diff --git a/tools/schedsim/shell/scripts/script01 b/tools/schedsim/shell/scripts/script01
new file mode 100644
index 0000000000..9a40dc35bb
--- /dev/null
+++ b/tools/schedsim/shell/scripts/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/tools/schedsim/shell/scripts/script02 b/tools/schedsim/shell/scripts/script02
new file mode 100644
index 0000000000..294956c372
--- /dev/null
+++ b/tools/schedsim/shell/scripts/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/tools/schedsim/shell/scripts/script03 b/tools/schedsim/shell/scripts/script03
new file mode 100644
index 0000000000..a05ab26777
--- /dev/null
+++ b/tools/schedsim/shell/scripts/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/tools/schedsim/shell/scripts/script04 b/tools/schedsim/shell/scripts/script04
new file mode 100644
index 0000000000..4eebcd70eb
--- /dev/null
+++ b/tools/schedsim/shell/scripts/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/tools/schedsim/shell/scripts/script05 b/tools/schedsim/shell/scripts/script05
new file mode 100644
index 0000000000..c57ea4c791
--- /dev/null
+++ b/tools/schedsim/shell/scripts/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/tools/schedsim/shell/scripts/script06 b/tools/schedsim/shell/scripts/script06
new file mode 100644
index 0000000000..962568d338
--- /dev/null
+++ b/tools/schedsim/shell/scripts/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/tools/schedsim/shell/shared/.cvsignore b/tools/schedsim/shell/shared/.cvsignore
new file mode 100644
index 0000000000..282522db03
--- /dev/null
+++ b/tools/schedsim/shell/shared/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/tools/schedsim/shell/shared/Makefile.am b/tools/schedsim/shell/shared/Makefile.am
new file mode 100644
index 0000000000..cfa1f3a46a
--- /dev/null
+++ b/tools/schedsim/shell/shared/Makefile.am
@@ -0,0 +1,61 @@
+##
+## $Id$
+##
+
+ACLOCAL_AMFLAGS = -I ../../../aclocal
+
+lib_LIBRARIES = libschedsim.a
+
+cpukitdir=$(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/tools/schedsim/shell/shared/commands.c b/tools/schedsim/shell/shared/commands.c
new file mode 100644
index 0000000000..c872c2ec38
--- /dev/null
+++ b/tools/schedsim/shell/shared/commands.c
@@ -0,0 +1,73 @@
+/*
+ * BASED UPON SOURCE IN RTEMS, MODIFIED FOR SIMULATOR
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#include "shell.h"
+#include <stdio.h>
+
+extern rtems_shell_cmd_t rtems_shell_ECHO_Command;
+extern rtems_shell_cmd_t rtems_shell_HELP_Command;
+
+extern rtems_shell_cmd_t rtems_shell_RTEMS_INIT_Command;
+extern rtems_shell_cmd_t rtems_shell_TASK_CREATE_Command;
+extern rtems_shell_cmd_t rtems_shell_TASK_DELETE_Command;
+extern rtems_shell_cmd_t rtems_shell_TASK_MODE_Command;
+extern rtems_shell_cmd_t rtems_shell_TASK_PRIORITY_Command;
+extern rtems_shell_cmd_t rtems_shell_TASK_SUSPEND_Command;
+extern rtems_shell_cmd_t rtems_shell_TASK_RESUME_Command;
+extern rtems_shell_cmd_t rtems_shell_TASK_WAKE_AFTER_Command;
+
+extern rtems_shell_cmd_t rtems_shell_CLOCK_TICK_Command;
+
+
+extern rtems_shell_cmd_t rtems_shell_SEMAPHORE_CREATE_Command;
+extern rtems_shell_cmd_t rtems_shell_SEMAPHORE_DELETE_Command;
+extern rtems_shell_cmd_t rtems_shell_SEMAPHORE_OBTAIN_Command;
+extern rtems_shell_cmd_t rtems_shell_SEMAPHORE_RELEASE_Command;
+extern rtems_shell_cmd_t rtems_shell_SEMAPHORE_FLUSH_Command;
+
+extern rtems_shell_cmd_t rtems_shell_TASK_EXECUTING_Command;
+extern rtems_shell_cmd_t rtems_shell_TASK_HEIR_Command;
+
+rtems_shell_cmd_t *rtems_shell_Initial_commands[] = {
+ /* Generic Commands */
+ &rtems_shell_ECHO_Command,
+ &rtems_shell_HELP_Command,
+
+ /* RTEMS Classic API Type Commands */
+ &rtems_shell_RTEMS_INIT_Command,
+ &rtems_shell_TASK_CREATE_Command,
+ &rtems_shell_TASK_DELETE_Command,
+ &rtems_shell_TASK_MODE_Command,
+ &rtems_shell_TASK_PRIORITY_Command,
+ &rtems_shell_TASK_SUSPEND_Command,
+ &rtems_shell_TASK_RESUME_Command,
+ &rtems_shell_TASK_WAKE_AFTER_Command,
+
+ &rtems_shell_CLOCK_TICK_Command,
+
+ &rtems_shell_SEMAPHORE_CREATE_Command,
+ &rtems_shell_SEMAPHORE_DELETE_Command,
+ &rtems_shell_SEMAPHORE_OBTAIN_Command,
+ &rtems_shell_SEMAPHORE_RELEASE_Command,
+ &rtems_shell_SEMAPHORE_FLUSH_Command,
+
+ /* RTEMS Helper Commands */
+ &rtems_shell_TASK_EXECUTING_Command,
+ &rtems_shell_TASK_HEIR_Command,
+ NULL
+};
+
+rtems_shell_alias_t *rtems_shell_Initial_aliases[] = {
+ NULL
+};
+
diff --git a/tools/schedsim/shell/shared/getopt.c b/tools/schedsim/shell/shared/getopt.c
new file mode 100644
index 0000000000..df7d27aab5
--- /dev/null
+++ b/tools/schedsim/shell/shared/getopt.c
@@ -0,0 +1,477 @@
+/****************************************************************************
+
+getopt.c - Read command line options
+
+AUTHOR: Gregory Pietsch
+CREATED Fri Jan 10 21:13:05 1997
+
+DESCRIPTION:
+
+The getopt() function parses the command line arguments. Its arguments argc
+and argv are the argument count and array as passed to the main() function
+on program invocation. The argument optstring is a list of available option
+characters. If such a character is followed by a colon (`:'), the option
+takes an argument, which is placed in optarg. If such a character is
+followed by two colons, the option takes an optional argument, which is
+placed in optarg. If the option does not take an argument, optarg is NULL.
+
+The external variable optind is the index of the next array element of argv
+to be processed; it communicates from one call to the next which element to
+process.
+
+The getopt_long() function works like getopt() except that it also accepts
+long options started by two dashes `--'. If these take values, it is either
+in the form
+
+--arg=value
+
+ or
+
+--arg value
+
+It takes the additional arguments longopts which is a pointer to the first
+element of an array of type struct option. The last element of the array
+has to be filled with NULL for the name field.
+
+The longind pointer points to the index of the current long option relative
+to longopts if it is non-NULL.
+
+The getopt() function returns the option character if the option was found
+successfully, `:' if there was a missing parameter for one of the options,
+`?' for an unknown option character, and EOF for the end of the option list.
+
+The getopt_long() function's return value is described in the header file.
+
+The function getopt_long_only() is identical to getopt_long(), except that a
+plus sign `+' can introduce long options as well as `--'.
+
+The following describes how to deal with options that follow non-option
+argv-elements.
+
+If the caller did not specify anything, the default is REQUIRE_ORDER if the
+environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+REQUIRE_ORDER means don't recognize them as options; stop option processing
+when the first non-option is seen. This is what Unix does. This mode of
+operation is selected by either setting the environment variable
+POSIXLY_CORRECT, or using `+' as the first character of the optstring
+parameter.
+
+PERMUTE is the default. We permute the contents of ARGV as we scan, so that
+eventually all the non-options are at the end. This allows options to be
+given in any order, even with programs that were not written to expect this.
+
+RETURN_IN_ORDER is an option available to programs that were written to
+expect options and other argv-elements in any order and that care about the
+ordering of the two. We describe each non-option argv-element as if it were
+the argument of an option with character code 1. Using `-' as the first
+character of the optstring parameter selects this mode of operation.
+
+The special argument `--' forces an end of option-scanning regardless of the
+value of ordering. In the case of RETURN_IN_ORDER, only `--' can cause
+getopt() and friends to return EOF with optind != argc.
+
+COPYRIGHT NOTICE AND DISCLAIMER:
+
+Copyright (C) 1997 Gregory Pietsch
+
+This file and the accompanying getopt.h header file are hereby placed in the
+public domain without restrictions. Just give the author credit, don't
+claim you wrote it or prevent anyone else from using it.
+
+Gregory Pietsch's current e-mail address:
+gpietsch@comcast.net
+****************************************************************************/
+
+/* include files */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <newlib/getopt.h>
+
+/* macros */
+#define NO_ARG 0
+#define REQUIRED_ARG 1
+#define OPTIONAL_ARG 2
+
+/* types */
+typedef enum GETOPT_ORDERING_T
+{
+ PERMUTE,
+ RETURN_IN_ORDER,
+ REQUIRE_ORDER
+} GETOPT_ORDERING_T;
+
+/* globally-defined variables */
+char *optarg = 0;
+int optind = 0;
+int opterr = 1;
+int optopt = '?';
+
+/* static variables */
+static int optwhere = 0;
+
+/* functions */
+
+/* reverse_argv_elements: reverses num elements starting at argv */
+static void
+reverse_argv_elements (char **argv, int num)
+{
+ int i;
+ char *tmp;
+
+ for (i = 0; i < (num >> 1); i++)
+ {
+ tmp = argv[i];
+ argv[i] = argv[num - i - 1];
+ argv[num - i - 1] = tmp;
+ }
+}
+
+/* permute: swap two blocks of argv-elements given their lengths */
+static void
+permute (char *const argv[], int len1, int len2)
+{
+ reverse_argv_elements ((char **) argv, len1);
+ reverse_argv_elements ((char **) argv, len1 + len2);
+ reverse_argv_elements ((char **) argv, len2);
+}
+
+/* is_option: is this argv-element an option or the end of the option list? */
+static int
+is_option (char *argv_element, int only)
+{
+ return ((argv_element == 0)
+ || (argv_element[0] == '-') || (only && argv_element[0] == '+'));
+}
+
+/* read_globals: read the values from the globals into a getopt_data
+ structure */
+static void
+read_globals (struct getopt_data *data)
+{
+ data->optarg = optarg;
+ data->optind = optind;
+ data->opterr = opterr;
+ data->optopt = optopt;
+ data->optwhere = optwhere;
+}
+
+/* write_globals: write the values into the globals from a getopt_data
+ structure */
+static void
+write_globals (struct getopt_data *data)
+{
+ optarg = data->optarg;
+ optind = data->optind;
+ opterr = data->opterr;
+ optopt = data->optopt;
+ optwhere = data->optwhere;
+}
+
+/* getopt_internal: the function that does all the dirty work */
+static int
+getopt_internal (int argc, char *const argv[], const char *shortopts,
+ const struct option *longopts, int *longind, int only,
+ struct getopt_data *data)
+{
+ GETOPT_ORDERING_T ordering = PERMUTE;
+ size_t permute_from = 0;
+ int num_nonopts = 0;
+ int optindex = 0;
+ size_t match_chars = 0;
+ char *possible_arg = 0;
+ int longopt_match = -1;
+ int has_arg = -1;
+ char *cp = 0;
+ int arg_next = 0;
+
+ /* first, deal with silly parameters and easy stuff */
+ if (argc == 0 || argv == 0 || (shortopts == 0 && longopts == 0)
+ || data->optind >= argc || argv[data->optind] == 0)
+ return EOF;
+ if (strcmp (argv[data->optind], "--") == 0)
+ {
+ data->optind++;
+ return EOF;
+ }
+
+ /* if this is our first time through */
+ if (data->optind == 0)
+ data->optind = data->optwhere = 1;
+
+ /* define ordering */
+ if (shortopts != 0 && (*shortopts == '-' || *shortopts == '+'))
+ {
+ ordering = (*shortopts == '-') ? RETURN_IN_ORDER : REQUIRE_ORDER;
+ shortopts++;
+ }
+ else
+ ordering = (getenv ("POSIXLY_CORRECT") != 0) ? REQUIRE_ORDER : PERMUTE;
+
+ /*
+ * based on ordering, find our next option, if we're at the beginning of
+ * one
+ */
+ if (data->optwhere == 1)
+ {
+ switch (ordering)
+ {
+ default: /* shouldn't happen */
+ case PERMUTE:
+ permute_from = data->optind;
+ num_nonopts = 0;
+ while (!is_option (argv[data->optind], only))
+ {
+ data->optind++;
+ num_nonopts++;
+ }
+ if (argv[data->optind] == 0)
+ {
+ /* no more options */
+ data->optind = permute_from;
+ return EOF;
+ }
+ else if (strcmp (argv[data->optind], "--") == 0)
+ {
+ /* no more options, but have to get `--' out of the way */
+ permute (argv + permute_from, num_nonopts, 1);
+ data->optind = permute_from + 1;
+ return EOF;
+ }
+ break;
+ case RETURN_IN_ORDER:
+ if (!is_option (argv[data->optind], only))
+ {
+ data->optarg = argv[data->optind++];
+ return (data->optopt = 1);
+ }
+ break;
+ case REQUIRE_ORDER:
+ if (!is_option (argv[data->optind], only))
+ return EOF;
+ break;
+ }
+ }
+ /* we've got an option, so parse it */
+
+ /* first, is it a long option? */
+ if (longopts != 0
+ && (memcmp (argv[data->optind], "--", 2) == 0
+ || (only && argv[data->optind][0] == '+')) && data->optwhere == 1)
+ {
+ /* handle long options */
+ if (memcmp (argv[data->optind], "--", 2) == 0)
+ data->optwhere = 2;
+ longopt_match = -1;
+ possible_arg = strchr (argv[data->optind] + data->optwhere, '=');
+ if (possible_arg == 0)
+ {
+ /* no =, so next argv might be arg */
+ match_chars = strlen (argv[data->optind]);
+ possible_arg = argv[data->optind] + match_chars;
+ match_chars = match_chars - data->optwhere;
+ }
+ else
+ match_chars = (possible_arg - argv[data->optind]) - data->optwhere;
+ for (optindex = 0; longopts[optindex].name != 0; ++optindex)
+ {
+ if (memcmp
+ (argv[data->optind] + data->optwhere, longopts[optindex].name,
+ match_chars) == 0)
+ {
+ /* do we have an exact match? */
+ if (match_chars == (int) (strlen (longopts[optindex].name)))
+ {
+ longopt_match = optindex;
+ break;
+ }
+ /* do any characters match? */
+ else
+ {
+ if (longopt_match < 0)
+ longopt_match = optindex;
+ else
+ {
+ /* we have ambiguous options */
+ if (data->opterr)
+ fprintf (stderr, "%s: option `%s' is ambiguous "
+ "(could be `--%s' or `--%s')\n",
+ argv[0],
+ argv[data->optind],
+ longopts[longopt_match].name,
+ longopts[optindex].name);
+ return (data->optopt = '?');
+ }
+ }
+ }
+ }
+ if (longopt_match >= 0)
+ has_arg = longopts[longopt_match].has_arg;
+ }
+
+ /* if we didn't find a long option, is it a short option? */
+ if (longopt_match < 0 && shortopts != 0)
+ {
+ cp = strchr (shortopts, argv[data->optind][data->optwhere]);
+ if (cp == 0)
+ {
+ /* couldn't find option in shortopts */
+ if (data->opterr)
+ fprintf (stderr,
+ "%s: invalid option -- `-%c'\n",
+ argv[0], argv[data->optind][data->optwhere]);
+ data->optwhere++;
+ if (argv[data->optind][data->optwhere] == '\0')
+ {
+ data->optind++;
+ data->optwhere = 1;
+ }
+ return (data->optopt = '?');
+ }
+ has_arg = ((cp[1] == ':')
+ ? ((cp[2] == ':') ? OPTIONAL_ARG : REQUIRED_ARG) : NO_ARG);
+ possible_arg = argv[data->optind] + data->optwhere + 1;
+ data->optopt = *cp;
+ }
+
+ /* get argument and reset data->optwhere */
+ arg_next = 0;
+ switch (has_arg)
+ {
+ case OPTIONAL_ARG:
+ if (*possible_arg == '=')
+ possible_arg++;
+ data->optarg = (*possible_arg != '\0') ? possible_arg : 0;
+ data->optwhere = 1;
+ break;
+ case REQUIRED_ARG:
+ if (*possible_arg == '=')
+ possible_arg++;
+ if (*possible_arg != '\0')
+ {
+ data->optarg = possible_arg;
+ data->optwhere = 1;
+ }
+ else if (data->optind + 1 >= argc)
+ {
+ if (data->opterr)
+ {
+ fprintf (stderr, "%s: argument required for option `", argv[0]);
+ if (longopt_match >= 0)
+ fprintf (stderr, "--%s'\n", longopts[longopt_match].name);
+ else
+ fprintf (stderr, "-%c'\n", *cp);
+ }
+ data->optind++;
+ return (data->optopt = ':');
+ }
+ else
+ {
+ data->optarg = argv[data->optind + 1];
+ arg_next = 1;
+ data->optwhere = 1;
+ }
+ break;
+ default: /* shouldn't happen */
+ case NO_ARG:
+ if (longopt_match < 0)
+ {
+ data->optwhere++;
+ if (argv[data->optind][data->optwhere] == '\0')
+ data->optwhere = 1;
+ }
+ else
+ data->optwhere = 1;
+ data->optarg = 0;
+ break;
+ }
+
+ /* do we have to permute or otherwise modify data->optind? */
+ if (ordering == PERMUTE && data->optwhere == 1 && num_nonopts != 0)
+ {
+ permute (argv + permute_from, num_nonopts, 1 + arg_next);
+ data->optind = permute_from + 1 + arg_next;
+ }
+ else if (data->optwhere == 1)
+ data->optind = data->optind + 1 + arg_next;
+
+ /* finally return */
+ if (longopt_match >= 0)
+ {
+ if (longind != 0)
+ *longind = longopt_match;
+ if (longopts[longopt_match].flag != 0)
+ {
+ *(longopts[longopt_match].flag) = longopts[longopt_match].val;
+ return 0;
+ }
+ else
+ return longopts[longopt_match].val;
+ }
+ else
+ return data->optopt;
+}
+
+int
+getopt (int argc, char *const argv[], const char *optstring)
+{
+ struct getopt_data data;
+ int r;
+
+ read_globals (&data);
+ r = getopt_internal (argc, argv, optstring, 0, 0, 0, &data);
+ write_globals (&data);
+ return r;
+}
+
+int
+getopt_long (int argc, char *const argv[], const char *shortopts,
+ const struct option *longopts, int *longind)
+{
+ struct getopt_data data;
+ int r;
+
+ read_globals (&data);
+ r = getopt_internal (argc, argv, shortopts, longopts, longind, 0, &data);
+ write_globals (&data);
+ return r;
+}
+
+int
+getopt_long_only (int argc, char *const argv[], const char *shortopts,
+ const struct option *longopts, int *longind)
+{
+ struct getopt_data data;
+ int r;
+
+ read_globals (&data);
+ r = getopt_internal (argc, argv, shortopts, longopts, longind, 1, &data);
+ write_globals (&data);
+ return r;
+}
+
+int
+__getopt_r (int argc, char *const argv[], const char *optstring,
+ struct getopt_data *data)
+{
+ return getopt_internal (argc, argv, optstring, 0, 0, 0, data);
+}
+
+int
+__getopt_long_r (int argc, char *const argv[], const char *shortopts,
+ const struct option *longopts, int *longind,
+ struct getopt_data *data)
+{
+ return getopt_internal (argc, argv, shortopts, longopts, longind, 0, data);
+}
+
+int
+__getopt_long_only_r (int argc, char *const argv[], const char *shortopts,
+ const struct option *longopts, int *longind,
+ struct getopt_data *data)
+{
+ return getopt_internal (argc, argv, shortopts, longopts, longind, 1, data);
+}
+
+/* end of file GETOPT.C */
diff --git a/tools/schedsim/shell/shared/include/newlib/_ansi.h b/tools/schedsim/shell/shared/include/newlib/_ansi.h
new file mode 100644
index 0000000000..c52ba606d9
--- /dev/null
+++ b/tools/schedsim/shell/shared/include/newlib/_ansi.h
@@ -0,0 +1,99 @@
+/* Provide support for both ANSI and non-ANSI environments. */
+
+/* Some ANSI environments are "broken" in the sense that __STDC__ cannot be
+ relied upon to have it's intended meaning. Therefore we must use our own
+ concoction: _HAVE_STDC. Always use _HAVE_STDC instead of __STDC__ in newlib
+ sources!
+
+ To get a strict ANSI C environment, define macro __STRICT_ANSI__. This will
+ "comment out" the non-ANSI parts of the ANSI header files (non-ANSI header
+ files aren't affected). */
+
+#ifndef _ANSIDECL_H_
+#define _ANSIDECL_H_
+
+/* #include <newlib.h> */
+/* #include <sys/config.h> */
+
+/* First try to figure out whether we really are in an ANSI C environment. */
+/* FIXME: This probably needs some work. Perhaps sys/config.h can be
+ prevailed upon to give us a clue. */
+
+#ifdef __STDC__
+#define _HAVE_STDC
+#endif
+
+#ifdef _HAVE_STDC
+#define _PTR void *
+#define _AND ,
+#define _NOARGS void
+#define _CONST const
+#define _VOLATILE volatile
+#define _SIGNED signed
+#define _DOTS , ...
+#define _VOID void
+#ifdef __CYGWIN__
+#define _EXFUN(name, proto) __cdecl name proto
+#define _EXPARM(name, proto) (* __cdecl name) proto
+#else
+#define _EXFUN(name, proto) name proto
+#define _EXPARM(name, proto) (* name) proto
+#endif
+#define _DEFUN(name, arglist, args) name(args)
+#define _DEFUN_VOID(name) name(_NOARGS)
+#define _CAST_VOID (void)
+#ifndef _LONG_DOUBLE
+#define _LONG_DOUBLE long double
+#endif
+#ifndef _LONG_LONG
+#define _LONG_LONG long long
+#endif
+#ifndef _PARAMS
+#define _PARAMS(paramlist) paramlist
+#endif
+#else
+#define _PTR char *
+#define _AND ;
+#define _NOARGS
+#define _CONST
+#define _VOLATILE
+#define _SIGNED
+#define _DOTS
+#define _VOID void
+#define _EXFUN(name, proto) name()
+#define _DEFUN(name, arglist, args) name arglist args;
+#define _DEFUN_VOID(name) name()
+#define _CAST_VOID
+#define _LONG_DOUBLE double
+#define _LONG_LONG long
+#ifndef _PARAMS
+#define _PARAMS(paramlist) ()
+#endif
+#endif
+
+/* Support gcc's __attribute__ facility. */
+
+#ifdef __GNUC__
+#define _ATTRIBUTE(attrs) __attribute__ (attrs)
+#else
+#define _ATTRIBUTE(attrs)
+#endif
+
+/* ISO C++. */
+
+#ifdef __cplusplus
+#if !(defined(_BEGIN_STD_C) && defined(_END_STD_C))
+#ifdef _HAVE_STD_CXX
+#define _BEGIN_STD_C namespace std { extern "C" {
+#define _END_STD_C } }
+#else
+#define _BEGIN_STD_C extern "C" {
+#define _END_STD_C }
+#endif
+#endif
+#else
+#define _BEGIN_STD_C
+#define _END_STD_C
+#endif
+
+#endif /* _ANSIDECL_H_ */
diff --git a/tools/schedsim/shell/shared/include/newlib/getopt.h b/tools/schedsim/shell/shared/include/newlib/getopt.h
new file mode 100644
index 0000000000..2d397eb185
--- /dev/null
+++ b/tools/schedsim/shell/shared/include/newlib/getopt.h
@@ -0,0 +1,167 @@
+/****************************************************************************
+
+getopt.h - Read command line options
+
+AUTHOR: Gregory Pietsch
+CREATED Thu Jan 09 22:37:00 1997
+
+DESCRIPTION:
+
+The getopt() function parses the command line arguments. Its arguments argc
+and argv are the argument count and array as passed to the main() function
+on program invocation. The argument optstring is a list of available option
+characters. If such a character is followed by a colon (`:'), the option
+takes an argument, which is placed in optarg. If such a character is
+followed by two colons, the option takes an optional argument, which is
+placed in optarg. If the option does not take an argument, optarg is NULL.
+
+The external variable optind is the index of the next array element of argv
+to be processed; it communicates from one call to the next which element to
+process.
+
+The getopt_long() function works like getopt() except that it also accepts
+long options started by two dashes `--'. If these take values, it is either
+in the form
+
+--arg=value
+
+ or
+
+--arg value
+
+It takes the additional arguments longopts which is a pointer to the first
+element of an array of type GETOPT_LONG_OPTION_T, defined below. The last
+element of the array has to be filled with NULL for the name field.
+
+The longind pointer points to the index of the current long option relative
+to longopts if it is non-NULL.
+
+The getopt() function returns the option character if the option was found
+successfully, `:' if there was a missing parameter for one of the options,
+`?' for an unknown option character, and EOF for the end of the option list.
+
+The getopt_long() function's return value is described below.
+
+The function getopt_long_only() is identical to getopt_long(), except that a
+plus sign `+' can introduce long options as well as `--'.
+
+Describe how to deal with options that follow non-option ARGV-elements.
+
+If the caller did not specify anything, the default is REQUIRE_ORDER if the
+environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+REQUIRE_ORDER means don't recognize them as options; stop option processing
+when the first non-option is seen. This is what Unix does. This mode of
+operation is selected by either setting the environment variable
+POSIXLY_CORRECT, or using `+' as the first character of the optstring
+parameter.
+
+PERMUTE is the default. We permute the contents of ARGV as we scan, so that
+eventually all the non-options are at the end. This allows options to be
+given in any order, even with programs that were not written to expect this.
+
+RETURN_IN_ORDER is an option available to programs that were written to
+expect options and other ARGV-elements in any order and that care about the
+ordering of the two. We describe each non-option ARGV-element as if it were
+the argument of an option with character code 1. Using `-' as the first
+character of the optstring parameter selects this mode of operation.
+
+The special argument `--' forces an end of option-scanning regardless of the
+value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause
+getopt() and friends to return EOF with optind != argc.
+
+COPYRIGHT NOTICE AND DISCLAIMER:
+
+Copyright (C) 1997 Gregory Pietsch
+
+This file and the accompanying getopt.c implementation file are hereby
+placed in the public domain without restrictions. Just give the author
+credit, don't claim you wrote it or prevent anyone else from using it.
+
+Gregory Pietsch's current e-mail address:
+gpietsch@comcast.net
+****************************************************************************/
+
+/* use _GETOPT_H so we avoid dupe include of glibc getopt.h */
+#ifndef _GETOPT_H
+#define _GETOPT_H
+
+#include <newlib/_ansi.h>
+
+/* include files needed by this include file */
+
+ /* These #defines are to keep the namespace clear... */
+#define getopt_r __getopt_r
+#define getopt_long_r __getopt_long_r
+#define getopt_long_only_r __getopt_long_only_r
+
+#ifdef __cplusplus
+extern "C"
+{
+
+#endif /* __cplusplus */
+
+/* types defined by this include file */
+ struct option
+ {
+ char *name; /* the name of the long option */
+ int has_arg; /* one of the above macros */
+ int *flag; /* determines if getopt_long() returns a
+ * value for a long option; if it is
+ * non-NULL, 0 is returned as a function
+ * value and the value of val is stored in
+ * the area pointed to by flag. Otherwise,
+ * val is returned. */
+ int val; /* determines the value to return if flag is
+ * NULL. */
+
+ };
+
+ /* The getopt_data structure is for reentrancy. Its members are similar to
+ the externally-defined variables. */
+ typedef struct getopt_data
+ {
+ char *optarg;
+ int optind, opterr, optopt, optwhere;
+ } getopt_data;
+
+ /* externally-defined variables */
+ extern char *optarg;
+ extern int optind;
+ extern int opterr;
+ extern int optopt;
+
+ /* function prototypes */
+ int _EXFUN (getopt,
+ (int __argc, char *const __argv[], const char *__optstring));
+
+ int _EXFUN (getopt_long,
+ (int __argc, char *const __argv[], const char *__shortopts,
+ const struct option * __longopts, int *__longind));
+
+ int _EXFUN (getopt_long_only,
+ (int __argc, char *const __argv[], const char *__shortopts,
+ const struct option * __longopts, int *__longind));
+
+ int _EXFUN (__getopt_r,
+ (int __argc, char *const __argv[], const char *__optstring,
+ struct getopt_data * __data));
+
+ int _EXFUN (__getopt_long_r,
+ (int __argc, char *const __argv[], const char *__shortopts,
+ const struct option * __longopts, int *__longind,
+ struct getopt_data * __data));
+
+ int _EXFUN (__getopt_long_only_r,
+ (int __argc, char *const __argv[], const char *__shortopts,
+ const struct option * __longopts, int *__longind,
+ struct getopt_data * __data));
+
+#ifdef __cplusplus
+};
+
+#endif /* __cplusplus */
+
+#endif /* GETOPT_H */
+
+/* END OF FILE getopt.h */
diff --git a/tools/schedsim/shell/shared/include/shell.h b/tools/schedsim/shell/shared/include/shell.h
new file mode 100644
index 0000000000..d5209f6cd7
--- /dev/null
+++ b/tools/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/tools/schedsim/shell/shared/lookup_semaphore.c b/tools/schedsim/shell/shared/lookup_semaphore.c
new file mode 100644
index 0000000000..70b08879a6
--- /dev/null
+++ b/tools/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/tools/schedsim/shell/shared/lookup_task.c b/tools/schedsim/shell/shared/lookup_task.c
new file mode 100644
index 0000000000..0180886bd9
--- /dev/null
+++ b/tools/schedsim/shell/shared/lookup_task.c
@@ -0,0 +1,58 @@
+/*
+ * Given Name or ID String, give Id
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include <rtems/stringto.h>
+
+#ifndef METHOD_NAME
+ #define METHOD_NAME lookup_task
+#endif
+#ifndef RTEMS_IDENT_NAME
+ #define RTEMS_IDENT_NAME rtems_task_ident
+#endif
+
+int METHOD_NAME(
+ const char *string,
+ rtems_id *id
+)
+{
+ char name[5];
+ rtems_status_code status;
+ unsigned long tmp;
+
+ if ( string[0] != '0' ) {
+ memset( name, '\0', sizeof(name) );
+ strncpy( name, string, 4 );
+ status = RTEMS_IDENT_NAME(
+ rtems_build_name( name[0], name[1], name[2], name[3] ),
+ OBJECTS_SEARCH_ALL_NODES,
+ id
+ );
+ if ( status != RTEMS_SUCCESSFUL )
+ return 1;
+ } else {
+ if ( rtems_string_to_unsigned_long( string, &tmp, NULL, 0) ) {
+ fprintf( stderr, "Argument (%s) is not a number\n", string );
+ return 1;
+ }
+ *id = (rtems_id) tmp;
+ }
+
+ return 0;
+}
diff --git a/tools/schedsim/shell/shared/main_clocktick.c b/tools/schedsim/shell/shared/main_clocktick.c
new file mode 100644
index 0000000000..bfc413655e
--- /dev/null
+++ b/tools/schedsim/shell/shared/main_clocktick.c
@@ -0,0 +1,75 @@
+/*
+ * Task Priority Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_clock_tick(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_status_code status;
+ rtems_interval ticks;
+ unsigned long tmp;
+ rtems_interval t;
+
+ 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/tools/schedsim/shell/shared/main_echo.c b/tools/schedsim/shell/shared/main_echo.c
new file mode 100644
index 0000000000..f3c9013c88
--- /dev/null
+++ b/tools/schedsim/shell/shared/main_echo.c
@@ -0,0 +1,140 @@
+/* $NetBSD: echo.c,v 1.12 2005/02/06 04:43:43 perry Exp $ */
+
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Kenneth Almquist.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)echo.c 8.1 (Berkeley) 5/31/93
+ */
+
+/*
+ * Echo command.
+ *
+ * echo is steeped in tradition - several of them!
+ * netbsd has supported 'echo [-n | -e] args' in spite of -e not being
+ * documented anywhere.
+ * Posix requires that -n be supported, output from strings containing
+ * \ is implementation defined
+ * The Single Unix Spec requires that \ escapes be treated as if -e
+ * were set, but that -n not be treated as an option.
+ * (ksh supports 'echo [-eEn] args', but not -- so that it is actually
+ * impossible to actually output '-n')
+ *
+ * It is suggested that 'printf "%b" "string"' be used to get \ sequences
+ * expanded. printf is now a builtin of netbsd's sh and csh.
+ */
+
+/*
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+#include "shell.h"
+
+
+
+int rtems_shell_main_echo(
+ int argc,
+ char *argv[]
+)
+{
+ char **ap;
+ char *p;
+ char c;
+ int count;
+ int nflag = 0;
+ int eflag = 0;
+
+ ap = argv;
+ if (argc)
+ ap++;
+
+ if ((p = *ap) != NULL) {
+ if (!strcmp(p, "-n")) {
+ nflag = 1;
+ ap++;
+ } else if (!strcmp(p, "-e")) {
+ eflag = 1;
+ ap++;
+ }
+ }
+
+ while ((p = *ap++) != NULL) {
+ while ((c = *p++) != '\0') {
+ if (c == '\\' && eflag) {
+ switch (*p++) {
+ case 'a': c = '\a'; break; /* bell */
+ case 'b': c = '\b'; break;
+ case 'c': return 0; /* exit */
+ case 'e': c = 033; break; /* escape */
+ case 'f': c = '\f'; break;
+ case 'n': c = '\n'; break;
+ case 'r': c = '\r'; break;
+ case 't': c = '\t'; break;
+ case 'v': c = '\v'; break;
+ case '\\': break; /* c = '\\' */
+ case '0':
+ c = 0;
+ count = 3;
+ while (--count >= 0 && (unsigned)(*p - '0') < 8)
+ c = (c << 3) + (*p++ - '0');
+ break;
+ default:
+ /* Output the '/' and char following */
+ p--;
+ break;
+ }
+ }
+ putchar(c);
+ }
+ if (*ap)
+ putchar(' ');
+ }
+ if (! nflag)
+ putchar('\n');
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_ECHO_Command = {
+ "echo", /* name */
+ "echo [args]", /* usage */
+ "misc", /* topic */
+ rtems_shell_main_echo, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/tools/schedsim/shell/shared/main_executing.c b/tools/schedsim/shell/shared/main_executing.c
new file mode 100644
index 0000000000..31b94026b3
--- /dev/null
+++ b/tools/schedsim/shell/shared/main_executing.c
@@ -0,0 +1,42 @@
+/*
+ * Thread Executing Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_executing(
+ int argc,
+ char *argv[]
+)
+{
+ PRINT_EXECUTING();
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_TASK_EXECUTING_Command = {
+ "executing", /* name */
+ "executing", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_executing, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/tools/schedsim/shell/shared/main_heir.c b/tools/schedsim/shell/shared/main_heir.c
new file mode 100644
index 0000000000..a2a6e198ce
--- /dev/null
+++ b/tools/schedsim/shell/shared/main_heir.c
@@ -0,0 +1,42 @@
+/*
+ * Thread Heir Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_heir(
+ int argc,
+ char *argv[]
+)
+{
+ PRINT_HEIR();
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_TASK_HEIR_Command = {
+ "heir", /* name */
+ "heir", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_heir, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/tools/schedsim/shell/shared/main_help.c b/tools/schedsim/shell/shared/main_help.c
new file mode 100644
index 0000000000..1938b1c58e
--- /dev/null
+++ b/tools/schedsim/shell/shared/main_help.c
@@ -0,0 +1,150 @@
+/*
+ * Shell Help Command
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <time.h>
+#include <string.h>
+
+#include "shell.h"
+#include <schedsim_shell.h>
+
+/*
+ * show the help for one command.
+ */
+int rtems_shell_help_cmd(
+ rtems_shell_cmd_t *shell_cmd
+)
+{
+ const char * pc;
+ int col,line;
+
+ printf("%-20.20s - ",shell_cmd->name);
+ col = 14;
+ line = 1;
+ if (shell_cmd->alias) {
+ printf("is an <alias> for command '%s'",shell_cmd->alias->name);
+ } else if (shell_cmd->usage) {
+ pc = shell_cmd->usage;
+ while (*pc) {
+ switch(*pc) {
+ case '\r':
+ break;
+ case '\n':
+ putchar('\n');
+ col = 0;
+ break;
+ default:
+ putchar(*pc);
+ col++;
+ break;
+ }
+ pc++;
+ if (col>78) { /* What daring... 78?*/
+ if (*pc) {
+ putchar('\n');
+ col = 0;
+ }
+ }
+ if (!col && *pc) {
+ printf(" ");
+ col = 12;line++;
+ }
+ }
+ }
+ puts("");
+ return line;
+}
+
+/*
+ * show the help. The first command implemented.
+ * Can you see the header of routine? Known?
+ * The same with all the commands....
+ */
+int rtems_shell_help(
+ int argc,
+ char * argv[]
+)
+{
+ int col,line,arg;
+ rtems_shell_topic_t *topic;
+ rtems_shell_cmd_t * shell_cmd = rtems_shell_first_cmd;
+
+ if (argc<2) {
+ printf("help: ('r' repeat last cmd - 'e' edit last cmd)\n"
+ " TOPIC? The topics are\n");
+ topic = rtems_shell_first_topic;
+ col = 0;
+ while (topic) {
+ if (!col){
+ col = printf(" %s",topic->topic);
+ } else {
+ if ((col+strlen(topic->topic)+2)>78){
+ printf("\n");
+ col = printf(" %s",topic->topic);
+ } else {
+ col+= printf(", %s",topic->topic);
+ }
+ }
+ topic = topic->next;
+ }
+ printf("\n");
+ return 1;
+ }
+ line = 0;
+ for (arg = 1;arg<argc;arg++) {
+ if (line>16) {
+ printf("Press any key to continue...");getchar();
+ printf("\n");
+ line = 0;
+ }
+ topic = rtems_shell_lookup_topic(argv[arg]);
+ if (!topic){
+ if ((shell_cmd = rtems_shell_lookup_cmd(argv[arg])) == NULL) {
+ printf("help: topic or cmd '%s' not found. Try <help> alone for a list\n",
+ argv[arg]);
+ line++;
+ } else {
+ line+= rtems_shell_help_cmd(shell_cmd);
+ }
+ continue;
+ }
+ printf("help: list for the topic '%s'\n",argv[arg]);
+ line++;
+ while (shell_cmd) {
+ if (!strcmp(topic->topic,shell_cmd->topic))
+ line+= rtems_shell_help_cmd(shell_cmd);
+ if (line>16) {
+ printf("Press any key to continue...");
+ getchar();
+ printf("\n");
+ line = 0;
+ }
+ shell_cmd = shell_cmd->next;
+ }
+ }
+ puts("");
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_HELP_Command = {
+ "help", /* name */
+ "help [topic] # list of usage of commands", /* usage */
+ "help", /* topic */
+ rtems_shell_help, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/tools/schedsim/shell/shared/main_rtemsinit.c b/tools/schedsim/shell/shared/main_rtemsinit.c
new file mode 100644
index 0000000000..906aa26663
--- /dev/null
+++ b/tools/schedsim/shell/shared/main_rtemsinit.c
@@ -0,0 +1,43 @@
+/*
+ * Initialize RTEMS Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <schedsim_shell.h>
+
+int rtems_shell_main_rtems_init(
+ int argc,
+ char *argv[]
+)
+{
+ //
+ // Initialize RTEMS
+ //
+ rtems_initialize_data_structures();
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_RTEMS_INIT_Command = {
+ "rtems_init", /* name */
+ "rtems_init", /* usage */
+ "rtems", /* topic */
+ rtems_shell_main_rtems_init, /* command */
+ NULL, /* alias */
+ NULL /* next */
+};
diff --git a/tools/schedsim/shell/shared/main_semcreate.c b/tools/schedsim/shell/shared/main_semcreate.c
new file mode 100644
index 0000000000..1bfd3cd84b
--- /dev/null
+++ b/tools/schedsim/shell/shared/main_semcreate.c
@@ -0,0 +1,122 @@
+/*
+ * Task Create Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define __need_getopt_newlib
+#include <newlib/getopt.h>
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_semaphore_create(
+ int argc,
+ char *argv[]
+)
+{
+ char name[5];
+ rtems_id id;
+ rtems_status_code status;
+ long tmp;
+ rtems_task_priority ceiling;
+ rtems_attribute attr;
+ struct getopt_data getopt_reent;
+ char option;
+ int value;
+
+ 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/tools/schedsim/shell/shared/main_semdelete.c b/tools/schedsim/shell/shared/main_semdelete.c
new file mode 100644
index 0000000000..1bead03235
--- /dev/null
+++ b/tools/schedsim/shell/shared/main_semdelete.c
@@ -0,0 +1,68 @@
+/*
+ * Task Delete Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_semaphore_delete(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ 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/tools/schedsim/shell/shared/main_semflush.c b/tools/schedsim/shell/shared/main_semflush.c
new file mode 100644
index 0000000000..fb656204c9
--- /dev/null
+++ b/tools/schedsim/shell/shared/main_semflush.c
@@ -0,0 +1,67 @@
+/*
+ * Task Delete Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_semaphore_flush(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ 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/tools/schedsim/shell/shared/main_semobtain.c b/tools/schedsim/shell/shared/main_semobtain.c
new file mode 100644
index 0000000000..dc02f9aec9
--- /dev/null
+++ b/tools/schedsim/shell/shared/main_semobtain.c
@@ -0,0 +1,85 @@
+/*
+ * Task Delete Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_semaphore_obtain(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+ long tmp;
+ rtems_interval ticks;
+ Thread_Control *caller;
+
+ /* XXX for now, do not support polling */
+
+ 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/tools/schedsim/shell/shared/main_semrelease.c b/tools/schedsim/shell/shared/main_semrelease.c
new file mode 100644
index 0000000000..26a97abe00
--- /dev/null
+++ b/tools/schedsim/shell/shared/main_semrelease.c
@@ -0,0 +1,67 @@
+/*
+ * Task Delete Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_semaphore_release(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ 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/tools/schedsim/shell/shared/main_taskcreate.c b/tools/schedsim/shell/shared/main_taskcreate.c
new file mode 100644
index 0000000000..5d9eff3277
--- /dev/null
+++ b/tools/schedsim/shell/shared/main_taskcreate.c
@@ -0,0 +1,111 @@
+/*
+ * Task Create Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+rtems_task dummy_task(
+ rtems_task_argument arg
+)
+{
+}
+
+int rtems_shell_main_task_create(
+ int argc,
+ char *argv[]
+)
+{
+ char name[5];
+ rtems_id id;
+ rtems_status_code status;
+ long priority;
+
+ 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/tools/schedsim/shell/shared/main_taskdelete.c b/tools/schedsim/shell/shared/main_taskdelete.c
new file mode 100644
index 0000000000..7eb55e0124
--- /dev/null
+++ b/tools/schedsim/shell/shared/main_taskdelete.c
@@ -0,0 +1,68 @@
+/*
+ * Task Delete Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_task_delete(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ 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/tools/schedsim/shell/shared/main_taskmode.c b/tools/schedsim/shell/shared/main_taskmode.c
new file mode 100644
index 0000000000..b3517d99d3
--- /dev/null
+++ b/tools/schedsim/shell/shared/main_taskmode.c
@@ -0,0 +1,111 @@
+/*
+ * Task Delete Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define __need_getopt_newlib
+#include <newlib/getopt.h>
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+void print_mode(
+ const char *prefix,
+ rtems_mode mode
+)
+{
+ fprintf(
+ stderr,
+ "%sPreemption: %s Timeslicing: %s\n",
+ prefix,
+ ((mode & RTEMS_NO_PREEMPT) ? "no" : "yes"),
+ ((mode & RTEMS_TIMESLICE) ? "yes" : "no")
+ );
+}
+
+int rtems_shell_main_task_mode(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_status_code status;
+ rtems_mode mode;
+ rtems_mode mask;
+ rtems_mode old;
+ struct getopt_data getopt_reent;
+ char option;
+
+ 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/tools/schedsim/shell/shared/main_taskpriority.c b/tools/schedsim/shell/shared/main_taskpriority.c
new file mode 100644
index 0000000000..fbe5073fa1
--- /dev/null
+++ b/tools/schedsim/shell/shared/main_taskpriority.c
@@ -0,0 +1,78 @@
+/*
+ * Task Delete Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_task_priority(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+ unsigned long tmp;
+ rtems_task_priority old;
+ rtems_task_priority new;
+
+ 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[1], &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;
+ }
+
+ printf("Task (0x%08x) Chain Priority from %d to %d\n", id, old, 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/tools/schedsim/shell/shared/main_taskresume.c b/tools/schedsim/shell/shared/main_taskresume.c
new file mode 100644
index 0000000000..426aff8d55
--- /dev/null
+++ b/tools/schedsim/shell/shared/main_taskresume.c
@@ -0,0 +1,68 @@
+/*
+ * Task Delete Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_task_resume(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ 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/tools/schedsim/shell/shared/main_tasksuspend.c b/tools/schedsim/shell/shared/main_tasksuspend.c
new file mode 100644
index 0000000000..f07ebbeb98
--- /dev/null
+++ b/tools/schedsim/shell/shared/main_tasksuspend.c
@@ -0,0 +1,67 @@
+/*
+ * Task Delete Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_task_suspend(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ 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/tools/schedsim/shell/shared/main_taskwakeafter.c b/tools/schedsim/shell/shared/main_taskwakeafter.c
new file mode 100644
index 0000000000..e8e6966595
--- /dev/null
+++ b/tools/schedsim/shell/shared/main_taskwakeafter.c
@@ -0,0 +1,75 @@
+/*
+ * Task Priority Shell Command Implmentation
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include "shell.h"
+#include <rtems/stringto.h>
+#include <schedsim_shell.h>
+#include <rtems/error.h>
+
+int rtems_shell_main_task_wake_after(
+ int argc,
+ char *argv[]
+)
+{
+ rtems_status_code status;
+ rtems_interval ticks;
+ unsigned long tmp;
+ rtems_id self;
+
+ 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/tools/schedsim/shell/shared/schedsim_shell.h b/tools/schedsim/shell/shared/schedsim_shell.h
new file mode 100644
index 0000000000..4b23d1c42d
--- /dev/null
+++ b/tools/schedsim/shell/shared/schedsim_shell.h
@@ -0,0 +1,56 @@
+/*
+ * BASED UPON SOURCE IN RTEMS, MODIFIED FOR SIMULATOR
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifndef __SCHEDSIM_SHELL_h
+#define __SCHEDSIM_SHELL_h
+
+#include <rtems.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+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/tools/schedsim/shell/shared/shell_cmdset.c b/tools/schedsim/shell/shared/shell_cmdset.c
new file mode 100644
index 0000000000..83330b088a
--- /dev/null
+++ b/tools/schedsim/shell/shared/shell_cmdset.c
@@ -0,0 +1,229 @@
+/*
+ * Shell Command Set Management
+ *
+ * Author:
+ * WORK: fernando.ruiz@ctv.es
+ * HOME: correo@fernando-ruiz.com
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <time.h>
+#include <termios.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <errno.h>
+
+
+#include "shell.h"
+#include <schedsim_shell.h>
+
+/*
+ * Common linked list of shell commands.
+ *
+ * Because the help report is very long, there is a topic for each command.
+ *
+ * Help list the topics
+ * help [topic] list the commands for the topic
+ * help [command] help for the command
+ *
+ */
+
+rtems_shell_cmd_t * rtems_shell_first_cmd;
+rtems_shell_topic_t * rtems_shell_first_topic;
+
+/*
+ * Find the topic from the set of topics registered.
+ */
+rtems_shell_topic_t * rtems_shell_lookup_topic(const char * topic) {
+ rtems_shell_topic_t * shell_topic;
+ shell_topic=rtems_shell_first_topic;
+
+ while (shell_topic) {
+ if (!strcmp(shell_topic->topic,topic))
+ return shell_topic;
+ shell_topic=shell_topic->next;
+ }
+ return (rtems_shell_topic_t *) NULL;
+}
+
+/*
+ * Add a new topic to the list of topics
+ */
+rtems_shell_topic_t * rtems_shell_add_topic(const char * topic) {
+ rtems_shell_topic_t * current,*aux;
+
+ if (!rtems_shell_first_topic) {
+ aux = malloc(sizeof(rtems_shell_topic_t));
+ aux->topic = topic;
+ aux->next = (rtems_shell_topic_t*)NULL;
+ return rtems_shell_first_topic = aux;
+ }
+ current=rtems_shell_first_topic;
+ if (!strcmp(topic,current->topic))
+ return current;
+
+ while (current->next) {
+ if (!strcmp(topic,current->next->topic))
+ return current->next;
+ current=current->next;
+ }
+ aux = malloc(sizeof(rtems_shell_topic_t));
+ aux->topic = topic;
+ aux->next = (rtems_shell_topic_t*)NULL;
+ current->next = aux;
+ return aux;
+}
+
+/*
+ * Find the command in the set
+ */
+rtems_shell_cmd_t * rtems_shell_lookup_cmd(const char * cmd) {
+ rtems_shell_cmd_t * shell_cmd;
+ shell_cmd=rtems_shell_first_cmd;
+ while (shell_cmd) {
+ if (!strcmp(shell_cmd->name,cmd)) return shell_cmd;
+ shell_cmd=shell_cmd->next;
+ };
+ return (rtems_shell_cmd_t *) NULL;
+}
+
+/*
+ * Add a command structure to the set of known commands
+ */
+rtems_shell_cmd_t *rtems_shell_add_cmd_struct(
+ rtems_shell_cmd_t *shell_cmd
+)
+{
+ rtems_shell_cmd_t *shell_pvt;
+
+ shell_pvt = rtems_shell_first_cmd;
+ while (shell_pvt) {
+ if (strcmp(shell_pvt->name, shell_cmd->name) == 0)
+ return NULL;
+ shell_pvt = shell_pvt->next;
+ }
+
+ if ( !rtems_shell_first_cmd ) {
+ rtems_shell_first_cmd = shell_cmd;
+ } else {
+ shell_pvt = rtems_shell_first_cmd;
+ while (shell_pvt->next)
+ shell_pvt = shell_pvt->next;
+ shell_pvt->next = shell_cmd;
+ }
+ rtems_shell_add_topic( shell_cmd->topic );
+ return shell_cmd;
+}
+
+/*
+ * Add a command as a set of arguments to the set and
+ * allocate the command structure on the fly.
+ */
+rtems_shell_cmd_t * rtems_shell_add_cmd(
+ const char *name,
+ const char *topic,
+ const char *usage,
+ rtems_shell_command_t command
+)
+{
+ rtems_shell_cmd_t *shell_cmd = NULL;
+ char *my_name = NULL;
+ char *my_topic = NULL;
+ char *my_usage = NULL;
+
+ /* Reject empty commands */
+ if (name == NULL || command == NULL) {
+ return NULL;
+ }
+
+ /* Allocate command stucture */
+ shell_cmd = (rtems_shell_cmd_t *) malloc(sizeof(rtems_shell_cmd_t));
+ if (shell_cmd == NULL) {
+ return NULL;
+ }
+
+ /* Allocate strings */
+ my_name = strdup(name);
+ my_topic = strdup(topic);
+ my_usage = strdup(usage);
+
+ /* Assign values */
+ shell_cmd->name = my_name;
+ shell_cmd->topic = my_topic;
+ shell_cmd->usage = my_usage;
+ shell_cmd->command = command;
+ shell_cmd->alias = NULL;
+ shell_cmd->next = NULL;
+
+ if (rtems_shell_add_cmd_struct(shell_cmd) == NULL) {
+ /* Something is wrong, free allocated resources */
+ free(my_usage);
+ free(my_topic);
+ free(my_name);
+ free(shell_cmd);
+
+ return NULL;
+ }
+
+ return shell_cmd;
+}
+
+
+void rtems_shell_initialize_command_set(void)
+{
+ rtems_shell_cmd_t **c;
+ rtems_shell_alias_t **a;
+
+ for ( c = rtems_shell_Initial_commands ; *c ; c++ ) {
+ rtems_shell_add_cmd_struct( *c );
+ }
+
+ for ( a = rtems_shell_Initial_aliases ; *a ; a++ ) {
+ rtems_shell_alias_cmd( (*a)->name, (*a)->alias );
+ }
+}
+
+/* ----------------------------------------------- *
+ * you can make an alias for every command.
+ * ----------------------------------------------- */
+rtems_shell_cmd_t *rtems_shell_alias_cmd(
+ const char *cmd,
+ const char *alias
+)
+{
+ rtems_shell_cmd_t *shell_cmd, *shell_aux;
+
+ shell_aux = (rtems_shell_cmd_t *) NULL;
+
+ if (alias) {
+ shell_aux = rtems_shell_lookup_cmd(alias);
+ if (shell_aux != NULL) {
+ return NULL;
+ }
+ shell_cmd = rtems_shell_lookup_cmd(cmd);
+ if (shell_cmd != NULL) {
+ shell_aux = rtems_shell_add_cmd(
+ alias,
+ shell_cmd->topic,
+ shell_cmd->usage,
+ shell_cmd->command
+ );
+ if (shell_aux)
+ shell_aux->alias = shell_cmd;
+ }
+ }
+ return shell_aux;
+}
diff --git a/tools/schedsim/shell/shared/shell_makeargs.c b/tools/schedsim/shell/shared/shell_makeargs.c
new file mode 100644
index 0000000000..e959138249
--- /dev/null
+++ b/tools/schedsim/shell/shared/shell_makeargs.c
@@ -0,0 +1,68 @@
+/*
+ * Split string into argc/argv style argument list
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <ctype.h>
+
+int rtems_shell_make_args(
+ char *commandLine,
+ int *argc_p,
+ char **argv_p,
+ int max_args
+)
+{
+ int argc;
+ char *ch;
+ int status = 0;
+
+ argc = 0;
+ ch = commandLine;
+
+ while ( *ch ) {
+
+ while ( isspace((unsigned char)*ch) ) ch++;
+
+ if ( *ch == '\0' )
+ break;
+
+ if ( *ch == '"' ) {
+ argv_p[ argc ] = ++ch;
+ while ( ( *ch != '\0' ) && ( *ch != '"' ) ) ch++;
+ } else {
+ argv_p[ argc ] = ch;
+ while ( ( *ch != '\0' ) && ( !isspace((unsigned char)*ch) ) ) ch++;
+ }
+
+ argc++;
+
+ if ( *ch == '\0' )
+ break;
+
+ *ch++ = '\0';
+
+ if ( argc == (max_args-1) ) {
+ status = -1;
+ break;
+ }
+
+
+ }
+ argv_p[ argc ] = NULL;
+ *argc_p = argc;
+ return status;
+}
+