summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-02-16 10:27:03 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-02-20 15:18:49 +0100
commit8778a0e1188ee00932ce47d410de54c4e053f3bf (patch)
tree0b13db8c7cd801c83df772e54e21a1828329814e /cpukit/rtems
parentrtems: Remove _Modes_Set_interrupt_level() (diff)
downloadrtems-8778a0e1188ee00932ce47d410de54c4e053f3bf.tar.bz2
rtems: New errors for rtems_signal_catch()
Ensure that no invalid modes are set during ASR processing. Update #4244.
Diffstat (limited to 'cpukit/rtems')
-rw-r--r--cpukit/rtems/src/signalcatch.c15
-rw-r--r--cpukit/rtems/src/taskmode.c14
2 files changed, 19 insertions, 10 deletions
diff --git a/cpukit/rtems/src/signalcatch.c b/cpukit/rtems/src/signalcatch.c
index 8ee22e5ec1..e80d2c082a 100644
--- a/cpukit/rtems/src/signalcatch.c
+++ b/cpukit/rtems/src/signalcatch.c
@@ -22,6 +22,7 @@
#endif
#include <rtems/rtems/signalimpl.h>
+#include <rtems/rtems/modesimpl.h>
#include <rtems/rtems/tasksdata.h>
#include <rtems/score/threadimpl.h>
@@ -37,7 +38,21 @@ rtems_status_code rtems_signal_catch(
ASR_Information *asr;
ISR_lock_Context lock_context;
+#if defined(RTEMS_SMP) || CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ if ( !_Modes_Is_interrupt_level_supported( mode_set ) ) {
+ return RTEMS_NOT_IMPLEMENTED;
+ }
+#endif
+
executing = _Thread_State_acquire_for_executing( &lock_context );
+
+#if defined(RTEMS_SMP)
+ if ( !_Modes_Is_preempt_mode_supported( mode_set, executing ) ) {
+ _Thread_State_release( executing, &lock_context );
+ return RTEMS_NOT_IMPLEMENTED;
+ }
+#endif
+
api = executing->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
asr->handler = asr_handler;
diff --git a/cpukit/rtems/src/taskmode.c b/cpukit/rtems/src/taskmode.c
index e1748bc7bd..6ca4e99fc6 100644
--- a/cpukit/rtems/src/taskmode.c
+++ b/cpukit/rtems/src/taskmode.c
@@ -50,11 +50,8 @@ rtems_status_code rtems_task_mode(
#if defined(RTEMS_SMP)
if (
- ( mask & RTEMS_PREEMPT_MASK ) != 0
- && !_Modes_Is_preempt( mode_set )
- && !_Scheduler_Is_non_preempt_mode_supported(
- _Thread_Scheduler_get_home( executing )
- )
+ ( mask & RTEMS_PREEMPT_MASK ) != 0 &&
+ !_Modes_Is_preempt_mode_supported( mode_set, executing )
) {
return RTEMS_NOT_IMPLEMENTED;
}
@@ -62,11 +59,8 @@ rtems_status_code rtems_task_mode(
#if defined(RTEMS_SMP) || CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
if (
- ( mask & RTEMS_INTERRUPT_MASK ) != 0
- && _Modes_Get_interrupt_level( mode_set ) != 0
-#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == FALSE
- && _SMP_Need_inter_processor_interrupts()
-#endif
+ ( mask & RTEMS_INTERRUPT_MASK ) != 0 &&
+ !_Modes_Is_interrupt_level_supported( mode_set )
) {
return RTEMS_NOT_IMPLEMENTED;
}