<div dir="ltr">Hello,<br><div>As discussed in <a href="https://lists.rtems.org/pipermail/devel/2020-November/063341.html" target="_blank">this</a> thread, I have compiled a list of the tests that deal with inter stack communication and fail with the thread stack protection option. Most of these tests pass when, as Sebastian suggested and had provided a wonderful example, I disable memory protection at places where contents of different thread stacks are accessed by the current thread. There are a few tests that still fail due to inter-stack access in the application code itself.</div><div><br></div><div>The changes I have made are - </div><div><br></div><div>diff --git a/bsps/arm/realview-pbx-a9/mmu/bsp-set-mmu-attr.c b/bsps/arm/realview-pbx-a9/mmu/bsp-set-mmu-attr.c<br>index c176d4b8c5..a45b175395 100644<br>--- a/bsps/arm/realview-pbx-a9/mmu/bsp-set-mmu-attr.c<br>+++ b/bsps/arm/realview-pbx-a9/mmu/bsp-set-mmu-attr.c<br>@@ -1,15 +1,49 @@<br> #include <bsp/arm-cp15-start.h><br> #include <rtems/score/memoryprotection.h><br>+#include <rtems/score/threadimpl.h><br> #include <libcpu/arm-cp15.h><br> <br>+bool set_memory_flags(Thread_Control* thread, void* arg)<br>+{<br>+ Â uintptr_t begin;<br>+ Â uintptr_t end;<br>+ Â uint32_t flags;<br>+ Â rtems_interrupt_level irq_level;<br>+ Â Thread_Control *executing;<br>+<br>+ Â executing = _Thread_Executing;<br>+<br>+ Â if(thread != Â executing) {<br>+ <br>+ Â  Â flags = *( uint32_t *)( arg );<br>+ Â  Â begin = thread->Start.Initial_stack.area;<br>+ Â  Â end = begin + thread->Start.Initial_stack.size; <br>+<br>+ Â  Â rtems_interrupt_disable(irq_level);<br>+ Â  Â arm_cp15_set_translation_table_entries(begin, end, flags);<br>+ Â  Â rtems_interrupt_enable(irq_level);<br>+ Â }<br>+ Â <br>+ Â return false;<br>+}<br>+<br>+rtems_status_code _Memory_protection_Enable( void )<br>+{<br>+ Â uint32_t access_flags;<br>+<br>+ Â access_flags = translate_flags( Â RTEMS_NO_ACCESS );<br>+<br>+ Â _Thread_Iterate( set_memory_flags, &access_flags );<br>+<br>+ Â return RTEMS_SUCCESSFUL; // check the return values for iterating function and current method.<br>+}<br>+<br>+rtems_status_code _Memory_protection_Disable( void )<br>+{<br>+ Â uint32_t access_flags;<br>+<br>+ Â access_flags = translate_flags( Â RTEMS_READ_WRITE );<br>+<br>+ Â _Thread_Iterate( set_memory_flags, &access_flags );<br>+<br>+ Â return RTEMS_SUCCESSFUL;<br> }<br>\ No newline at end of file<br>diff --git a/cpukit/include/rtems/score/coremsgimpl.h b/cpukit/include/rtems/score/coremsgimpl.h<br>index e598dce96a..3719a3d3c8 100644<br>--- a/cpukit/include/rtems/score/coremsgimpl.h<br>+++ b/cpukit/include/rtems/score/coremsgimpl.h<br>@@ -27,6 +27,10 @@<br> #include <rtems/score/threaddispatch.h><br> #include <rtems/score/threadqimpl.h><br> <br>+#if defined RTEMS_THREAD_STACK_PROTECTION<br>+ #include <rtems/score/memoryprotection.h><br>+#endif<br>+<br> #include <limits.h><br> #include <string.h><br> <br>@@ -586,7 +590,9 @@ RTEMS_INLINE_ROUTINE Thread_Control *_CORE_message_queue_Dequeue_receiver(<br>  Â if ( the_thread == NULL ) {<br>  Â  Â return NULL;<br>  Â }<br>-<br>+#if defined RTEMS_THREAD_STACK_PROTECTION<br>+ Â _Memory_protection_Disable();<br>+#endif<br>  Â  *(size_t *) the_thread->Wait.return_argument = size;<br>  Â  the_thread->Wait.count = (uint32_t) submit_type;<br> <br>@@ -595,6 +601,9 @@ RTEMS_INLINE_ROUTINE Thread_Control *_CORE_message_queue_Dequeue_receiver(<br>  Â  Â the_thread->Wait.return_argument_second.mutable_object,<br>  Â  Â size<br>  Â );<br>+#if defined RTEMS_THREAD_STACK_PROTECTION<br>+ Â _Memory_protection_Enable();<br>+#endif<br> <br>  Â _Thread_queue_Extract_critical(<br>  Â  Â &the_message_queue->Wait_queue.Queue,<br><br>diff --git a/cpukit/posix/src/psignalunblockthread.c b/cpukit/posix/src/psignalunblockthread.c<br>index 80a0f33a09..e0f8468de6 100644<br>--- a/cpukit/posix/src/psignalunblockthread.c<br>+++ b/cpukit/posix/src/psignalunblockthread.c<br>@@ -24,6 +24,9 @@<br> #include <signal.h><br> <br> #include <rtems/score/isr.h><br>+#if defined RTEMS_THREAD_STACK_PROTECTION<br>+#include <rtems/score/memoryprotection.h><br>+#endif<br> #include <rtems/score/threadimpl.h><br> #include <rtems/score/threadqimpl.h><br> #include <rtems/score/watchdogimpl.h><br>@@ -205,6 +208,10 @@ bool _POSIX_signals_Unblock_thread(<br> <br>  Â  Â  Â the_info = (siginfo_t *) the_thread->Wait.return_argument;<br> <br>+#if defined RTEMS_THREAD_STACK_PROTECTION<br>+_Memory_protection_Disable();<br>+#endif<br>+<br>  Â  Â  Â if ( !info ) {<br>  Â  Â  Â  Â the_info->si_signo = signo;<br>  Â  Â  Â  Â the_info->si_code = SI_USER;<br>@@ -212,6 +219,9 @@ bool _POSIX_signals_Unblock_thread(<br>  Â  Â  Â } else {<br>  Â  Â  Â  Â *the_info = *info;<br>  Â  Â  Â }<br>+#if defined RTEMS_THREAD_STACK_PROTECTION<br>+_Memory_protection_Enable();<br>+#endif<br> <br>  Â  Â  Â _Thread_queue_Extract_with_proxy( the_thread );<br>  Â  Â  Â return _POSIX_signals_Unblock_thread_done( the_thread, api, true );<br>diff --git a/cpukit/rtems/src/eventsurrender.c b/cpukit/rtems/src/eventsurrender.c<br>index 49f77d2663..5de62ec292 100644<br>--- a/cpukit/rtems/src/eventsurrender.c<br>+++ b/cpukit/rtems/src/eventsurrender.c<br>@@ -23,6 +23,10 @@<br> #include <rtems/score/threadimpl.h><br> #include <rtems/score/watchdogimpl.h><br> <br>+#if defined RTEMS_THREAD_STACK_PROTECTION<br>+ Â #include <rtems/score/memoryprotection.h><br>+#endif<br>+<br> static void _Event_Satisfy(<br>  Â Thread_Control Â *the_thread,<br>  Â Event_Control Â  *event,<br>@@ -31,7 +35,13 @@ static void _Event_Satisfy(<br> )<br> {<br>  Â event->pending_events = _Event_sets_Clear( pending_events, seized_events );<br>+#if defined RTEMS_THREAD_STACK_PROTECTION<br>+ Â  Â _Memory_protection_Disable();<br>+#endif<br>  Â *(rtems_event_set *) the_thread->Wait.return_argument = seized_events;<br>+#if defined RTEMS_THREAD_STACK_PROTECTION<br>+ Â  Â _Memory_protection_Enable();<br>+#endif<br> }<br> <br> static bool _Event_Is_blocking_on_event(<br>diff --git a/cpukit/rtems/src/regionprocessqueue.c b/cpukit/rtems/src/regionprocessqueue.c<br>index 4adaf66674..29b078a38c 100644<br>--- a/cpukit/rtems/src/regionprocessqueue.c<br>+++ b/cpukit/rtems/src/regionprocessqueue.c<br>@@ -22,6 +22,10 @@<br> #include <rtems/score/status.h><br> #include <rtems/score/threadqimpl.h><br> <br>+#if defined RTEMS_THREAD_STACK_PROTECTION<br>+ #include <rtems/score/memoryprotection.h><br>+#endif<br>+<br> void _Region_Process_queue(<br>  Â Region_Control *the_region<br> )<br>@@ -63,8 +67,13 @@ void _Region_Process_queue(<br> <br>  Â  Â if ( the_segment == NULL )<br>  Â  Â  Â break;<br>-<br>+#if defined RTEMS_THREAD_STACK_PROTECTION<br>+ Â  Â _Memory_protection_Disable();<br>+#endif Â  Â  <br>  Â  Â *(void **)the_thread->Wait.return_argument = the_segment;<br>+#if defined RTEMS_THREAD_STACK_PROTECTION<br>+ Â  Â _Memory_protection_Enable();<br>+#endif<br>  Â  Â _Thread_queue_Extract( the_thread );<br>  Â  Â the_thread->Wait.return_code = STATUS_SUCCESSFUL;<br>  Â }<br></div><div><br></div></div>