summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src/signalcatch.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/rtems/src/signalcatch.c')
-rw-r--r--cpukit/rtems/src/signalcatch.c15
1 files changed, 15 insertions, 0 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;