Report on failing tests with thread stack protection and their resolution.
Sebastian Huber
sebastian.huber at embedded-brains.de
Tue Jan 26 15:24:46 UTC 2021
On 23/01/2021 07:27, Utkarsh Rai wrote:
> The issue that remains is of User extension iterators, in particular
> of nested iterators. My idea is to disable memory protection in places
> during iteration where inter-stack access takes place. The problem is
> determining the region for which memory protection needs to be
> disabled. One way to get around this would be by disabling memory
> protection for all the stacks, in a blanket-based manner.
I used this approach for a Nios II system with a thread stack
protection. We trust the operating system, so this approach should be fine.
diff --git a/cpukit/score/src/userextiterate.c
b/cpukit/score/src/userextiterate.c
index a25a4ad768..3e56c3a39d 100644
--- a/cpukit/score/src/userextiterate.c
+++ b/cpukit/score/src/userextiterate.c
@@ -34,6 +34,10 @@
#include <rtems/score/userextimpl.h>
+#ifdef BSP_NIOS2_USE_MPU
+#include <rtems/score/nios2-utility.h>
+#endif
+
#include <pthread.h>
User_extensions_List _User_extensions_List = {
@@ -188,6 +192,9 @@ void _User_extensions_Iterate(
}
_User_extensions_Acquire( &lock_context );
+#ifdef BSP_NIOS2_USE_MPU
+ uint32_t config = _Nios2_MPU_Disable();
+#endif
_Chain_Iterator_initialize(
&_User_extensions_List.Active,
@@ -206,12 +213,18 @@ void _User_extensions_Iterate(
_Chain_Iterator_set_position( &iter.Iterator, node );
+#ifdef BSP_NIOS2_USE_MPU
+ _Nios2_MPU_Restore( config );
+#endif
_User_extensions_Release( &lock_context );
extension = (const User_extensions_Control *) node;
( *visitor )( executing, arg, &extension->Callouts );
_User_extensions_Acquire( &lock_context );
+#ifdef BSP_NIOS2_USE_MPU
+ config = _Nios2_MPU_Disable();
+#endif
}
if ( executing != NULL ) {
@@ -220,6 +233,9 @@ void _User_extensions_Iterate(
_Chain_Iterator_destroy( &iter.Iterator );
+#ifdef BSP_NIOS2_USE_MPU
+ _Nios2_MPU_Restore( config );
+#endif
_User_extensions_Release( &lock_context );
if ( direction == CHAIN_ITERATOR_BACKWARD ) {
> The other possibility is to access the last blocked thread and disable
> memory protection just for the stack of this thread (as inter-stack
> access of the previously blocked thread takes place during iteration).
> How to get access to the queue of blocked threads? And is this method
> feasible?
The system doesn't know the last blocked thread currently. I am not sure
if knowing the last blocked thread helps you here.
--
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber at embedded-brains.de
phone: +49-89-18 94 741 - 16
fax: +49-89-18 94 741 - 08
Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/
More information about the devel
mailing list