diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2011-05-17 19:31:12 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2011-05-17 19:31:12 +0000 |
commit | f40778b48660b589278898593c62cf2250d3fbab (patch) | |
tree | 09d84495b8a489f65e58819c8d77ec488da30571 /schedsim/shell/schedsim_smpsimple | |
parent | 2011-05-17 Joel Sherrill <joel.sherrill@oarcorp.com> (diff) | |
download | rtems-schedsim-f40778b48660b589278898593c62cf2250d3fbab.tar.bz2 |
2011-05-17 Joel Sherrill <joel.sherrill@oarcorp.com>
* .cvsignore, ChangeLog, Makefile.am, README, TODO, add_commands.c,
config.c, main_current_cpu.c, main_dispatch.c, main_dump_all_cpus.c,
main_dump_ready_tasks.c, printheir_executing.c, schedsim.cc,
smp_stub.c, wrap_thread_dispatch.c, scenarios/.cvsignore,
scenarios/cpus1_mode.expected, scenarios/cpus1_mode.scen,
scenarios/cpus1_priority.expected, scenarios/cpus1_priority.scen,
scenarios/cpus1_resume_on_primary.expected,
scenarios/cpus1_resume_on_primary.scen,
scenarios/cpus1_suspend_on_primary.expected,
scenarios/cpus1_suspend_on_primary.scen,
scenarios/cpus4_mode_case1.expected, scenarios/cpus4_mode_case1.scen,
scenarios/cpus4_mode_case2.expected, scenarios/cpus4_mode_case2.scen,
scenarios/cpus4_nonpreempt_case1.expected,
scenarios/cpus4_nonpreempt_case1.scen,
scenarios/cpus4_pick_older.expected, scenarios/cpus4_pick_older.scen,
scenarios/cpus4_priority.expected, scenarios/cpus4_priority.scen,
scenarios/cpus4_simple_nopreempt.expected,
scenarios/cpus4_simple_nopreempt.scen,
scenarios/cpus4_simple_preemption.expected,
scenarios/cpus4_simple_preemption.scen,
scenarios/cpus4_suspend_on_all.expected,
scenarios/cpus4_suspend_on_all.scen,
scenarios/cpus4_suspend_on_primary.expected,
scenarios/cpus4_suspend_on_primary.scen,
scenarios/cpus4_suspend_on_secondary.expected,
scenarios/cpus4_suspend_on_secondary.scen: New files.
Diffstat (limited to 'schedsim/shell/schedsim_smpsimple')
44 files changed, 2267 insertions, 0 deletions
diff --git a/schedsim/shell/schedsim_smpsimple/.cvsignore b/schedsim/shell/schedsim_smpsimple/.cvsignore new file mode 100644 index 0000000..282522d --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/schedsim/shell/schedsim_smpsimple/ChangeLog b/schedsim/shell/schedsim_smpsimple/ChangeLog new file mode 100644 index 0000000..f50a2a2 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/ChangeLog @@ -0,0 +1,170 @@ +2011-05-17 Joel Sherrill <joel.sherrill@oarcorp.com> + + * .cvsignore, ChangeLog, Makefile.am, README, TODO, add_commands.c, + config.c, main_current_cpu.c, main_dispatch.c, main_dump_all_cpus.c, + main_dump_ready_tasks.c, printheir_executing.c, schedsim.cc, + smp_stub.c, wrap_thread_dispatch.c, scenarios/.cvsignore, + scenarios/cpus1_mode.expected, scenarios/cpus1_mode.scen, + scenarios/cpus1_priority.expected, scenarios/cpus1_priority.scen, + scenarios/cpus1_resume_on_primary.expected, + scenarios/cpus1_resume_on_primary.scen, + scenarios/cpus1_suspend_on_primary.expected, + scenarios/cpus1_suspend_on_primary.scen, + scenarios/cpus4_mode_case1.expected, scenarios/cpus4_mode_case1.scen, + scenarios/cpus4_mode_case2.expected, scenarios/cpus4_mode_case2.scen, + scenarios/cpus4_nonpreempt_case1.expected, + scenarios/cpus4_nonpreempt_case1.scen, + scenarios/cpus4_pick_older.expected, scenarios/cpus4_pick_older.scen, + scenarios/cpus4_priority.expected, scenarios/cpus4_priority.scen, + scenarios/cpus4_simple_nopreempt.expected, + scenarios/cpus4_simple_nopreempt.scen, + scenarios/cpus4_simple_preemption.expected, + scenarios/cpus4_simple_preemption.scen, + scenarios/cpus4_suspend_on_all.expected, + scenarios/cpus4_suspend_on_all.scen, + scenarios/cpus4_suspend_on_primary.expected, + scenarios/cpus4_suspend_on_primary.scen, + scenarios/cpus4_suspend_on_secondary.expected, + scenarios/cpus4_suspend_on_secondary.scen: New files. + +2011-04-22 Joel Sherrill <joel.sherrill@oarcorp.com> + + * smp_stub.c, scenarios/cpus4_mode_case1.expected, + scenarios/cpus4_mode_case2.expected, + scenarios/cpus4_nonpreempt_case1.expected, + scenarios/cpus4_pick_older.expected, + scenarios/cpus4_priority.expected, + scenarios/cpus4_simple_nopreempt.expected, + scenarios/cpus4_simple_preemption.expected, + scenarios/cpus4_suspend_on_all.expected, + scenarios/cpus4_suspend_on_primary.expected, + scenarios/cpus4_suspend_on_secondary.expected: Builds against latest + changes. + +2011-04-22 Joel Sherrill <joel.sherrill@oarcorp.com> + + * main_dispatch.c, main_dump_all_cpus.c: Builds again and passes all + tests. + +2011-04-20 Joel Sherrill <joel.sherrill@oarcorp.com> + + * config.c, scenarios/cpus1_resume_on_primary.expected, + scenarios/cpus1_suspend_on_primary.expected, + scenarios/cpus4_suspend_on_all.expected, + scenarios/cpus4_suspend_on_primary.expected, + scenarios/cpus4_suspend_on_secondary.expected: Now runs with Simple + SMP Scheduler merged into SuperCore. + +2011-04-20 Joel Sherrill <joel.sherrill@oarcorp.com> + + * Makefile: Begin to merge Scheduler Simple SMP to score. + * schedulersimplesmpblock.c, schedulersimplesmpschedule.c, + schedulersimplesmpunblock.c, rtems/score/schedulersimplesmp.h: + Removed. + +2011-04-20 Joel Sherrill <joel.sherrill@oarcorp.com> + + * scenarios/cpus4_pick_older.expected: Fix test name. + +2011-04-19 Joel Sherrill <joel.sherrill@oarcorp.com> + + * schedulersimplesmpschedule.c, scenarios/cpus4_mode_case1.expected, + scenarios/cpus4_mode_case1.scen, + scenarios/cpus4_nonpreempt_case1.expected, + scenarios/cpus4_nonpreempt_case1.scen: Preemptible tasks favored over + non-preemptible. + +2011-04-19 Joel Sherrill <joel.sherrill@oarcorp.com> + + * scenarios/cpus4_mode_case2.expected: New file. + +2011-04-19 Joel Sherrill <joel.sherrill@oarcorp.com> + + * TODO: Add test cases that work. + +2011-04-19 Joel Sherrill <joel.sherrill@oarcorp.com> + + * scenarios/cpus1_priority.expected, scenarios/cpus1_priority.scen, + scenarios/cpus1_resume_on_primary.expected, + scenarios/cpus1_resume_on_primary.scen: Add mode test cases. Fix use + of task_mode. + * scenarios/cpus1_mode.expected, scenarios/cpus1_mode.scen, + scenarios/cpus4_mode_case1.expected, scenarios/cpus4_mode_case1.scen, + scenarios/cpus4_mode_case2.scen: New files. + +2011-04-19 Joel Sherrill <joel.sherrill@oarcorp.com> + + * TODO, run_scenarios: New test case. + * scenarios/cpus4_suspend_on_all.expected, + scenarios/cpus4_suspend_on_all.scen: New files. + +2011-04-19 Joel Sherrill <joel.sherrill@oarcorp.com> + + * TODO, schedulersimplesmpschedule.c, + scenarios/cpus4_simple_nopreempt.expected, + scenarios/cpus4_simple_nopreempt.scen: More test cases working. + * scenarios/cpus4_nonpreempt_case1.expected, + scenarios/cpus4_nonpreempt_case1.scen, + scenarios/cpus4_priority.expected, scenarios/cpus4_priority.scen: New + files. + +2011-04-19 Joel Sherrill <joel.sherrill@oarcorp.com> + + * TODO, schedulersimplesmpschedule.c: Now behaves like Deterministic + Priority Scheduler on priority lowering. + +2011-04-19 Joel Sherrill <joel.sherrill@oarcorp.com> + + * TODO, run_scenarios, schedulersimplesmpschedule.c: Priority changes + on single CPU works like regular scheduler. + * scenarios/.cvsignore, scenarios/cpus1_priority.expected, + scenarios/cpus1_priority.scen: New files. + +2011-04-19 Joel Sherrill <joel.sherrill@oarcorp.com> + + * run_scenarios, scenarios/cpus1_resume_on_primary.expected, + scenarios/cpus1_suspend_on_primary.expected, + scenarios/cpus4_picker_older.expected, + scenarios/cpus4_simple_nopreempt.expected, + scenarios/cpus4_simple_preemption.expected, + scenarios/cpus4_suspend_on_primary.expected, + scenarios/cpus4_suspend_on_secondary.expected: All pass again after + placing them in a subdirectory. + +2011-04-18 Joel Sherrill <joel.sherrill@oarcorp.com> + + * .cvsignore, TODO, main_current_cpu.c, main_dispatch.c, + main_dump_all_cpus.c, main_dump_ready_tasks.c, + scen_cpus1_resume_on_primary, scen_cpus1_suspend_on_primary, + scen_cpus4_picker_older, scen_cpus4_simple_nopreempt, + scen_cpus4_suspend_on_secondary, schedsim.cc: Six scenrarios run + correctly. Added script to automate checking again. + * run_scenarios, scen_cpus1_resume_on_primary.expected, + scen_cpus1_suspend_on_primary.expected, + scen_cpus4_simple_nopreempt.expected, + scen_cpus4_simple_preemption.expected, + scen_cpus4_suspend_on_primary.expected, + scen_cpus4_suspend_on_secondary.expected: New files. + +2011-04-15 Joel Sherrill <joel.sherrill@oarcorp.com> + + * Makefile, add_commands.c, getcpuid.c, schedsim.cc, + schedulersimplesmpschedule.c, schedulersimplesmpunblock.c, + smp_stub.c, rtems/score/schedulersimplesmp.h: Now supports the first + scenarios for initial version of Simple SMP scheduler. Not all pass. + * .cvsignore, TODO, main_current_cpu.c, main_dispatch.c, + scen_cpus1_resume_on_primary, scen_cpus1_suspend_on_primary, + scen_cpus4_picker_older, scen_cpus4_simple_nopreempt, + scen_cpus4_simple_preemption, scen_cpus4_suspend_on_primary, + scen_cpus4_suspend_on_secondary, schedulersimplesmpblock.c: New + files. + +2011-04-12 Joel Sherrill <joel.sherrill@oarcorp.com> + + * ChangeLog, Makefile, README, add_commands.c, config.c, debugio.c, + example_script, getcpuid.c, main_dump_all_cpus.c, + main_dump_ready_tasks.c, printheir_executing.c, schedsim.cc, + schedulersimplesmpschedule.c, schedulersimplesmpunblock.c, + smp_stub.c, wrap_thread_dispatch.c, rtems/score/schedulersimplesmp.h: + New files. + diff --git a/schedsim/shell/schedsim_smpsimple/Makefile.am b/schedsim/shell/schedsim_smpsimple/Makefile.am new file mode 100644 index 0000000..b2c0cbf --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/Makefile.am @@ -0,0 +1,35 @@ +## +## $Id$ +## + +bin_PROGRAMS = schedsim +schedsim_SOURCES = add_commands.c config.c \ + main_current_cpu.c main_dispatch.c main_dump_all_cpus.c \ + main_dump_ready_tasks.c printheir_executing.c smp_stub.c \ + wrap_thread_dispatch.c schedsim.cc + +cpukitdir=@rtems_srcdir@/cpukit +schedsim_CPPFLAGS = -I$(top_builddir)/score/include +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_smpsimple/README b/schedsim/shell/schedsim_smpsimple/README new file mode 100644 index 0000000..9090c3f --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/README @@ -0,0 +1,8 @@ +# +# $Id$ +# + +This is a scheduler simulator instance for developing the +Simple SMP Scheduler. Once this scheduler is completed, +it will be integrated into the proper locations of the +main RTEMS development tree. diff --git a/schedsim/shell/schedsim_smpsimple/TODO b/schedsim/shell/schedsim_smpsimple/TODO new file mode 100644 index 0000000..63800e5 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/TODO @@ -0,0 +1,22 @@ +# +# $Id$ +# + +Working As of 19 April 2011 +=========================== +cpus1_mode +cpus1_priority +cpus1_resume_on_primary +cpus1_suspend_on_primary + +cpus4_mode_case1 +cpus4_mode_case2 +cpus4_nonpreempt_case1 +cpus4_picker_older +cpus4_priority +cpus4_simple_nopreempt +cpus4_simple_preemption +cpus4_suspend_on_all +cpus4_suspend_on_primary +cpus4_suspend_on_secondary + diff --git a/schedsim/shell/schedsim_smpsimple/add_commands.c b/schedsim/shell/schedsim_smpsimple/add_commands.c new file mode 100644 index 0000000..d41b314 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/add_commands.c @@ -0,0 +1,63 @@ +/* + * COPYRIGHT (c) 1989-2011. + * 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 <assert.h> + +#include "shell.h" +#include "rtems_sched.h" + +extern int main_dump_ready_tasks(int argc, char **argv); +extern int main_dump_all_cpus(int argc, char **argv); +extern int main_set_current_cpu(int argc, char **argv); +extern int main_dispatch(int argc, char **argv); + +void add_commands(void) +{ + rtems_shell_cmd_t *cmd; + + cmd = rtems_shell_add_cmd( + "ready_tasks", + "rtems", + "no args", + main_dump_ready_tasks + ); + assert( cmd ); + + cmd = rtems_shell_add_cmd( + "cpus", + "rtems", + "no args", + main_dump_all_cpus + ); + assert( cmd ); + + cmd = rtems_shell_add_cmd( + "current_cpu", + "rtems", + "number", + main_set_current_cpu + ); + assert( cmd ); + + cmd = rtems_shell_add_cmd( + "dispatch", + "rtems", + "", + main_dispatch + ); + assert( cmd ); + +} diff --git a/schedsim/shell/schedsim_smpsimple/config.c b/schedsim/shell/schedsim_smpsimple/config.c new file mode 100644 index 0000000..8dfcd53 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/config.c @@ -0,0 +1,15 @@ +/* + * $Id$ + */ + +#include <rtems.h> + +#define CONFIGURE_INIT +#define CONFIGURE_MAXIMUM_TASKS 1000 +#define CONFIGURE_MAXIMUM_SEMAPHORES 1000 + +#define CONFIGURE_SMP_APPLICATION +#define CONFIGURE_SMP_MAXIMUM_PROCESSORS 4 + +#include <rtems/confdefs.h> + diff --git a/schedsim/shell/schedsim_smpsimple/main_current_cpu.c b/schedsim/shell/schedsim_smpsimple/main_current_cpu.c new file mode 100644 index 0000000..cb8ceb4 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/main_current_cpu.c @@ -0,0 +1,48 @@ +/* + * COPYRIGHT (c) 1989-2011. + * 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" + +#include <rtems.h> +#include <rtems/bspsmp.h> +#include <rtems/score/percpu.h> +#include <rtems/score/schedulerpriority.h> + +extern uint32_t Schedsim_Current_cpu; + +int main_set_current_cpu(int argc, char **argv) +{ + long cpu; + + if ( argc >= 2 ) { + if ( rtems_string_to_long(argv[1], &cpu, NULL, 0) ) { + printf( "CPU argument (%s) is not a number\n", argv[1] ); + return -1; + } + printf( + "Changing current CPU from %d to %d\n", + Schedsim_Current_cpu, + cpu + ); + Schedsim_Current_cpu = cpu; + } else { + printf( "Current CPU is %d\n", Schedsim_Current_cpu ); + } + + return 0; +} diff --git a/schedsim/shell/schedsim_smpsimple/main_dispatch.c b/schedsim/shell/schedsim_smpsimple/main_dispatch.c new file mode 100644 index 0000000..22cea2b --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/main_dispatch.c @@ -0,0 +1,45 @@ +/* + * COPYRIGHT (c) 1989-2011. + * 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" + +#include <rtems.h> +#include <rtems/bspsmp.h> +#include <rtems/score/percpu.h> +#include <rtems/score/smp.h> +#include <rtems/score/schedulersimplesmp.h> + +extern uint32_t Schedsim_Current_cpu; + +int main_dispatch(int argc, char **argv) +{ + uint32_t cpu; + uint32_t current_cpu; + + current_cpu = Schedsim_Current_cpu; + for ( cpu=0 ; cpu < _SMP_Processor_count ; cpu++ ) { + if ( _Per_CPU_Information[cpu].dispatch_necessary ) { + printf( "=== Invoke Thread Dispatch on CPU %d\n", cpu ); + Schedsim_Current_cpu = cpu; + _Thread_Dispatch(); + } + } + + Schedsim_Current_cpu = current_cpu; + return 0; +} diff --git a/schedsim/shell/schedsim_smpsimple/main_dump_all_cpus.c b/schedsim/shell/schedsim_smpsimple/main_dump_all_cpus.c new file mode 100644 index 0000000..06812d2 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/main_dump_all_cpus.c @@ -0,0 +1,56 @@ +/* + * COPYRIGHT (c) 1989-2011. + * 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" + +// #define __RTEMS_VIOLATE_KERNEL_VISIBILITY__ +#include <rtems.h> +#include <rtems/bspsmp.h> +#include <rtems/score/percpu.h> +#include <rtems/score/smp.h> +#include <rtems/score/schedulerpriority.h> + +int main_dump_all_cpus(int argc, char **argv) +{ + uint32_t cpu; + Thread_Control *h; + Thread_Control *i; + Thread_Control *e; + + printf( + "=== CPU Status\n" + " EXECUTING / HEIR / IDLE / " + " SWITCH NEEDED\n" + ); + for ( cpu=0 ; cpu < _SMP_Processor_count ; cpu++ ) { + e = _Per_CPU_Information[cpu].executing; + h = _Per_CPU_Information[cpu].heir; + i = _Per_CPU_Information[cpu].idle; + printf( + " CPU %d: 0x%08x @%3ld / 0x%08x @%3ld / 0x%08x @%3ld %s\n", + cpu, + e->Object.id, (long) e->current_priority, + h->Object.id, (long) h->current_priority, + i->Object.id, (long) i->current_priority, + ((_Per_CPU_Information[cpu].dispatch_necessary) ? "true" : "false") + ); + } + printf( "=== End of Ready Set of Threads\n" ); + + return 0; +} diff --git a/schedsim/shell/schedsim_smpsimple/main_dump_ready_tasks.c b/schedsim/shell/schedsim_smpsimple/main_dump_ready_tasks.c new file mode 100644 index 0000000..8b4a110 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/main_dump_ready_tasks.c @@ -0,0 +1,42 @@ +/* + * COPYRIGHT (c) 1989-2011. + * 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" + +#include <rtems/score/schedulerpriority.h> + +int main_dump_ready_tasks(int argc, char **argv) +{ + Chain_Control *chain; + Chain_Node *n; + Thread_Control *t; + + printf( "=== Ready Set of Threads\n" ); + chain = (Chain_Control *)_Scheduler.information; + for (n = _Chain_First( chain ); !_Chain_Is_tail(chain, n); n = n->next) { + t = (Thread_Control *)n; + printf( + " 0x%08x priority=%ld\n", + t->Object.id, + (long) t->current_priority + ); + } + printf( "=== End of Ready Set of Threads\n" ); + + return 0; +} diff --git a/schedsim/shell/schedsim_smpsimple/printheir_executing.c b/schedsim/shell/schedsim_smpsimple/printheir_executing.c new file mode 100644 index 0000000..b0855d3 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/printheir_executing.c @@ -0,0 +1,31 @@ +/* + * printheir_executing + * + * COPYRIGHT (c) 1989-2010. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#include <stdio.h> +#include <rtems.h> + +void PRINT_EXECUTING() { + printf( + " Thread Executing: 0x%08x priority=%ld\n", + _Thread_Executing->Object.id, + (long) _Thread_Executing->current_priority + ); +} + +void PRINT_HEIR() { + printf( + " Thread Heir: 0x%08x priority=%ld\n", + _Thread_Heir->Object.id, + (long) _Thread_Heir->current_priority + ); +} diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/.cvsignore b/schedsim/shell/schedsim_smpsimple/scenarios/.cvsignore new file mode 100644 index 0000000..7de0b67 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/.cvsignore @@ -0,0 +1 @@ +*.output diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_mode.expected b/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_mode.expected new file mode 100644 index 0000000..34ad78c --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_mode.expected @@ -0,0 +1,42 @@ +Script File : scenarios/cpus1_mode.scen +verbose : 1 +==> 1: # +==> 2: # Check increasing and decrease priority self with no change +==> 3: # +==> 4: rtems_init 1 + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x09010001 priority=255 +==> 5: task_create -p smp1 5 +Creating task with: Preemption: no Timeslicing: no +Task (smp1) created: id=0x0a010001, priority=5 +Task (smp1) starting: id=0x0a010001, priority=5 + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +==> 6: # GOAL: 0x0a010001 is heir and executing on CPU 0 +==> 7: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false +=== End of Ready Set of Threads +==> 8: task_create smp2 4 +Creating task with: Preemption: yes Timeslicing: no +Task (smp2) created: id=0x0a010002, priority=4 +Task (smp2) starting: id=0x0a010002, priority=4 + Thread Heir: 0x0a010002 priority=4 +==> 9: # GOAL: 0x0a010001 is executing and 0x0a010002 is heir on CPU 0 +==> 10: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010002 @ 4 / 0x09010001 @255 false +=== End of Ready Set of Threads +==> 11: +==> 12: task_mode -P + Thread Executing: 0x0a010002 priority=4 +Previous Mode: Preemption: no Timeslicing: no +Current Mode: Preemption: yes Timeslicing: no +==> 13: # GOAL: 0x0a010002 is heir and executing on CPU 0 +==> 14: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010002 @ 4 / 0x0a010002 @ 4 / 0x09010001 @255 false +=== End of Ready Set of Threads diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_mode.scen b/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_mode.scen new file mode 100644 index 0000000..21de2c7 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_mode.scen @@ -0,0 +1,14 @@ +# +# Check increasing and decrease priority self with no change +# +rtems_init 1 +task_create -p smp1 5 +# GOAL: 0x0a010001 is heir and executing on CPU 0 +cpus +task_create smp2 4 +# GOAL: 0x0a010001 is executing and 0x0a010002 is heir on CPU 0 +cpus + +task_mode -P +# GOAL: 0x0a010002 is heir and executing on CPU 0 +cpus diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_priority.expected b/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_priority.expected new file mode 100644 index 0000000..4047709 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_priority.expected @@ -0,0 +1,69 @@ +Script File : scenarios/cpus1_priority.scen +verbose : 1 +==> 1: # +==> 2: # Check increasing and decrease priority self with no change +==> 3: # +==> 4: rtems_init 1 + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x09010001 priority=255 +==> 5: task_create smp1 5 +Creating task with: Preemption: yes Timeslicing: no +Task (smp1) created: id=0x0a010001, priority=5 +Task (smp1) starting: id=0x0a010001, priority=5 + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +==> 6: task_create smp2 8 +Creating task with: Preemption: yes Timeslicing: no +Task (smp2) created: id=0x0a010002, priority=8 +Task (smp2) starting: id=0x0a010002, priority=8 +==> 7: dispatch +==> 8: # GOAL: 0x0a010001 is heir and executing on CPU 0 +==> 9: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false +=== End of Ready Set of Threads +==> 10: +==> 11: task_priority smp1 4 +Task (0x0a010001) Change Priority from 5 to 4 +==> 12: dispatch +==> 13: # GOAL: 0x0a010001 is still heir and executing on CPU 0 +==> 14: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 4 / 0x0a010001 @ 4 / 0x09010001 @255 false +=== End of Ready Set of Threads +==> 15: +==> 16: task_priority smp1 7 +Task (0x0a010001) Change Priority from 4 to 7 +==> 17: dispatch +==> 18: # GOAL: 0x0a010001 is still heir and executing on CPU 0 +==> 19: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 7 / 0x0a010001 @ 7 / 0x09010001 @255 false +=== End of Ready Set of Threads +==> 20: +==> 21: task_priority smp1 8 + Thread Heir: 0x0a010002 priority=8 + Thread Executing: 0x0a010002 priority=8 +Task (0x0a010001) Change Priority from 7 to 8 +==> 22: dispatch +==> 23: # GOAL: 0x0a010002 is now heir and executing on CPU 0 +==> 24: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010002 @ 8 / 0x0a010002 @ 8 / 0x09010001 @255 false +=== End of Ready Set of Threads +==> 25: +==> 26: task_priority smp1 5 + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +Task (0x0a010001) Change Priority from 8 to 5 +==> 27: dispatch +==> 28: # GOAL: 0x0a010001 is now heir and executing on CPU 0 +==> 29: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false +=== End of Ready Set of Threads diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_priority.scen b/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_priority.scen new file mode 100644 index 0000000..924efc8 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_priority.scen @@ -0,0 +1,29 @@ +# +# Check increasing and decrease priority self with no change +# +rtems_init 1 +task_create smp1 5 +task_create smp2 8 +dispatch +# GOAL: 0x0a010001 is heir and executing on CPU 0 +cpus + +task_priority smp1 4 +dispatch +# GOAL: 0x0a010001 is still heir and executing on CPU 0 +cpus + +task_priority smp1 7 +dispatch +# GOAL: 0x0a010001 is still heir and executing on CPU 0 +cpus + +task_priority smp1 8 +dispatch +# GOAL: 0x0a010002 is now heir and executing on CPU 0 +cpus + +task_priority smp1 5 +dispatch +# GOAL: 0x0a010001 is now heir and executing on CPU 0 +cpus diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_resume_on_primary.expected b/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_resume_on_primary.expected new file mode 100644 index 0000000..36328d2 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_resume_on_primary.expected @@ -0,0 +1,57 @@ +Script File : scenarios/cpus1_resume_on_primary.scen +verbose : 1 +==> 1: # +==> 2: # Check suspending self, then resuming on primary CPU +==> 3: # +==> 4: rtems_init 1 + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x09010001 priority=255 +==> 5: task_create smp1 5 +Creating task with: Preemption: yes Timeslicing: no +Task (smp1) created: id=0x0a010001, priority=5 +Task (smp1) starting: id=0x0a010001, priority=5 + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +==> 6: dispatch +==> 7: # GOAL: 0x0a010001 is heir and executing on CPU 0 +==> 8: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false +=== End of Ready Set of Threads +==> 9: # suspend running task +==> 10: task_suspend smp1 +Suspending task (0x0a010001) + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x09010001 priority=255 +==> 11: # GOAL: 0x09010001 is heir and executing on CPU 0 +==> 12: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x09010001 @255 / 0x09010001 @255 / 0x09010001 @255 false +=== End of Ready Set of Threads +==> 13: dispatch +==> 14: # GOAL: 0x09010001 is heir and executing on CPU 0 +==> 15: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x09010001 @255 / 0x09010001 @255 / 0x09010001 @255 false +=== End of Ready Set of Threads +==> 16: # resume suspended task +==> 17: task_resume smp1 +Resuming task (0x0a010001) + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +==> 18: # GOAL: 0x0a010001 is heir and executing on CPU 0 +==> 19: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false +=== End of Ready Set of Threads +==> 20: dispatch +==> 21: # GOAL: 0x0a010001 is heir and executing on CPU 0 +==> 22: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false +=== End of Ready Set of Threads diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_resume_on_primary.scen b/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_resume_on_primary.scen new file mode 100644 index 0000000..d2df3a8 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_resume_on_primary.scen @@ -0,0 +1,22 @@ +# +# Check suspending self, then resuming on primary CPU +# +rtems_init 1 +task_create smp1 5 +dispatch +# GOAL: 0x0a010001 is heir and executing on CPU 0 +cpus +# suspend running task +task_suspend smp1 +# GOAL: 0x09010001 is heir and executing on CPU 0 +cpus +dispatch +# GOAL: 0x09010001 is heir and executing on CPU 0 +cpus +# resume suspended task +task_resume smp1 +# GOAL: 0x0a010001 is heir and executing on CPU 0 +cpus +dispatch +# GOAL: 0x0a010001 is heir and executing on CPU 0 +cpus diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_suspend_on_primary.expected b/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_suspend_on_primary.expected new file mode 100644 index 0000000..5844723 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_suspend_on_primary.expected @@ -0,0 +1,37 @@ +Script File : scenarios/cpus1_suspend_on_primary.scen +verbose : 1 +==> 1: # +==> 2: # Check blocking self on primary CPU +==> 3: # +==> 4: rtems_init 1 + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x09010001 priority=255 +==> 5: task_create smp1 5 +Creating task with: Preemption: yes Timeslicing: no +Task (smp1) created: id=0x0a010001, priority=5 +Task (smp1) starting: id=0x0a010001, priority=5 + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +==> 6: dispatch +==> 7: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false +=== End of Ready Set of Threads +==> 8: # GOAL: 0x0a010001 is heir and executing on CPU 0 +==> 9: task_suspend SELF +Suspending task (0x0a010001) + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x09010001 priority=255 +==> 10: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x09010001 @255 / 0x09010001 @255 / 0x09010001 @255 false +=== End of Ready Set of Threads +==> 11: dispatch +==> 12: # GOAL: 0x09010001 is heir and executing on CPU 0 +==> 13: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x09010001 @255 / 0x09010001 @255 / 0x09010001 @255 false +=== End of Ready Set of Threads diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_suspend_on_primary.scen b/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_suspend_on_primary.scen new file mode 100644 index 0000000..a4db578 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus1_suspend_on_primary.scen @@ -0,0 +1,13 @@ +# +# Check blocking self on primary CPU +# +rtems_init 1 +task_create smp1 5 +dispatch +cpus +# GOAL: 0x0a010001 is heir and executing on CPU 0 +task_suspend SELF +cpus +dispatch +# GOAL: 0x09010001 is heir and executing on CPU 0 +cpus diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_mode_case1.expected b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_mode_case1.expected new file mode 100644 index 0000000..d3d4404 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_mode_case1.expected @@ -0,0 +1,87 @@ +Script File : scenarios/cpus4_mode_case1.scen +verbose : 1 +==> 1: # +==> 2: # Show how having a non-preemptive task can create a +==> 3: # priority inversion and changing the mode to preemptive +==> 4: # resolves it. +==> 5: # +==> 6: rtems_init 4 + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x09010001 priority=255 +==> 7: task_create -p smp1 5 +Creating task with: Preemption: no Timeslicing: no +Task (smp1) created: id=0x0a010001, priority=5 +Task (smp1) starting: id=0x0a010001, priority=5 + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +==> 8: task_create smp2 5 +Creating task with: Preemption: yes Timeslicing: no +Task (smp2) created: id=0x0a010002, priority=5 +Task (smp2) starting: id=0x0a010002, priority=5 +==> 9: task_create smp3 5 +Creating task with: Preemption: yes Timeslicing: no +Task (smp3) created: id=0x0a010003, priority=5 +Task (smp3) starting: id=0x0a010003, priority=5 +==> 10: task_create smp4 5 +Creating task with: Preemption: yes Timeslicing: no +Task (smp4) created: id=0x0a010004, priority=5 +Task (smp4) starting: id=0x0a010004, priority=5 +==> 11: dispatch +=== Invoke Thread Dispatch on CPU 1 + Thread Heir: 0x0a010002 priority=5 + Thread Executing: 0x09010002 priority=255 + Thread Executing: 0x0a010002 priority=5 +=== Invoke Thread Dispatch on CPU 2 + Thread Heir: 0x0a010003 priority=5 + Thread Executing: 0x09010003 priority=255 + Thread Executing: 0x0a010003 priority=5 +=== Invoke Thread Dispatch on CPU 3 + Thread Heir: 0x0a010004 priority=5 + Thread Executing: 0x09010004 priority=255 + Thread Executing: 0x0a010004 priority=5 +==> 12: # GOAL: 0x0a010001 - 0x0a010004 are heir and executing +==> 13: # GOAL: on CPUs 0 - 3 respectively +==> 14: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 5 / 0x0a010002 @ 5 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 5 / 0x0a010003 @ 5 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 5 / 0x0a010004 @ 5 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 15: +==> 16: task_create smp5 3 +Creating task with: Preemption: yes Timeslicing: no + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +Task (smp5) created: id=0x0a010005, priority=3 +Task (smp5) starting: id=0x0a010005, priority=3 +==> 17: dispatch +=== Invoke Thread Dispatch on CPU 1 + Thread Heir: 0x0a010005 priority=3 + Thread Executing: 0x0a010002 priority=5 + Thread Executing: 0x0a010005 priority=3 +==> 18: # GOAL: 0x0a010001, 0x0a010005, 0x0a010003, and 0x0a010004 are heir +==> 19: # GOAL: and executing on CPUs 0 - 3 +==> 20: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false + CPU 1: 0x0a010005 @ 3 / 0x0a010005 @ 3 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 5 / 0x0a010003 @ 5 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 5 / 0x0a010004 @ 5 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 21: +==> 22: task_mode -P +Previous Mode: Preemption: no Timeslicing: no +Current Mode: Preemption: yes Timeslicing: no +==> 23: # GOAL: 0x0a010001, 0x0a010005, 0x0a010003, and 0x0a010004 are heir +==> 24: # GOAL: and executing on CPUs 0 - 3 +==> 25: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false + CPU 1: 0x0a010005 @ 3 / 0x0a010005 @ 3 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 5 / 0x0a010003 @ 5 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 5 / 0x0a010004 @ 5 / 0x09010004 @255 false +=== End of Ready Set of Threads diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_mode_case1.scen b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_mode_case1.scen new file mode 100644 index 0000000..a9f186c --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_mode_case1.scen @@ -0,0 +1,25 @@ +# +# Show how having a non-preemptive task can create a +# priority inversion and changing the mode to preemptive +# resolves it. +# +rtems_init 4 +task_create -p smp1 5 +task_create smp2 5 +task_create smp3 5 +task_create smp4 5 +dispatch +# GOAL: 0x0a010001 - 0x0a010004 are heir and executing +# GOAL: on CPUs 0 - 3 respectively +cpus + +task_create smp5 3 +dispatch +# GOAL: 0x0a010001, 0x0a010005, 0x0a010003, and 0x0a010004 are heir +# GOAL: and executing on CPUs 0 - 3 +cpus + +task_mode -P +# GOAL: 0x0a010001, 0x0a010005, 0x0a010003, and 0x0a010004 are heir +# GOAL: and executing on CPUs 0 - 3 +cpus diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_mode_case2.expected b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_mode_case2.expected new file mode 100644 index 0000000..6b0086f --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_mode_case2.expected @@ -0,0 +1,89 @@ +Script File : scenarios/cpus4_mode_case2.scen +verbose : 1 +==> 1: # +==> 2: # Show how having a non-preemptive task can create a +==> 3: # priority inversion +==> 4: # +==> 5: rtems_init 4 + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x09010001 priority=255 +==> 6: task_create -p smp1 4 +Creating task with: Preemption: no Timeslicing: no +Task (smp1) created: id=0x0a010001, priority=4 +Task (smp1) starting: id=0x0a010001, priority=4 + Thread Heir: 0x0a010001 priority=4 + Thread Executing: 0x0a010001 priority=4 +==> 7: task_create -p smp2 5 +Creating task with: Preemption: no Timeslicing: no +Task (smp2) created: id=0x0a010002, priority=5 +Task (smp2) starting: id=0x0a010002, priority=5 +==> 8: task_create -p smp3 4 +Creating task with: Preemption: no Timeslicing: no +Task (smp3) created: id=0x0a010003, priority=4 +Task (smp3) starting: id=0x0a010003, priority=4 +==> 9: task_create -p smp4 4 +Creating task with: Preemption: no Timeslicing: no +Task (smp4) created: id=0x0a010004, priority=4 +Task (smp4) starting: id=0x0a010004, priority=4 +==> 10: dispatch +=== Invoke Thread Dispatch on CPU 1 + Thread Heir: 0x0a010002 priority=5 + Thread Executing: 0x09010002 priority=255 + Thread Executing: 0x0a010002 priority=5 +=== Invoke Thread Dispatch on CPU 2 + Thread Heir: 0x0a010003 priority=4 + Thread Executing: 0x09010003 priority=255 + Thread Executing: 0x0a010003 priority=4 +=== Invoke Thread Dispatch on CPU 3 + Thread Heir: 0x0a010004 priority=4 + Thread Executing: 0x09010004 priority=255 + Thread Executing: 0x0a010004 priority=4 +==> 11: # GOAL: 0x0a010001 - 0x0a010004 are heir and executing +==> 12: # GOAL: on CPUs 0 - 3 respectively +==> 13: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 4 / 0x0a010001 @ 4 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 5 / 0x0a010002 @ 5 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 4 / 0x0a010003 @ 4 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 4 / 0x0a010004 @ 4 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 14: +==> 15: task_create smp5 3 +Creating task with: Preemption: yes Timeslicing: no + Thread Heir: 0x0a010001 priority=4 + Thread Executing: 0x0a010001 priority=4 +Task (smp5) created: id=0x0a010005, priority=3 +Task (smp5) starting: id=0x0a010005, priority=3 +==> 16: dispatch +==> 17: # GOAL: 0x0a010001 - 0x0a010004 are executing on CPUs 0 - 3. +==> 18: # GOAL: All are also heir EXCEPT 0x0a010005 is heir on CPU 1. +==> 19: # GOAL: **** SHOWS INVERSION - CPU 1 has NO PREEMPT TASK **** +==> 20: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 4 / 0x0a010001 @ 4 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 5 / 0x0a010005 @ 3 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 4 / 0x0a010003 @ 4 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 4 / 0x0a010004 @ 4 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 21: +==> 22: current_cpu 1 +Changing current CPU from 0 to 1 +==> 23: task_mode -P + Thread Heir: 0x0a010005 priority=3 + Thread Executing: 0x0a010002 priority=5 + Thread Executing: 0x0a010005 priority=3 +Previous Mode: Preemption: no Timeslicing: no +Current Mode: Preemption: yes Timeslicing: no +==> 24: dispatch +==> 25: # GOAL: 0x0a010001, 0x0a010005, 0x0a010003, and 0x0a010004 are +==> 26: # GOAL: heir and executing on CPUs 0 - 3 +==> 27: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 4 / 0x0a010001 @ 4 / 0x09010001 @255 false + CPU 1: 0x0a010005 @ 3 / 0x0a010005 @ 3 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 4 / 0x0a010003 @ 4 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 4 / 0x0a010004 @ 4 / 0x09010004 @255 false +=== End of Ready Set of Threads diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_mode_case2.scen b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_mode_case2.scen new file mode 100644 index 0000000..44263e4 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_mode_case2.scen @@ -0,0 +1,27 @@ +# +# Show how having a non-preemptive task can create a +# priority inversion +# +rtems_init 4 +task_create -p smp1 4 +task_create -p smp2 5 +task_create -p smp3 4 +task_create -p smp4 4 +dispatch +# GOAL: 0x0a010001 - 0x0a010004 are heir and executing +# GOAL: on CPUs 0 - 3 respectively +cpus + +task_create smp5 3 +dispatch +# GOAL: 0x0a010001 - 0x0a010004 are executing on CPUs 0 - 3. +# GOAL: All are also heir EXCEPT 0x0a010005 is heir on CPU 1. +# GOAL: **** SHOWS INVERSION - CPU 1 has NO PREEMPT TASK **** +cpus + +current_cpu 1 +task_mode -P +dispatch +# GOAL: 0x0a010001, 0x0a010005, 0x0a010003, and 0x0a010004 are +# GOAL: heir and executing on CPUs 0 - 3 +cpus diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_nonpreempt_case1.expected b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_nonpreempt_case1.expected new file mode 100644 index 0000000..f5069e1 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_nonpreempt_case1.expected @@ -0,0 +1,72 @@ +Script File : scenarios/cpus4_nonpreempt_case1.scen +verbose : 1 +==> 1: # +==> 2: # Show how having a non-preemptive task can create a +==> 3: # priority inversion +==> 4: # +==> 5: rtems_init 4 + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x09010001 priority=255 +==> 6: task_create -p smp1 5 +Creating task with: Preemption: no Timeslicing: no +Task (smp1) created: id=0x0a010001, priority=5 +Task (smp1) starting: id=0x0a010001, priority=5 + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +==> 7: task_create smp2 5 +Creating task with: Preemption: yes Timeslicing: no +Task (smp2) created: id=0x0a010002, priority=5 +Task (smp2) starting: id=0x0a010002, priority=5 +==> 8: task_create smp3 5 +Creating task with: Preemption: yes Timeslicing: no +Task (smp3) created: id=0x0a010003, priority=5 +Task (smp3) starting: id=0x0a010003, priority=5 +==> 9: task_create smp4 5 +Creating task with: Preemption: yes Timeslicing: no +Task (smp4) created: id=0x0a010004, priority=5 +Task (smp4) starting: id=0x0a010004, priority=5 +==> 10: dispatch +=== Invoke Thread Dispatch on CPU 1 + Thread Heir: 0x0a010002 priority=5 + Thread Executing: 0x09010002 priority=255 + Thread Executing: 0x0a010002 priority=5 +=== Invoke Thread Dispatch on CPU 2 + Thread Heir: 0x0a010003 priority=5 + Thread Executing: 0x09010003 priority=255 + Thread Executing: 0x0a010003 priority=5 +=== Invoke Thread Dispatch on CPU 3 + Thread Heir: 0x0a010004 priority=5 + Thread Executing: 0x09010004 priority=255 + Thread Executing: 0x0a010004 priority=5 +==> 11: # GOAL: 0x0a010001 - 0x0a010004 are heir and executing +==> 12: # GOAL: on CPUs 0 - 3 respectively +==> 13: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 5 / 0x0a010002 @ 5 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 5 / 0x0a010003 @ 5 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 5 / 0x0a010004 @ 5 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 14: +==> 15: task_create smp5 3 +Creating task with: Preemption: yes Timeslicing: no + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +Task (smp5) created: id=0x0a010005, priority=3 +Task (smp5) starting: id=0x0a010005, priority=3 +==> 16: dispatch +=== Invoke Thread Dispatch on CPU 1 + Thread Heir: 0x0a010005 priority=3 + Thread Executing: 0x0a010002 priority=5 + Thread Executing: 0x0a010005 priority=3 +==> 17: # GOAL: 0x0a010001, 0x0a010005, 0x0a010003, and 0x0a010004 are heir +==> 18: # GOAL: and executing on CPUs 0 - 3 +==> 19: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false + CPU 1: 0x0a010005 @ 3 / 0x0a010005 @ 3 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 5 / 0x0a010003 @ 5 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 5 / 0x0a010004 @ 5 / 0x09010004 @255 false +=== End of Ready Set of Threads diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_nonpreempt_case1.scen b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_nonpreempt_case1.scen new file mode 100644 index 0000000..92b44bf --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_nonpreempt_case1.scen @@ -0,0 +1,19 @@ +# +# Show how having a non-preemptive task can create a +# priority inversion +# +rtems_init 4 +task_create -p smp1 5 +task_create smp2 5 +task_create smp3 5 +task_create smp4 5 +dispatch +# GOAL: 0x0a010001 - 0x0a010004 are heir and executing +# GOAL: on CPUs 0 - 3 respectively +cpus + +task_create smp5 3 +dispatch +# GOAL: 0x0a010001, 0x0a010005, 0x0a010003, and 0x0a010004 are heir +# GOAL: and executing on CPUs 0 - 3 +cpus diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_pick_older.expected b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_pick_older.expected new file mode 100644 index 0000000..749ae29 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_pick_older.expected @@ -0,0 +1,156 @@ +Script File : scenarios/cpus4_pick_older.scen +verbose : 1 +==> 1: # +==> 2: # Verify we select the oldest task at a priority +==> 3: # +==> 4: rtems_init 4 + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x09010001 priority=255 +==> 5: task_create smp1 3 +Creating task with: Preemption: yes Timeslicing: no +Task (smp1) created: id=0x0a010001, priority=3 +Task (smp1) starting: id=0x0a010001, priority=3 + Thread Heir: 0x0a010001 priority=3 + Thread Executing: 0x0a010001 priority=3 +==> 6: task_create smp2 6 +Creating task with: Preemption: yes Timeslicing: no +Task (smp2) created: id=0x0a010002, priority=6 +Task (smp2) starting: id=0x0a010002, priority=6 +==> 7: task_create smp3 7 +Creating task with: Preemption: yes Timeslicing: no +Task (smp3) created: id=0x0a010003, priority=7 +Task (smp3) starting: id=0x0a010003, priority=7 +==> 8: task_create smp4 8 +Creating task with: Preemption: yes Timeslicing: no +Task (smp4) created: id=0x0a010004, priority=8 +Task (smp4) starting: id=0x0a010004, priority=8 +==> 9: dispatch +=== Invoke Thread Dispatch on CPU 1 + Thread Heir: 0x0a010002 priority=6 + Thread Executing: 0x09010002 priority=255 + Thread Executing: 0x0a010002 priority=6 +=== Invoke Thread Dispatch on CPU 2 + Thread Heir: 0x0a010003 priority=7 + Thread Executing: 0x09010003 priority=255 + Thread Executing: 0x0a010003 priority=7 +=== Invoke Thread Dispatch on CPU 3 + Thread Heir: 0x0a010004 priority=8 + Thread Executing: 0x09010004 priority=255 + Thread Executing: 0x0a010004 priority=8 +==> 10: # GOAL: Tasks 0x0a010001 - 0x0a010004 as heir and executing +==> 11: # GOAL: on CPUs 1 - 4 respectively +==> 12: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 3 / 0x0a010001 @ 3 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 6 / 0x0a010002 @ 6 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 7 / 0x0a010003 @ 7 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 8 / 0x0a010004 @ 8 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 13: +==> 14: task_create smp5 5 +Creating task with: Preemption: yes Timeslicing: no + Thread Heir: 0x0a010001 priority=3 + Thread Executing: 0x0a010001 priority=3 +Task (smp5) created: id=0x0a010005, priority=5 +Task (smp5) starting: id=0x0a010005, priority=5 +==> 15: clock_tick 1 +ClockTick (1) ... +==> 16: dispatch +=== Invoke Thread Dispatch on CPU 3 + Thread Heir: 0x0a010005 priority=5 + Thread Executing: 0x0a010004 priority=8 + Thread Executing: 0x0a010005 priority=5 +==> 17: # GOAL: Tasks 0x0a010001, 0x0a010002, 0x0a010003, and 0x0a010005 are +==> 18: # GOAL: heir and executing on CPUs 1 - 4 respectively +==> 19: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 3 / 0x0a010001 @ 3 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 6 / 0x0a010002 @ 6 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 7 / 0x0a010003 @ 7 / 0x09010003 @255 false + CPU 3: 0x0a010005 @ 5 / 0x0a010005 @ 5 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 20: +==> 21: task_create smp6 5 +Creating task with: Preemption: yes Timeslicing: no + Thread Heir: 0x0a010001 priority=3 + Thread Executing: 0x0a010001 priority=3 +Task (smp6) created: id=0x0a010006, priority=5 +Task (smp6) starting: id=0x0a010006, priority=5 +==> 22: clock_tick 1 +ClockTick (1) ... +==> 23: dispatch +=== Invoke Thread Dispatch on CPU 2 + Thread Heir: 0x0a010006 priority=5 + Thread Executing: 0x0a010003 priority=7 + Thread Executing: 0x0a010006 priority=5 +==> 24: # GOAL: Tasks 0x0a010001, 0x0a010002, 0x0a010006, and 0x0a010005 are +==> 25: # GOAL: heir and executing on CPUs 1 - 4 respectively +==> 26: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 3 / 0x0a010001 @ 3 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 6 / 0x0a010002 @ 6 / 0x09010002 @255 false + CPU 2: 0x0a010006 @ 5 / 0x0a010006 @ 5 / 0x09010003 @255 false + CPU 3: 0x0a010005 @ 5 / 0x0a010005 @ 5 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 27: +==> 28: task_create smp7 5 +Creating task with: Preemption: yes Timeslicing: no + Thread Heir: 0x0a010001 priority=3 + Thread Executing: 0x0a010001 priority=3 +Task (smp7) created: id=0x0a010007, priority=5 +Task (smp7) starting: id=0x0a010007, priority=5 +==> 29: clock_tick 1 +ClockTick (1) ... +==> 30: dispatch +=== Invoke Thread Dispatch on CPU 1 + Thread Heir: 0x0a010007 priority=5 + Thread Executing: 0x0a010002 priority=6 + Thread Executing: 0x0a010007 priority=5 +==> 31: # GOAL: Tasks 0x0a010001, 0x0a010007, 0x0a010006, and 0x0a010005 are +==> 32: # GOAL: heir and executing on CPUs 1 - 4 respectively +==> 33: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 3 / 0x0a010001 @ 3 / 0x09010001 @255 false + CPU 1: 0x0a010007 @ 5 / 0x0a010007 @ 5 / 0x09010002 @255 false + CPU 2: 0x0a010006 @ 5 / 0x0a010006 @ 5 / 0x09010003 @255 false + CPU 3: 0x0a010005 @ 5 / 0x0a010005 @ 5 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 34: +==> 35: # We should pick task smp4 on the 4th core +==> 36: task_create smp8 4 +Creating task with: Preemption: yes Timeslicing: no + Thread Heir: 0x0a010001 priority=3 + Thread Executing: 0x0a010001 priority=3 +Task (smp8) created: id=0x0a010008, priority=4 +Task (smp8) starting: id=0x0a010008, priority=4 +==> 37: # GOAL: Tasks 0x0a010001, 0x0a010007, and 0x0a010006 +==> 38: # GOAL: heir and executing on CPUs 1 - 3 respectively +==> 39: # GOAL: Task 0x0a010005 is executing on CPU 4 +==> 40: # GOAL: Task 0x0a010008 is heir on CPU 4 +==> 41: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 3 / 0x0a010001 @ 3 / 0x09010001 @255 false + CPU 1: 0x0a010007 @ 5 / 0x0a010007 @ 5 / 0x09010002 @255 false + CPU 2: 0x0a010006 @ 5 / 0x0a010006 @ 5 / 0x09010003 @255 false + CPU 3: 0x0a010005 @ 5 / 0x0a010008 @ 4 / 0x09010004 @255 true +=== End of Ready Set of Threads +==> 42: dispatch +=== Invoke Thread Dispatch on CPU 3 + Thread Heir: 0x0a010008 priority=4 + Thread Executing: 0x0a010005 priority=5 + Thread Executing: 0x0a010008 priority=4 +==> 43: # GOAL: Tasks 0x0a010001, 0x0a010007, 0x0a010006, and 0x0a010008 are +==> 44: # GOAL: heir and executing on CPUs 1 - 4 respectively +==> 45: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 3 / 0x0a010001 @ 3 / 0x09010001 @255 false + CPU 1: 0x0a010007 @ 5 / 0x0a010007 @ 5 / 0x09010002 @255 false + CPU 2: 0x0a010006 @ 5 / 0x0a010006 @ 5 / 0x09010003 @255 false + CPU 3: 0x0a010008 @ 4 / 0x0a010008 @ 4 / 0x09010004 @255 false +=== End of Ready Set of Threads diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_pick_older.scen b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_pick_older.scen new file mode 100644 index 0000000..baf55f0 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_pick_older.scen @@ -0,0 +1,45 @@ +# +# Verify we select the oldest task at a priority +# +rtems_init 4 +task_create smp1 3 +task_create smp2 6 +task_create smp3 7 +task_create smp4 8 +dispatch +# GOAL: Tasks 0x0a010001 - 0x0a010004 as heir and executing +# GOAL: on CPUs 1 - 4 respectively +cpus + +task_create smp5 5 +clock_tick 1 +dispatch +# GOAL: Tasks 0x0a010001, 0x0a010002, 0x0a010003, and 0x0a010005 are +# GOAL: heir and executing on CPUs 1 - 4 respectively +cpus + +task_create smp6 5 +clock_tick 1 +dispatch +# GOAL: Tasks 0x0a010001, 0x0a010002, 0x0a010006, and 0x0a010005 are +# GOAL: heir and executing on CPUs 1 - 4 respectively +cpus + +task_create smp7 5 +clock_tick 1 +dispatch +# GOAL: Tasks 0x0a010001, 0x0a010007, 0x0a010006, and 0x0a010005 are +# GOAL: heir and executing on CPUs 1 - 4 respectively +cpus + +# We should pick task smp4 on the 4th core +task_create smp8 4 +# GOAL: Tasks 0x0a010001, 0x0a010007, and 0x0a010006 +# GOAL: heir and executing on CPUs 1 - 3 respectively +# GOAL: Task 0x0a010005 is executing on CPU 4 +# GOAL: Task 0x0a010008 is heir on CPU 4 +cpus +dispatch +# GOAL: Tasks 0x0a010001, 0x0a010007, 0x0a010006, and 0x0a010008 are +# GOAL: heir and executing on CPUs 1 - 4 respectively +cpus diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_priority.expected b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_priority.expected new file mode 100644 index 0000000..942341b --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_priority.expected @@ -0,0 +1,115 @@ +Script File : scenarios/cpus4_priority.scen +verbose : 1 +==> 1: # +==> 2: # Check increasing and decrease priority +==> 3: # +==> 4: rtems_init 4 + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x09010001 priority=255 +==> 5: task_create smp1 5 +Creating task with: Preemption: yes Timeslicing: no +Task (smp1) created: id=0x0a010001, priority=5 +Task (smp1) starting: id=0x0a010001, priority=5 + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +==> 6: task_create smp2 8 +Creating task with: Preemption: yes Timeslicing: no +Task (smp2) created: id=0x0a010002, priority=8 +Task (smp2) starting: id=0x0a010002, priority=8 +==> 7: task_create smp3 8 +Creating task with: Preemption: yes Timeslicing: no +Task (smp3) created: id=0x0a010003, priority=8 +Task (smp3) starting: id=0x0a010003, priority=8 +==> 8: task_create smp4 8 +Creating task with: Preemption: yes Timeslicing: no +Task (smp4) created: id=0x0a010004, priority=8 +Task (smp4) starting: id=0x0a010004, priority=8 +==> 9: task_create smp5 8 +Creating task with: Preemption: yes Timeslicing: no +Task (smp5) created: id=0x0a010005, priority=8 +Task (smp5) starting: id=0x0a010005, priority=8 +==> 10: dispatch +=== Invoke Thread Dispatch on CPU 1 + Thread Heir: 0x0a010002 priority=8 + Thread Executing: 0x09010002 priority=255 + Thread Executing: 0x0a010002 priority=8 +=== Invoke Thread Dispatch on CPU 2 + Thread Heir: 0x0a010003 priority=8 + Thread Executing: 0x09010003 priority=255 + Thread Executing: 0x0a010003 priority=8 +=== Invoke Thread Dispatch on CPU 3 + Thread Heir: 0x0a010004 priority=8 + Thread Executing: 0x09010004 priority=255 + Thread Executing: 0x0a010004 priority=8 +==> 11: # GOAL: 0x0a010001 - 0x0a010004 are heir and executing +==> 12: # GOAL: on CPUs 0 - 3 respectively +==> 13: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 8 / 0x0a010002 @ 8 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 8 / 0x0a010003 @ 8 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 8 / 0x0a010004 @ 8 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 14: +==> 15: task_priority smp1 4 + Thread Heir: 0x0a010001 priority=4 + Thread Executing: 0x0a010001 priority=4 +Task (0x0a010001) Change Priority from 5 to 4 +==> 16: dispatch +==> 17: # GOAL: 0x0a010001 - 0x0a010004 are heir and executing +==> 18: # GOAL: on CPUs 0 - 3 respectively (no change) +==> 19: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 4 / 0x0a010001 @ 4 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 8 / 0x0a010002 @ 8 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 8 / 0x0a010003 @ 8 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 8 / 0x0a010004 @ 8 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 20: +==> 21: task_priority smp1 7 +Task (0x0a010001) Change Priority from 4 to 7 +==> 22: dispatch +==> 23: # GOAL: 0x0a010001 - 0x0a010004 are heir and executing +==> 24: # GOAL: on CPUs 0 - 3 respectively (no change) +==> 25: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 7 / 0x0a010001 @ 7 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 8 / 0x0a010002 @ 8 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 8 / 0x0a010003 @ 8 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 8 / 0x0a010004 @ 8 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 26: +==> 27: task_priority smp1 8 + Thread Heir: 0x0a010005 priority=8 + Thread Executing: 0x0a010005 priority=8 +Task (0x0a010001) Change Priority from 7 to 8 +==> 28: dispatch +==> 29: # GOAL: 0x0a010005, 0x0a010002 - 0x0a010004 are heir and executing +==> 30: # GOAL: on CPUs 0 - 3 respectively +==> 31: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010005 @ 8 / 0x0a010005 @ 8 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 8 / 0x0a010002 @ 8 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 8 / 0x0a010003 @ 8 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 8 / 0x0a010004 @ 8 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 32: +==> 33: task_priority smp1 5 + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +Task (0x0a010001) Change Priority from 8 to 5 +==> 34: dispatch +==> 35: # GOAL: 0x0a010001 - 0x0a010004 are heir and executing +==> 36: # GOAL: on CPUs 0 - 3 respectively +==> 37: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 8 / 0x0a010002 @ 8 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 8 / 0x0a010003 @ 8 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 8 / 0x0a010004 @ 8 / 0x09010004 @255 false +=== End of Ready Set of Threads diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_priority.scen b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_priority.scen new file mode 100644 index 0000000..311bae4 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_priority.scen @@ -0,0 +1,37 @@ +# +# Check increasing and decrease priority +# +rtems_init 4 +task_create smp1 5 +task_create smp2 8 +task_create smp3 8 +task_create smp4 8 +task_create smp5 8 +dispatch +# GOAL: 0x0a010001 - 0x0a010004 are heir and executing +# GOAL: on CPUs 0 - 3 respectively +cpus + +task_priority smp1 4 +dispatch +# GOAL: 0x0a010001 - 0x0a010004 are heir and executing +# GOAL: on CPUs 0 - 3 respectively (no change) +cpus + +task_priority smp1 7 +dispatch +# GOAL: 0x0a010001 - 0x0a010004 are heir and executing +# GOAL: on CPUs 0 - 3 respectively (no change) +cpus + +task_priority smp1 8 +dispatch +# GOAL: 0x0a010005, 0x0a010002 - 0x0a010004 are heir and executing +# GOAL: on CPUs 0 - 3 respectively +cpus + +task_priority smp1 5 +dispatch +# GOAL: 0x0a010001 - 0x0a010004 are heir and executing +# GOAL: on CPUs 0 - 3 respectively +cpus diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_simple_nopreempt.expected b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_simple_nopreempt.expected new file mode 100644 index 0000000..fad7357 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_simple_nopreempt.expected @@ -0,0 +1,75 @@ +Script File : scenarios/cpus4_simple_nopreempt.scen +verbose : 1 +==> 1: # +==> 2: # Verify no-preempt is honored +==> 3: # +==> 4: rtems_init 4 + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x09010001 priority=255 +==> 5: task_create -p smp1 5 +Creating task with: Preemption: no Timeslicing: no +Task (smp1) created: id=0x0a010001, priority=5 +Task (smp1) starting: id=0x0a010001, priority=5 + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +==> 6: task_create -p smp2 6 +Creating task with: Preemption: no Timeslicing: no +Task (smp2) created: id=0x0a010002, priority=6 +Task (smp2) starting: id=0x0a010002, priority=6 +==> 7: task_create -p smp3 7 +Creating task with: Preemption: no Timeslicing: no +Task (smp3) created: id=0x0a010003, priority=7 +Task (smp3) starting: id=0x0a010003, priority=7 +==> 8: task_create -p smp4 8 +Creating task with: Preemption: no Timeslicing: no +Task (smp4) created: id=0x0a010004, priority=8 +Task (smp4) starting: id=0x0a010004, priority=8 +==> 9: dispatch +=== Invoke Thread Dispatch on CPU 1 + Thread Heir: 0x0a010002 priority=6 + Thread Executing: 0x09010002 priority=255 + Thread Executing: 0x0a010002 priority=6 +=== Invoke Thread Dispatch on CPU 2 + Thread Heir: 0x0a010003 priority=7 + Thread Executing: 0x09010003 priority=255 + Thread Executing: 0x0a010003 priority=7 +=== Invoke Thread Dispatch on CPU 3 + Thread Heir: 0x0a010004 priority=8 + Thread Executing: 0x09010004 priority=255 + Thread Executing: 0x0a010004 priority=8 +==> 10: # GOAL: Tasks 0x0a010001 to 0x0a010004 as heir and executing on +==> 11: # GOAL: CPUs 1 - 4, respectively. +==> 12: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 6 / 0x0a010002 @ 6 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 7 / 0x0a010003 @ 7 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 8 / 0x0a010004 @ 8 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 13: # Tasks are created and distributed across CPUs +==> 14: task_create smp5 1 +Creating task with: Preemption: yes Timeslicing: no + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +Task (smp5) created: id=0x0a010005, priority=1 +Task (smp5) starting: id=0x0a010005, priority=1 +==> 15: # GOAL: Task 0x0a010005 is heir but 0x0a010004 is executing on CPU 4 +==> 16: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 6 / 0x0a010002 @ 6 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 7 / 0x0a010003 @ 7 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 8 / 0x0a010005 @ 1 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 17: dispatch +==> 18: # GOAL: Task 0x0a010005 is heir but 0x0a010004 is executing on CPU 4 +==> 19: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 6 / 0x0a010002 @ 6 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 7 / 0x0a010003 @ 7 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 8 / 0x0a010005 @ 1 / 0x09010004 @255 false +=== End of Ready Set of Threads diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_simple_nopreempt.scen b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_simple_nopreempt.scen new file mode 100644 index 0000000..d7596d9 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_simple_nopreempt.scen @@ -0,0 +1,19 @@ +# +# Verify no-preempt is honored +# +rtems_init 4 +task_create -p smp1 5 +task_create -p smp2 6 +task_create -p smp3 7 +task_create -p smp4 8 +dispatch +# GOAL: Tasks 0x0a010001 to 0x0a010004 as heir and executing on +# GOAL: CPUs 1 - 4, respectively. +cpus +# Tasks are created and distributed across CPUs +task_create smp5 1 +# GOAL: Task 0x0a010005 is heir but 0x0a010004 is executing on CPU 4 +cpus +dispatch +# GOAL: Task 0x0a010005 is heir but 0x0a010004 is executing on CPU 4 +cpus diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_simple_preemption.expected b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_simple_preemption.expected new file mode 100644 index 0000000..9a4942b --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_simple_preemption.expected @@ -0,0 +1,79 @@ +Script File : scenarios/cpus4_simple_preemption.scen +verbose : 1 +==> 1: # +==> 2: # Ensure lowest priority is preempted +==> 3: # +==> 4: rtems_init 4 + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x09010001 priority=255 +==> 5: task_create smp1 5 +Creating task with: Preemption: yes Timeslicing: no +Task (smp1) created: id=0x0a010001, priority=5 +Task (smp1) starting: id=0x0a010001, priority=5 + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +==> 6: task_create smp2 6 +Creating task with: Preemption: yes Timeslicing: no +Task (smp2) created: id=0x0a010002, priority=6 +Task (smp2) starting: id=0x0a010002, priority=6 +==> 7: task_create smp3 7 +Creating task with: Preemption: yes Timeslicing: no +Task (smp3) created: id=0x0a010003, priority=7 +Task (smp3) starting: id=0x0a010003, priority=7 +==> 8: task_create smp4 8 +Creating task with: Preemption: yes Timeslicing: no +Task (smp4) created: id=0x0a010004, priority=8 +Task (smp4) starting: id=0x0a010004, priority=8 +==> 9: dispatch +=== Invoke Thread Dispatch on CPU 1 + Thread Heir: 0x0a010002 priority=6 + Thread Executing: 0x09010002 priority=255 + Thread Executing: 0x0a010002 priority=6 +=== Invoke Thread Dispatch on CPU 2 + Thread Heir: 0x0a010003 priority=7 + Thread Executing: 0x09010003 priority=255 + Thread Executing: 0x0a010003 priority=7 +=== Invoke Thread Dispatch on CPU 3 + Thread Heir: 0x0a010004 priority=8 + Thread Executing: 0x09010004 priority=255 + Thread Executing: 0x0a010004 priority=8 +==> 10: # GOAL: want 0x0a010001 - 0x0a010004 as heir and executings +==> 11: # GOAL: on CPUs 1-4 respectively +==> 12: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 6 / 0x0a010002 @ 6 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 7 / 0x0a010003 @ 7 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 8 / 0x0a010004 @ 8 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 13: # Tasks are created and distributed across CPUs +==> 14: task_create smp5 1 +Creating task with: Preemption: yes Timeslicing: no + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +Task (smp5) created: id=0x0a010005, priority=1 +Task (smp5) starting: id=0x0a010005, priority=1 +==> 15: # GOAL: want 0x0a010005 to be heir on CPU 4 +==> 16: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 6 / 0x0a010002 @ 6 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 7 / 0x0a010003 @ 7 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 8 / 0x0a010005 @ 1 / 0x09010004 @255 true +=== End of Ready Set of Threads +==> 17: dispatch +=== Invoke Thread Dispatch on CPU 3 + Thread Heir: 0x0a010005 priority=1 + Thread Executing: 0x0a010004 priority=8 + Thread Executing: 0x0a010005 priority=1 +==> 18: # GOAL: want 0x0a010005 to be heir AND executing on CPU 4 +==> 19: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 6 / 0x0a010002 @ 6 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 7 / 0x0a010003 @ 7 / 0x09010003 @255 false + CPU 3: 0x0a010005 @ 1 / 0x0a010005 @ 1 / 0x09010004 @255 false +=== End of Ready Set of Threads diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_simple_preemption.scen b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_simple_preemption.scen new file mode 100644 index 0000000..ccb6d0e --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_simple_preemption.scen @@ -0,0 +1,19 @@ +# +# Ensure lowest priority is preempted +# +rtems_init 4 +task_create smp1 5 +task_create smp2 6 +task_create smp3 7 +task_create smp4 8 +dispatch +# GOAL: want 0x0a010001 - 0x0a010004 as heir and executings +# GOAL: on CPUs 1-4 respectively +cpus +# Tasks are created and distributed across CPUs +task_create smp5 1 +# GOAL: want 0x0a010005 to be heir on CPU 4 +cpus +dispatch +# GOAL: want 0x0a010005 to be heir AND executing on CPU 4 +cpus diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_suspend_on_all.expected b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_suspend_on_all.expected new file mode 100644 index 0000000..ee26a63 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_suspend_on_all.expected @@ -0,0 +1,83 @@ +Script File : scenarios/cpus4_suspend_on_all.scen +verbose : 1 +==> 1: # +==> 2: # Check blocking self on secondary CPU +==> 3: # +==> 4: rtems_init 4 + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x09010001 priority=255 +==> 5: task_create smp1 5 +Creating task with: Preemption: yes Timeslicing: no +Task (smp1) created: id=0x0a010001, priority=5 +Task (smp1) starting: id=0x0a010001, priority=5 + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +==> 6: task_create smp2 6 +Creating task with: Preemption: yes Timeslicing: no +Task (smp2) created: id=0x0a010002, priority=6 +Task (smp2) starting: id=0x0a010002, priority=6 +==> 7: task_create smp3 7 +Creating task with: Preemption: yes Timeslicing: no +Task (smp3) created: id=0x0a010003, priority=7 +Task (smp3) starting: id=0x0a010003, priority=7 +==> 8: task_create smp4 8 +Creating task with: Preemption: yes Timeslicing: no +Task (smp4) created: id=0x0a010004, priority=8 +Task (smp4) starting: id=0x0a010004, priority=8 +==> 9: dispatch +=== Invoke Thread Dispatch on CPU 1 + Thread Heir: 0x0a010002 priority=6 + Thread Executing: 0x09010002 priority=255 + Thread Executing: 0x0a010002 priority=6 +=== Invoke Thread Dispatch on CPU 2 + Thread Heir: 0x0a010003 priority=7 + Thread Executing: 0x09010003 priority=255 + Thread Executing: 0x0a010003 priority=7 +=== Invoke Thread Dispatch on CPU 3 + Thread Heir: 0x0a010004 priority=8 + Thread Executing: 0x09010004 priority=255 + Thread Executing: 0x0a010004 priority=8 +==> 10: # GOAL: want 0x0a010001 - 0x0a010004 as heir and executings +==> 11: # GOAL: on CPUs 0 - 3 respectively +==> 12: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 6 / 0x0a010002 @ 6 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 7 / 0x0a010003 @ 7 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 8 / 0x0a010004 @ 8 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 13: task_suspend smp1 +Suspending task (0x0a010001) + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x0a010001 priority=5 + Thread Executing: 0x09010001 priority=255 +==> 14: task_suspend smp2 +Suspending task (0x0a010002) +==> 15: task_suspend smp3 +Suspending task (0x0a010003) +==> 16: task_suspend smp4 +Suspending task (0x0a010004) +==> 17: dispatch +=== Invoke Thread Dispatch on CPU 1 + Thread Heir: 0x09010002 priority=255 + Thread Executing: 0x0a010002 priority=6 + Thread Executing: 0x09010002 priority=255 +=== Invoke Thread Dispatch on CPU 2 + Thread Heir: 0x09010003 priority=255 + Thread Executing: 0x0a010003 priority=7 + Thread Executing: 0x09010003 priority=255 +=== Invoke Thread Dispatch on CPU 3 + Thread Heir: 0x09010004 priority=255 + Thread Executing: 0x0a010004 priority=8 + Thread Executing: 0x09010004 priority=255 +==> 18: # GOAL: want IDLE 0x09010001 - 0x09010004 as heir and executings +==> 19: # GOAL: on CPUs 0 - 3 respectively +==> 20: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x09010001 @255 / 0x09010001 @255 / 0x09010001 @255 false + CPU 1: 0x09010002 @255 / 0x09010002 @255 / 0x09010002 @255 false + CPU 2: 0x09010003 @255 / 0x09010003 @255 / 0x09010003 @255 false + CPU 3: 0x09010004 @255 / 0x09010004 @255 / 0x09010004 @255 false +=== End of Ready Set of Threads diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_suspend_on_all.scen b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_suspend_on_all.scen new file mode 100644 index 0000000..d0568ce --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_suspend_on_all.scen @@ -0,0 +1,20 @@ +# +# Check blocking self on secondary CPU +# +rtems_init 4 +task_create smp1 5 +task_create smp2 6 +task_create smp3 7 +task_create smp4 8 +dispatch +# GOAL: want 0x0a010001 - 0x0a010004 as heir and executings +# GOAL: on CPUs 0 - 3 respectively +cpus +task_suspend smp1 +task_suspend smp2 +task_suspend smp3 +task_suspend smp4 +dispatch +# GOAL: want IDLE 0x09010001 - 0x09010004 as heir and executings +# GOAL: on CPUs 0 - 3 respectively +cpus diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_suspend_on_primary.expected b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_suspend_on_primary.expected new file mode 100644 index 0000000..0e63b40 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_suspend_on_primary.expected @@ -0,0 +1,73 @@ +Script File : scenarios/cpus4_suspend_on_primary.scen +verbose : 1 +==> 1: # +==> 2: # Check blocking self on primary CPU +==> 3: # +==> 4: rtems_init 4 + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x09010001 priority=255 +==> 5: task_create smp1 5 +Creating task with: Preemption: yes Timeslicing: no +Task (smp1) created: id=0x0a010001, priority=5 +Task (smp1) starting: id=0x0a010001, priority=5 + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +==> 6: task_create smp2 6 +Creating task with: Preemption: yes Timeslicing: no +Task (smp2) created: id=0x0a010002, priority=6 +Task (smp2) starting: id=0x0a010002, priority=6 +==> 7: task_create smp3 7 +Creating task with: Preemption: yes Timeslicing: no +Task (smp3) created: id=0x0a010003, priority=7 +Task (smp3) starting: id=0x0a010003, priority=7 +==> 8: task_create smp4 8 +Creating task with: Preemption: yes Timeslicing: no +Task (smp4) created: id=0x0a010004, priority=8 +Task (smp4) starting: id=0x0a010004, priority=8 +==> 9: dispatch +=== Invoke Thread Dispatch on CPU 1 + Thread Heir: 0x0a010002 priority=6 + Thread Executing: 0x09010002 priority=255 + Thread Executing: 0x0a010002 priority=6 +=== Invoke Thread Dispatch on CPU 2 + Thread Heir: 0x0a010003 priority=7 + Thread Executing: 0x09010003 priority=255 + Thread Executing: 0x0a010003 priority=7 +=== Invoke Thread Dispatch on CPU 3 + Thread Heir: 0x0a010004 priority=8 + Thread Executing: 0x09010004 priority=255 + Thread Executing: 0x0a010004 priority=8 +==> 10: # GOAL: want 0x0a010001 - 0x0a010004 as heir and executings +==> 11: # GOAL: on CPUs 1-4 respectively +==> 12: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 6 / 0x0a010002 @ 6 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 7 / 0x0a010003 @ 7 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 8 / 0x0a010004 @ 8 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 13: task_suspend SELF +Suspending task (0x0a010001) + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x0a010001 priority=5 + Thread Executing: 0x09010001 priority=255 +==> 14: # GOAL: want 0x09010001 as heir and executing on CPU 1 +==> 15: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x09010001 @255 / 0x09010001 @255 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 6 / 0x0a010002 @ 6 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 7 / 0x0a010003 @ 7 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 8 / 0x0a010004 @ 8 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 16: dispatch +==> 17: # GOAL: want 0x09010001 as heir and executing on CPU 1 +==> 18: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x09010001 @255 / 0x09010001 @255 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 6 / 0x0a010002 @ 6 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 7 / 0x0a010003 @ 7 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 8 / 0x0a010004 @ 8 / 0x09010004 @255 false +=== End of Ready Set of Threads diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_suspend_on_primary.scen b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_suspend_on_primary.scen new file mode 100644 index 0000000..ab25fb7 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_suspend_on_primary.scen @@ -0,0 +1,18 @@ +# +# Check blocking self on primary CPU +# +rtems_init 4 +task_create smp1 5 +task_create smp2 6 +task_create smp3 7 +task_create smp4 8 +dispatch +# GOAL: want 0x0a010001 - 0x0a010004 as heir and executings +# GOAL: on CPUs 1-4 respectively +cpus +task_suspend SELF +# GOAL: want 0x09010001 as heir and executing on CPU 1 +cpus +dispatch +# GOAL: want 0x09010001 as heir and executing on CPU 1 +cpus diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_suspend_on_secondary.expected b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_suspend_on_secondary.expected new file mode 100644 index 0000000..e7df9bb --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_suspend_on_secondary.expected @@ -0,0 +1,75 @@ +Script File : scenarios/cpus4_suspend_on_secondary.scen +verbose : 1 +==> 1: # +==> 2: # Check blocking self on secondary CPU +==> 3: # +==> 4: rtems_init 4 + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x09010001 priority=255 +==> 5: task_create smp1 5 +Creating task with: Preemption: yes Timeslicing: no +Task (smp1) created: id=0x0a010001, priority=5 +Task (smp1) starting: id=0x0a010001, priority=5 + Thread Heir: 0x0a010001 priority=5 + Thread Executing: 0x0a010001 priority=5 +==> 6: task_create smp2 6 +Creating task with: Preemption: yes Timeslicing: no +Task (smp2) created: id=0x0a010002, priority=6 +Task (smp2) starting: id=0x0a010002, priority=6 +==> 7: task_create smp3 7 +Creating task with: Preemption: yes Timeslicing: no +Task (smp3) created: id=0x0a010003, priority=7 +Task (smp3) starting: id=0x0a010003, priority=7 +==> 8: task_create smp4 8 +Creating task with: Preemption: yes Timeslicing: no +Task (smp4) created: id=0x0a010004, priority=8 +Task (smp4) starting: id=0x0a010004, priority=8 +==> 9: dispatch +=== Invoke Thread Dispatch on CPU 1 + Thread Heir: 0x0a010002 priority=6 + Thread Executing: 0x09010002 priority=255 + Thread Executing: 0x0a010002 priority=6 +=== Invoke Thread Dispatch on CPU 2 + Thread Heir: 0x0a010003 priority=7 + Thread Executing: 0x09010003 priority=255 + Thread Executing: 0x0a010003 priority=7 +=== Invoke Thread Dispatch on CPU 3 + Thread Heir: 0x0a010004 priority=8 + Thread Executing: 0x09010004 priority=255 + Thread Executing: 0x0a010004 priority=8 +==> 10: # GOAL: want 0x0a010001 - 0x0a010004 as heir and executings +==> 11: # GOAL: on CPUs 1-4 respectively +==> 12: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 6 / 0x0a010002 @ 6 / 0x09010002 @255 false + CPU 2: 0x0a010003 @ 7 / 0x0a010003 @ 7 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 8 / 0x0a010004 @ 8 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 13: current_cpu 2 +Changing current CPU from 0 to 2 +==> 14: task_suspend SELF +Suspending task (0x0a010003) + Thread Heir: 0x09010001 priority=255 + Thread Executing: 0x0a010003 priority=7 + Thread Executing: 0x09010001 priority=255 +==> 15: # GOAL: Want IDLE 0x09010001 as heir and executing on CPU 2 +==> 16: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 6 / 0x0a010002 @ 6 / 0x09010002 @255 false + CPU 2: 0x09010001 @255 / 0x09010001 @255 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 8 / 0x0a010004 @ 8 / 0x09010004 @255 false +=== End of Ready Set of Threads +==> 17: dispatch +==> 18: # GOAL: Want IDLE 0x09010001 as heir and executing on CPU 2 +==> 19: cpus +=== CPU Status + EXECUTING / HEIR / IDLE / SWITCH NEEDED + CPU 0: 0x0a010001 @ 5 / 0x0a010001 @ 5 / 0x09010001 @255 false + CPU 1: 0x0a010002 @ 6 / 0x0a010002 @ 6 / 0x09010002 @255 false + CPU 2: 0x09010001 @255 / 0x09010001 @255 / 0x09010003 @255 false + CPU 3: 0x0a010004 @ 8 / 0x0a010004 @ 8 / 0x09010004 @255 false +=== End of Ready Set of Threads diff --git a/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_suspend_on_secondary.scen b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_suspend_on_secondary.scen new file mode 100644 index 0000000..9660b7d --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/scenarios/cpus4_suspend_on_secondary.scen @@ -0,0 +1,19 @@ +# +# Check blocking self on secondary CPU +# +rtems_init 4 +task_create smp1 5 +task_create smp2 6 +task_create smp3 7 +task_create smp4 8 +dispatch +# GOAL: want 0x0a010001 - 0x0a010004 as heir and executings +# GOAL: on CPUs 1-4 respectively +cpus +current_cpu 2 +task_suspend SELF +# GOAL: Want IDLE 0x09010001 as heir and executing on CPU 2 +cpus +dispatch +# GOAL: Want IDLE 0x09010001 as heir and executing on CPU 2 +cpus diff --git a/schedsim/shell/schedsim_smpsimple/schedsim.cc b/schedsim/shell/schedsim_smpsimple/schedsim.cc new file mode 100644 index 0000000..733d718 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/schedsim.cc @@ -0,0 +1,178 @@ +/* + * 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 = 1; +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 ) + printf( "==> %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; + } + + if ( argc == 0 ) + 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); + } +} + +extern "C" { + void add_commands(void); +}; + +int main( + int argc, + char **argv +) +{ + int opt; + progname = argv[0]; + + while ((opt = getopt(argc, argv, "v")) != -1) { + switch (opt) { + case 'v': verbose = 0; break; + default: /* '?' */ + usage(); + } + } + + if ( optind >= argc ) { + scriptname = "-"; + } else { + scriptname = argv[ optind ]; + } + + if ( !strcmp( scriptname, "-" ) ) { + scriptname = "/dev/stdin"; + } + + if ( verbose ) { + printf( + "Script File : %s\n" + "verbose : %d\n", + scriptname, + verbose + ); + } + + // + // Initialize the command interpreter + // + rtems_shell_initialize_command_set(); + add_commands(); + + // + // 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_smpsimple/smp_stub.c b/schedsim/shell/schedsim_smpsimple/smp_stub.c new file mode 100644 index 0000000..65d0165 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/smp_stub.c @@ -0,0 +1,74 @@ +/* + * RTEMS SMP Support for Single Core + * + * COPYRIGHT (c) 1989-2011. + * 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 <rtems.h> +#include <rtems/bspIo.h> +#include <rtems/bspsmp.h> +#include <stdlib.h> + +uint32_t Schedsim_Current_cpu; + +void bsp_smp_secondary_cpu_initialize(int cpu) +{ + Schedsim_Current_cpu = 0; +} + +int bsp_smp_processor_id(void) +{ + return Schedsim_Current_cpu; +} + +int bsp_smp_initialize( + int maximum +) +{ + /* return the number of CPUs */ + return maximum; +} + +void bsp_smp_broadcast_interrupt(void) +{ +} + +void bsp_smp_broadcast_message( + uint32_t message +) +{ +} + +void bsp_smp_interrupt_cpu( + int cpu +) +{ +} + +void bsp_smp_delay( int max ) +{ +} + +void bsp_smp_wait_for( + volatile unsigned int *address, + unsigned int desired, + int maximum_usecs +) +{ + int iterations; + volatile int i; + volatile unsigned int *p = address; + + for (iterations=0 ; iterations < maximum_usecs ; iterations++ ) { + *p = desired; + /* XXX hack to make simulator happy */ + } +} + diff --git a/schedsim/shell/schedsim_smpsimple/wrap_thread_dispatch.c b/schedsim/shell/schedsim_smpsimple/wrap_thread_dispatch.c new file mode 100644 index 0000000..3432188 --- /dev/null +++ b/schedsim/shell/schedsim_smpsimple/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(); +} |