summaryrefslogtreecommitdiff
path: root/testsuites
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2020-02-26 10:02:37 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2020-02-28 07:50:19 +0100
commitfcb11510c6b38a7a1f4da7205acc5461a4e18214 (patch)
tree02f0c07dec4124f93eccdcdd45af06a9c9099fb7 /testsuites
parent2220a536e34261989042a381fab43e33ccc1fbb9 (diff)
score: Fix context switch extensions (SMP)
In uniprocessor and SMP configurations, the context switch extensions were called during _Thread_Do_dispatch(): void _Thread_Do_dispatch( Per_CPU_Control *cpu_self, ISR_Level level ) { Thread_Control *executing; executing = cpu_self->executing; ... do { Thread_Control *heir; heir = _Thread_Get_heir_and_make_it_executing( cpu_self ); ... _User_extensions_Thread_switch( executing, heir ); ... _Context_Switch( &executing->Registers, &heir->Registers ); ... } while ( cpu_self->dispatch_necessary ); ... } In uniprocessor configurations, this is fine and the context switch extensions are called for all thread switches except the very first thread switch to the initialization thread. However, in SMP configurations, the context switch may be invalidated and updated in the low-level _Context_Switch() routine. See: https://docs.rtems.org/branches/master/c-user/symmetric_multiprocessing_services.html#thread-dispatch-details In case such an update happens, a thread will execute on the processor which was not seen in the previous call of the context switch extensions. This can confuse for example event record consumers which use events generated by a context switch extension. Fixing this is not straight forward. The context switch extensions call must move after the low-level context switch. The problem here is that we may end up in _Thread_Handler(). Adding the context switch extensions call to _Thread_Handler() covers now also the thread switch to the initialization thread. We also have to save the last executing thread (ancestor) of the processor. Registers or the stack cannot be used for this purpose. We have to add it to the per-processor information. Existing extensions may be affected, since now context switch extensions use the stack of the heir thread. The stack checker is affected by this. Calling the thread switch extensions in the low-level context switch is difficult since at this point an intermediate stack is used which is only large enough to enable servicing of interrupts. Update #3885.
Diffstat (limited to 'testsuites')
-rw-r--r--testsuites/sptests/spextensions01/init.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/testsuites/sptests/spextensions01/init.c b/testsuites/sptests/spextensions01/init.c
index f9e3c11140..7ce1da5320 100644
--- a/testsuites/sptests/spextensions01/init.c
+++ b/testsuites/sptests/spextensions01/init.c
@@ -453,8 +453,12 @@ static void test(void)
#endif
active_extensions = 4;
+#ifdef RTEMS_SMP
+ assert(counter == 12);
+#else
assert(counter == 10);
counter = 12;
+#endif
sc = rtems_task_create(
rtems_build_name('W', 'O', 'R', 'K'),