mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-26 14:18:20 +00:00
rtems: New errors for rtems_signal_catch()
Ensure that no invalid modes are set during ASR processing. Update #4244.
This commit is contained in:
@@ -19,6 +19,9 @@
|
||||
#define _RTEMS_RTEMS_MODESIMPL_H
|
||||
|
||||
#include <rtems/rtems/modes.h>
|
||||
#include <rtems/score/schedulerimpl.h>
|
||||
#include <rtems/score/smpimpl.h>
|
||||
#include <rtems/score/threadimpl.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -85,6 +88,51 @@ RTEMS_INLINE_ROUTINE ISR_Level _Modes_Get_interrupt_level (
|
||||
return ( mode_set & RTEMS_INTERRUPT_MASK );
|
||||
}
|
||||
|
||||
#if defined(RTEMS_SMP) || CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
|
||||
/**
|
||||
* @brief Checks if support for the interrupt level is implemented.
|
||||
*
|
||||
* @param mode_set is the mode set which specifies the interrupt level to
|
||||
* check.
|
||||
*
|
||||
* @return Returns true, if support for the interrupt level is implemented,
|
||||
* otherwise returns false.
|
||||
*/
|
||||
RTEMS_INLINE_ROUTINE bool _Modes_Is_interrupt_level_supported(
|
||||
rtems_mode mode_set
|
||||
)
|
||||
{
|
||||
return _Modes_Get_interrupt_level( mode_set ) == 0
|
||||
#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == FALSE
|
||||
|| !_SMP_Need_inter_processor_interrupts()
|
||||
#endif
|
||||
;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(RTEMS_SMP)
|
||||
/**
|
||||
* @brief Checks if support for the preempt mode is implemented.
|
||||
*
|
||||
* @param mode_set is the mode set which specifies the preempt mode to check.
|
||||
*
|
||||
* @param the_thread is the thread to check.
|
||||
*
|
||||
* @return Returns true, if support for the preempt mode is implemented,
|
||||
* otherwise returns false.
|
||||
*/
|
||||
RTEMS_INLINE_ROUTINE bool _Modes_Is_preempt_mode_supported(
|
||||
rtems_mode mode_set,
|
||||
const Thread_Control *the_thread
|
||||
)
|
||||
{
|
||||
return _Modes_Is_preempt( mode_set ) ||
|
||||
_Scheduler_Is_non_preempt_mode_supported(
|
||||
_Thread_Scheduler_get_home( the_thread )
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user