diff options
Diffstat (limited to 'c')
97 files changed, 1415 insertions, 474 deletions
diff --git a/c/src/exec/libcsupport/src/libio.c b/c/src/exec/libcsupport/src/libio.c index ce41643a09..f2046501ce 100644 --- a/c/src/exec/libcsupport/src/libio.c +++ b/c/src/exec/libcsupport/src/libio.c @@ -111,10 +111,13 @@ rtems_libio_init(void) rtems_libio_last_iop = rtems_libio_iops + (rtems_libio_number_iops - 1); } - rc = rtems_semaphore_create(RTEMS_LIBIO_SEM, - 1, - RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, - &rtems_libio_semaphore); + rc = rtems_semaphore_create( + RTEMS_LIBIO_SEM, + 1, + RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, + RTEMS_NO_PRIORITY, + &rtems_libio_semaphore + ); if (rc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred(rc); } @@ -199,9 +202,13 @@ rtems_libio_allocate(void) * Got one; create a semaphore for it */ - rc = rtems_semaphore_create(RTEMS_LIBIO_IOP_SEM(iop - rtems_libio_iops), - 1, RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, - &iop->sem); + rc = rtems_semaphore_create( + RTEMS_LIBIO_IOP_SEM(iop - rtems_libio_iops), + 1, + RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, + RTEMS_NO_PRIORITY, + &iop->sem + ); if (rc != RTEMS_SUCCESSFUL) goto failed; diff --git a/c/src/exec/rtems/headers/asr.h b/c/src/exec/rtems/headers/asr.h index 44d03f2802..b2147f8df4 100644 --- a/c/src/exec/rtems/headers/asr.h +++ b/c/src/exec/rtems/headers/asr.h @@ -54,11 +54,11 @@ typedef rtems_asr ( *rtems_asr_entry )( */ typedef struct { - rtems_asr_entry handler; /* address of RTEMS_ASR */ - rtems_mode mode_set; /* RTEMS_ASR mode */ - rtems_signal_set signals_posted; /* signal set */ - rtems_signal_set signals_pending; /* pending signal set */ - unsigned32 nest_level; /* nest level of RTEMS_ASR */ + rtems_asr_entry handler; /* address of RTEMS_ASR */ + Modes_Control mode_set; /* RTEMS_ASR mode */ + rtems_signal_set signals_posted; /* signal set */ + rtems_signal_set signals_pending; /* pending signal set */ + unsigned32 nest_level; /* nest level of RTEMS_ASR */ } ASR_Information; /* diff --git a/c/src/exec/rtems/headers/attr.h b/c/src/exec/rtems/headers/attr.h index a94343e164..950d77f73d 100644 --- a/c/src/exec/rtems/headers/attr.h +++ b/c/src/exec/rtems/headers/attr.h @@ -27,7 +27,7 @@ typedef unsigned32 rtems_attribute; /* constants */ -#define RTEMS_DEFAULT_ATTRIBUTES 0x00000000 +#define RTEMS_DEFAULT_ATTRIBUTES 0x00000000 #define RTEMS_NO_FLOATING_POINT 0x00000000 /* don't use FP HW */ #define RTEMS_FLOATING_POINT 0x00000001 /* utilize coprocessor */ diff --git a/c/src/exec/rtems/headers/modes.h b/c/src/exec/rtems/headers/modes.h index 9e714591ab..b3b05b3f85 100644 --- a/c/src/exec/rtems/headers/modes.h +++ b/c/src/exec/rtems/headers/modes.h @@ -28,7 +28,7 @@ extern "C" { * each a mode set. */ -typedef unsigned32 rtems_mode; +typedef unsigned32 Modes_Control; /* * The following constants define the individual modes and masks @@ -73,7 +73,7 @@ typedef unsigned32 rtems_mode; */ STATIC INLINE unsigned32 RTEMS_INTERRUPT_LEVEL ( - rtems_mode mode_set + Modes_Control mode_set ); /* @@ -86,8 +86,8 @@ STATIC INLINE unsigned32 RTEMS_INTERRUPT_LEVEL ( */ STATIC INLINE boolean _Modes_Mask_changed ( - rtems_mode mode_set, - rtems_mode masks + Modes_Control mode_set, + Modes_Control masks ); /* @@ -100,7 +100,7 @@ STATIC INLINE boolean _Modes_Mask_changed ( */ STATIC INLINE boolean _Modes_Is_asr_disabled ( - rtems_mode mode_set + Modes_Control mode_set ); /* @@ -113,7 +113,7 @@ STATIC INLINE boolean _Modes_Is_asr_disabled ( */ STATIC INLINE boolean _Modes_Is_preempt ( - rtems_mode mode_set + Modes_Control mode_set ); /* @@ -126,7 +126,7 @@ STATIC INLINE boolean _Modes_Is_preempt ( */ STATIC INLINE boolean _Modes_Is_timeslice ( - rtems_mode mode_set + Modes_Control mode_set ); /* @@ -138,7 +138,7 @@ STATIC INLINE boolean _Modes_Is_timeslice ( */ STATIC INLINE ISR_Level _Modes_Get_interrupt_level ( - rtems_mode mode_set + Modes_Control mode_set ); /* @@ -151,7 +151,7 @@ STATIC INLINE ISR_Level _Modes_Get_interrupt_level ( */ STATIC INLINE void _Modes_Set_interrupt_level ( - rtems_mode mode_set + Modes_Control mode_set ); /* @@ -166,11 +166,11 @@ STATIC INLINE void _Modes_Set_interrupt_level ( */ STATIC INLINE void _Modes_Change ( - rtems_mode old_mode_set, - rtems_mode new_mode_set, - rtems_mode mask, - rtems_mode *out_mode_set, - rtems_mode *changed + Modes_Control old_mode_set, + Modes_Control new_mode_set, + Modes_Control mask, + Modes_Control *out_mode_set, + Modes_Control *changed ); #include <rtems/modes.inl> diff --git a/c/src/exec/rtems/headers/sem.h b/c/src/exec/rtems/headers/sem.h index e70253dcb1..ff8abbc773 100644 --- a/c/src/exec/rtems/headers/sem.h +++ b/c/src/exec/rtems/headers/sem.h @@ -82,10 +82,11 @@ void _Semaphore_Manager_initialization( */ rtems_status_code rtems_semaphore_create( - rtems_name name, - unsigned32 count, - rtems_attribute attribute_set, - Objects_Id *id + rtems_name name, + unsigned32 count, + rtems_attribute attribute_set, + rtems_task_priority priority_ceiling, + Objects_Id *id ); /* diff --git a/c/src/exec/rtems/headers/signal.h b/c/src/exec/rtems/headers/signal.h index 2466a8f931..74ff4a57fb 100644 --- a/c/src/exec/rtems/headers/signal.h +++ b/c/src/exec/rtems/headers/signal.h @@ -31,6 +31,7 @@ extern "C" { #include <rtems/modes.h> #include <rtems/object.h> #include <rtems/status.h> +#include <rtems/types.h> /* * rtems_signal_catch @@ -45,7 +46,7 @@ extern "C" { rtems_status_code rtems_signal_catch( rtems_asr_entry asr_handler, - rtems_mode mode_set + rtems_mode mode_set ); /* diff --git a/c/src/exec/rtems/headers/tasks.h b/c/src/exec/rtems/headers/tasks.h index 2f1021f8c9..df623fe175 100644 --- a/c/src/exec/rtems/headers/tasks.h +++ b/c/src/exec/rtems/headers/tasks.h @@ -47,6 +47,7 @@ extern "C" { #include <rtems/states.h> #include <rtems/thread.h> #include <rtems/threadq.h> +#include <rtems/types.h> /* * Constant to be used as the ID of current task @@ -94,12 +95,12 @@ void _RTEMS_tasks_Manager_initialization( */ rtems_status_code rtems_task_create( - rtems_name name, - rtems_task_priority initial_priority, - unsigned32 stack_size, - rtems_mode initial_modes, - rtems_attribute attribute_set, - Objects_Id *id + rtems_name name, + rtems_task_priority initial_priority, + unsigned32 stack_size, + rtems_mode initial_modes, + rtems_attribute attribute_set, + Objects_Id *id ); /* @@ -237,7 +238,7 @@ rtems_status_code rtems_task_resume( */ rtems_status_code rtems_task_set_priority( - Objects_Id id, + Objects_Id id, rtems_task_priority new_priority, rtems_task_priority *old_priority ); @@ -324,6 +325,18 @@ STATIC INLINE void _RTEMS_tasks_Cancel_wait( Thread_Control *the_thread ); +/* + * _RTEMS_Tasks_Priority_to_Core + * + * DESCRIPTION: + * + * This function converts an RTEMS API priority into a core priority. + */ + +STATIC INLINE Priority_Control _RTEMS_Tasks_Priority_to_Core( + rtems_task_priority priority +); + #include <rtems/tasks.inl> #include <rtems/taskmp.h> diff --git a/c/src/exec/rtems/headers/types.h b/c/src/exec/rtems/headers/types.h index 2a5cb6f4fd..e4d7c11065 100644 --- a/c/src/exec/rtems/headers/types.h +++ b/c/src/exec/rtems/headers/types.h @@ -21,6 +21,8 @@ extern "C" { #endif #include <rtems/object.h> +#include <rtems/priority.h> +#include <rtems/modes.h> /* * RTEMS basic type definitions @@ -48,6 +50,19 @@ typedef Context_Control rtems_context; typedef Context_Control_fp rtems_context_fp; typedef CPU_Interrupt_frame rtems_interrupt_frame; +/* + * Define the type for an RTEMS API task priority. + */ + +typedef Priority_Control rtems_task_priority; + +#define RTEMS_NO_PRIORITY RTEMS_CURRENT_PRIORITY +/* + * Define the type for an RTEMS API task mode. + */ + +typedef Modes_Control rtems_mode; + #ifdef __cplusplus } #endif diff --git a/c/src/exec/rtems/include/rtems/rtems/asr.h b/c/src/exec/rtems/include/rtems/rtems/asr.h index 44d03f2802..b2147f8df4 100644 --- a/c/src/exec/rtems/include/rtems/rtems/asr.h +++ b/c/src/exec/rtems/include/rtems/rtems/asr.h @@ -54,11 +54,11 @@ typedef rtems_asr ( *rtems_asr_entry )( */ typedef struct { - rtems_asr_entry handler; /* address of RTEMS_ASR */ - rtems_mode mode_set; /* RTEMS_ASR mode */ - rtems_signal_set signals_posted; /* signal set */ - rtems_signal_set signals_pending; /* pending signal set */ - unsigned32 nest_level; /* nest level of RTEMS_ASR */ + rtems_asr_entry handler; /* address of RTEMS_ASR */ + Modes_Control mode_set; /* RTEMS_ASR mode */ + rtems_signal_set signals_posted; /* signal set */ + rtems_signal_set signals_pending; /* pending signal set */ + unsigned32 nest_level; /* nest level of RTEMS_ASR */ } ASR_Information; /* diff --git a/c/src/exec/rtems/include/rtems/rtems/attr.h b/c/src/exec/rtems/include/rtems/rtems/attr.h index a94343e164..950d77f73d 100644 --- a/c/src/exec/rtems/include/rtems/rtems/attr.h +++ b/c/src/exec/rtems/include/rtems/rtems/attr.h @@ -27,7 +27,7 @@ typedef unsigned32 rtems_attribute; /* constants */ -#define RTEMS_DEFAULT_ATTRIBUTES 0x00000000 +#define RTEMS_DEFAULT_ATTRIBUTES 0x00000000 #define RTEMS_NO_FLOATING_POINT 0x00000000 /* don't use FP HW */ #define RTEMS_FLOATING_POINT 0x00000001 /* utilize coprocessor */ diff --git a/c/src/exec/rtems/include/rtems/rtems/modes.h b/c/src/exec/rtems/include/rtems/rtems/modes.h index 9e714591ab..b3b05b3f85 100644 --- a/c/src/exec/rtems/include/rtems/rtems/modes.h +++ b/c/src/exec/rtems/include/rtems/rtems/modes.h @@ -28,7 +28,7 @@ extern "C" { * each a mode set. */ -typedef unsigned32 rtems_mode; +typedef unsigned32 Modes_Control; /* * The following constants define the individual modes and masks @@ -73,7 +73,7 @@ typedef unsigned32 rtems_mode; */ STATIC INLINE unsigned32 RTEMS_INTERRUPT_LEVEL ( - rtems_mode mode_set + Modes_Control mode_set ); /* @@ -86,8 +86,8 @@ STATIC INLINE unsigned32 RTEMS_INTERRUPT_LEVEL ( */ STATIC INLINE boolean _Modes_Mask_changed ( - rtems_mode mode_set, - rtems_mode masks + Modes_Control mode_set, + Modes_Control masks ); /* @@ -100,7 +100,7 @@ STATIC INLINE boolean _Modes_Mask_changed ( */ STATIC INLINE boolean _Modes_Is_asr_disabled ( - rtems_mode mode_set + Modes_Control mode_set ); /* @@ -113,7 +113,7 @@ STATIC INLINE boolean _Modes_Is_asr_disabled ( */ STATIC INLINE boolean _Modes_Is_preempt ( - rtems_mode mode_set + Modes_Control mode_set ); /* @@ -126,7 +126,7 @@ STATIC INLINE boolean _Modes_Is_preempt ( */ STATIC INLINE boolean _Modes_Is_timeslice ( - rtems_mode mode_set + Modes_Control mode_set ); /* @@ -138,7 +138,7 @@ STATIC INLINE boolean _Modes_Is_timeslice ( */ STATIC INLINE ISR_Level _Modes_Get_interrupt_level ( - rtems_mode mode_set + Modes_Control mode_set ); /* @@ -151,7 +151,7 @@ STATIC INLINE ISR_Level _Modes_Get_interrupt_level ( */ STATIC INLINE void _Modes_Set_interrupt_level ( - rtems_mode mode_set + Modes_Control mode_set ); /* @@ -166,11 +166,11 @@ STATIC INLINE void _Modes_Set_interrupt_level ( */ STATIC INLINE void _Modes_Change ( - rtems_mode old_mode_set, - rtems_mode new_mode_set, - rtems_mode mask, - rtems_mode *out_mode_set, - rtems_mode *changed + Modes_Control old_mode_set, + Modes_Control new_mode_set, + Modes_Control mask, + Modes_Control *out_mode_set, + Modes_Control *changed ); #include <rtems/modes.inl> diff --git a/c/src/exec/rtems/include/rtems/rtems/sem.h b/c/src/exec/rtems/include/rtems/rtems/sem.h index e70253dcb1..ff8abbc773 100644 --- a/c/src/exec/rtems/include/rtems/rtems/sem.h +++ b/c/src/exec/rtems/include/rtems/rtems/sem.h @@ -82,10 +82,11 @@ void _Semaphore_Manager_initialization( */ rtems_status_code rtems_semaphore_create( - rtems_name name, - unsigned32 count, - rtems_attribute attribute_set, - Objects_Id *id + rtems_name name, + unsigned32 count, + rtems_attribute attribute_set, + rtems_task_priority priority_ceiling, + Objects_Id *id ); /* diff --git a/c/src/exec/rtems/include/rtems/rtems/signal.h b/c/src/exec/rtems/include/rtems/rtems/signal.h index 2466a8f931..74ff4a57fb 100644 --- a/c/src/exec/rtems/include/rtems/rtems/signal.h +++ b/c/src/exec/rtems/include/rtems/rtems/signal.h @@ -31,6 +31,7 @@ extern "C" { #include <rtems/modes.h> #include <rtems/object.h> #include <rtems/status.h> +#include <rtems/types.h> /* * rtems_signal_catch @@ -45,7 +46,7 @@ extern "C" { rtems_status_code rtems_signal_catch( rtems_asr_entry asr_handler, - rtems_mode mode_set + rtems_mode mode_set ); /* diff --git a/c/src/exec/rtems/include/rtems/rtems/tasks.h b/c/src/exec/rtems/include/rtems/rtems/tasks.h index 2f1021f8c9..df623fe175 100644 --- a/c/src/exec/rtems/include/rtems/rtems/tasks.h +++ b/c/src/exec/rtems/include/rtems/rtems/tasks.h @@ -47,6 +47,7 @@ extern "C" { #include <rtems/states.h> #include <rtems/thread.h> #include <rtems/threadq.h> +#include <rtems/types.h> /* * Constant to be used as the ID of current task @@ -94,12 +95,12 @@ void _RTEMS_tasks_Manager_initialization( */ rtems_status_code rtems_task_create( - rtems_name name, - rtems_task_priority initial_priority, - unsigned32 stack_size, - rtems_mode initial_modes, - rtems_attribute attribute_set, - Objects_Id *id + rtems_name name, + rtems_task_priority initial_priority, + unsigned32 stack_size, + rtems_mode initial_modes, + rtems_attribute attribute_set, + Objects_Id *id ); /* @@ -237,7 +238,7 @@ rtems_status_code rtems_task_resume( */ rtems_status_code rtems_task_set_priority( - Objects_Id id, + Objects_Id id, rtems_task_priority new_priority, rtems_task_priority *old_priority ); @@ -324,6 +325,18 @@ STATIC INLINE void _RTEMS_tasks_Cancel_wait( Thread_Control *the_thread ); +/* + * _RTEMS_Tasks_Priority_to_Core + * + * DESCRIPTION: + * + * This function converts an RTEMS API priority into a core priority. + */ + +STATIC INLINE Priority_Control _RTEMS_Tasks_Priority_to_Core( + rtems_task_priority priority +); + #include <rtems/tasks.inl> #include <rtems/taskmp.h> diff --git a/c/src/exec/rtems/include/rtems/rtems/types.h b/c/src/exec/rtems/include/rtems/rtems/types.h index 2a5cb6f4fd..e4d7c11065 100644 --- a/c/src/exec/rtems/include/rtems/rtems/types.h +++ b/c/src/exec/rtems/include/rtems/rtems/types.h @@ -21,6 +21,8 @@ extern "C" { #endif #include <rtems/object.h> +#include <rtems/priority.h> +#include <rtems/modes.h> /* * RTEMS basic type definitions @@ -48,6 +50,19 @@ typedef Context_Control rtems_context; typedef Context_Control_fp rtems_context_fp; typedef CPU_Interrupt_frame rtems_interrupt_frame; +/* + * Define the type for an RTEMS API task priority. + */ + +typedef Priority_Control rtems_task_priority; + +#define RTEMS_NO_PRIORITY RTEMS_CURRENT_PRIORITY +/* + * Define the type for an RTEMS API task mode. + */ + +typedef Modes_Control rtems_mode; + #ifdef __cplusplus } #endif diff --git a/c/src/exec/rtems/inline/modes.inl b/c/src/exec/rtems/inline/modes.inl index 6331a18a3a..8fe964e8d8 100644 --- a/c/src/exec/rtems/inline/modes.inl +++ b/c/src/exec/rtems/inline/modes.inl @@ -23,7 +23,7 @@ */ STATIC INLINE unsigned32 RTEMS_INTERRUPT_LEVEL ( - rtems_mode mode_set + Modes_Control mode_set ) { return mode_set & RTEMS_INTERRUPT_MASK; @@ -36,8 +36,8 @@ STATIC INLINE unsigned32 RTEMS_INTERRUPT_LEVEL ( */ STATIC INLINE boolean _Modes_Mask_changed ( - rtems_mode mode_set, - rtems_mode masks + Modes_Control mode_set, + Modes_Control masks ) { return ( mode_set & masks ); @@ -50,7 +50,7 @@ STATIC INLINE boolean _Modes_Mask_changed ( */ STATIC INLINE boolean _Modes_Is_asr_disabled ( - rtems_mode mode_set + Modes_Control mode_set ) { return ( mode_set & RTEMS_ASR_MASK ); @@ -63,7 +63,7 @@ STATIC INLINE boolean _Modes_Is_asr_disabled ( */ STATIC INLINE boolean _Modes_Is_preempt ( - rtems_mode mode_set + Modes_Control mode_set ) { return ( ( mode_set & RTEMS_PREEMPT_MASK ) == RTEMS_PREEMPT ); @@ -76,7 +76,7 @@ STATIC INLINE boolean _Modes_Is_preempt ( */ STATIC INLINE boolean _Modes_Is_timeslice ( - rtems_mode mode_set + Modes_Control mode_set ) { return ((mode_set & (RTEMS_TIMESLICE_MASK|RTEMS_PREEMPT_MASK)) == @@ -90,7 +90,7 @@ STATIC INLINE boolean _Modes_Is_timeslice ( */ STATIC INLINE ISR_Level _Modes_Get_interrupt_level ( - rtems_mode mode_set + Modes_Control mode_set ) { return ( mode_set & RTEMS_INTERRUPT_MASK ); @@ -103,7 +103,7 @@ STATIC INLINE ISR_Level _Modes_Get_interrupt_level ( */ STATIC INLINE void _Modes_Set_interrupt_level ( - rtems_mode mode_set + Modes_Control mode_set ) { _ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) ); @@ -116,14 +116,14 @@ STATIC INLINE void _Modes_Set_interrupt_level ( */ STATIC INLINE void _Modes_Change ( - rtems_mode old_mode_set, - rtems_mode new_mode_set, - rtems_mode mask, - rtems_mode *out_mode_set, - rtems_mode *changed + Modes_Control old_mode_set, + Modes_Control new_mode_set, + Modes_Control mask, + Modes_Control *out_mode_set, + Modes_Control *changed ) { - rtems_mode _out_mode; + Modes_Control _out_mode; _out_mode = old_mode_set; _out_mode &= ~mask; diff --git a/c/src/exec/rtems/inline/rtems/rtems/modes.inl b/c/src/exec/rtems/inline/rtems/rtems/modes.inl index 6331a18a3a..8fe964e8d8 100644 --- a/c/src/exec/rtems/inline/rtems/rtems/modes.inl +++ b/c/src/exec/rtems/inline/rtems/rtems/modes.inl @@ -23,7 +23,7 @@ */ STATIC INLINE unsigned32 RTEMS_INTERRUPT_LEVEL ( - rtems_mode mode_set + Modes_Control mode_set ) { return mode_set & RTEMS_INTERRUPT_MASK; @@ -36,8 +36,8 @@ STATIC INLINE unsigned32 RTEMS_INTERRUPT_LEVEL ( */ STATIC INLINE boolean _Modes_Mask_changed ( - rtems_mode mode_set, - rtems_mode masks + Modes_Control mode_set, + Modes_Control masks ) { return ( mode_set & masks ); @@ -50,7 +50,7 @@ STATIC INLINE boolean _Modes_Mask_changed ( */ STATIC INLINE boolean _Modes_Is_asr_disabled ( - rtems_mode mode_set + Modes_Control mode_set ) { return ( mode_set & RTEMS_ASR_MASK ); @@ -63,7 +63,7 @@ STATIC INLINE boolean _Modes_Is_asr_disabled ( */ STATIC INLINE boolean _Modes_Is_preempt ( - rtems_mode mode_set + Modes_Control mode_set ) { return ( ( mode_set & RTEMS_PREEMPT_MASK ) == RTEMS_PREEMPT ); @@ -76,7 +76,7 @@ STATIC INLINE boolean _Modes_Is_preempt ( */ STATIC INLINE boolean _Modes_Is_timeslice ( - rtems_mode mode_set + Modes_Control mode_set ) { return ((mode_set & (RTEMS_TIMESLICE_MASK|RTEMS_PREEMPT_MASK)) == @@ -90,7 +90,7 @@ STATIC INLINE boolean _Modes_Is_timeslice ( */ STATIC INLINE ISR_Level _Modes_Get_interrupt_level ( - rtems_mode mode_set + Modes_Control mode_set ) { return ( mode_set & RTEMS_INTERRUPT_MASK ); @@ -103,7 +103,7 @@ STATIC INLINE ISR_Level _Modes_Get_interrupt_level ( */ STATIC INLINE void _Modes_Set_interrupt_level ( - rtems_mode mode_set + Modes_Control mode_set ) { _ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) ); @@ -116,14 +116,14 @@ STATIC INLINE void _Modes_Set_interrupt_level ( */ STATIC INLINE void _Modes_Change ( - rtems_mode old_mode_set, - rtems_mode new_mode_set, - rtems_mode mask, - rtems_mode *out_mode_set, - rtems_mode *changed + Modes_Control old_mode_set, + Modes_Control new_mode_set, + Modes_Control mask, + Modes_Control *out_mode_set, + Modes_Control *changed ) { - rtems_mode _out_mode; + Modes_Control _out_mode; _out_mode = old_mode_set; _out_mode &= ~mask; diff --git a/c/src/exec/rtems/inline/rtems/rtems/tasks.inl b/c/src/exec/rtems/inline/rtems/rtems/tasks.inl index d392b8b370..2aec654571 100644 --- a/c/src/exec/rtems/inline/rtems/rtems/tasks.inl +++ b/c/src/exec/rtems/inline/rtems/rtems/tasks.inl @@ -43,7 +43,10 @@ STATIC INLINE void _RTEMS_tasks_Free ( Thread_Control *the_task ) { - _Objects_Free( &_RTEMS_tasks_Information, &the_task->Object ); + _Objects_Free( + _Objects_Get_information( the_task->Object.id ), + &the_task->Object + ); } /*PAGE @@ -61,6 +64,7 @@ STATIC INLINE void _RTEMS_tasks_Cancel_wait( state = the_thread->current_state; +/* XXX do this with the object class */ if ( _States_Is_waiting_on_thread_queue( state ) ) { if ( _States_Is_waiting_for_rpc_reply( state ) && _States_Is_locally_blocked( state ) ) { @@ -91,5 +95,17 @@ STATIC INLINE void _RTEMS_tasks_Cancel_wait( (void) _Watchdog_Remove( &the_thread->Timer ); } +/*PAGE + * + * _RTEMS_Tasks_Priority_to_Core + */ + +STATIC INLINE Priority_Control _RTEMS_Tasks_Priority_to_Core( + rtems_task_priority priority +) +{ + return (Priority_Control) priority; +} + #endif /* end of include file */ diff --git a/c/src/exec/rtems/inline/tasks.inl b/c/src/exec/rtems/inline/tasks.inl index d392b8b370..2aec654571 100644 --- a/c/src/exec/rtems/inline/tasks.inl +++ b/c/src/exec/rtems/inline/tasks.inl @@ -43,7 +43,10 @@ STATIC INLINE void _RTEMS_tasks_Free ( Thread_Control *the_task ) { - _Objects_Free( &_RTEMS_tasks_Information, &the_task->Object ); + _Objects_Free( + _Objects_Get_information( the_task->Object.id ), + &the_task->Object + ); } /*PAGE @@ -61,6 +64,7 @@ STATIC INLINE void _RTEMS_tasks_Cancel_wait( state = the_thread->current_state; +/* XXX do this with the object class */ if ( _States_Is_waiting_on_thread_queue( state ) ) { if ( _States_Is_waiting_for_rpc_reply( state ) && _States_Is_locally_blocked( state ) ) { @@ -91,5 +95,17 @@ STATIC INLINE void _RTEMS_tasks_Cancel_wait( (void) _Watchdog_Remove( &the_thread->Timer ); } +/*PAGE + * + * _RTEMS_Tasks_Priority_to_Core + */ + +STATIC INLINE Priority_Control _RTEMS_Tasks_Priority_to_Core( + rtems_task_priority priority +) +{ + return (Priority_Control) priority; +} + #endif /* end of include file */ diff --git a/c/src/exec/rtems/macros/modes.inl b/c/src/exec/rtems/macros/modes.inl index f8ac061dce..4c8b35a1e8 100644 --- a/c/src/exec/rtems/macros/modes.inl +++ b/c/src/exec/rtems/macros/modes.inl @@ -88,7 +88,7 @@ #define _Modes_Change( _old_mode_set, _new_mode_set, \ _mask, _out_mode_set, _changed ) \ - { rtems_mode _out_mode; \ + { Modes_Control _out_mode; \ \ _out_mode = (_old_mode_set); \ _out_mode &= ~(_mask); \ diff --git a/c/src/exec/rtems/macros/rtems/rtems/modes.inl b/c/src/exec/rtems/macros/rtems/rtems/modes.inl index f8ac061dce..4c8b35a1e8 100644 --- a/c/src/exec/rtems/macros/rtems/rtems/modes.inl +++ b/c/src/exec/rtems/macros/rtems/rtems/modes.inl @@ -88,7 +88,7 @@ #define _Modes_Change( _old_mode_set, _new_mode_set, \ _mask, _out_mode_set, _changed ) \ - { rtems_mode _out_mode; \ + { Modes_Control _out_mode; \ \ _out_mode = (_old_mode_set); \ _out_mode &= ~(_mask); \ diff --git a/c/src/exec/rtems/macros/rtems/rtems/tasks.inl b/c/src/exec/rtems/macros/rtems/rtems/tasks.inl index 778d4867ca..243d0addc7 100644 --- a/c/src/exec/rtems/macros/rtems/rtems/tasks.inl +++ b/c/src/exec/rtems/macros/rtems/rtems/tasks.inl @@ -83,5 +83,13 @@ (void) _Watchdog_Remove( &(_the_thread)->Timer ); \ } +/*PAGE + * + * _RTEMS_Tasks_Priority_to_Core + */ + +#define _RTEMS_Tasks_Priority_to_Core( _priority ) \ + ((Priority_Control) (_priority)) + #endif /* end of include file */ diff --git a/c/src/exec/rtems/macros/tasks.inl b/c/src/exec/rtems/macros/tasks.inl index 778d4867ca..243d0addc7 100644 --- a/c/src/exec/rtems/macros/tasks.inl +++ b/c/src/exec/rtems/macros/tasks.inl @@ -83,5 +83,13 @@ (void) _Watchdog_Remove( &(_the_thread)->Timer ); \ } +/*PAGE + * + * _RTEMS_Tasks_Priority_to_Core + */ + +#define _RTEMS_Tasks_Priority_to_Core( _priority ) \ + ((Priority_Control) (_priority)) + #endif /* end of include file */ diff --git a/c/src/exec/rtems/optman/no-sem.c b/c/src/exec/rtems/optman/no-sem.c index 52f64c0aa5..d96b1693e2 100644 --- a/c/src/exec/rtems/optman/no-sem.c +++ b/c/src/exec/rtems/optman/no-sem.c @@ -31,10 +31,11 @@ void _Semaphore_Manager_initialization( } rtems_status_code rtems_semaphore_create( - rtems_name name, - unsigned32 count, - rtems_attribute attribute_set, - Objects_Id *id + rtems_name name, + unsigned32 count, + rtems_attribute attribute_set, + rtems_task_priority priority_ceiling, + Objects_Id *id ) { return( RTEMS_NOT_CONFIGURED ); diff --git a/c/src/exec/rtems/optman/no-signal.c b/c/src/exec/rtems/optman/no-signal.c index 50f941887c..fedbf87db3 100644 --- a/c/src/exec/rtems/optman/no-signal.c +++ b/c/src/exec/rtems/optman/no-signal.c @@ -22,14 +22,14 @@ rtems_status_code rtems_signal_catch( rtems_asr_entry handler, - rtems_mode mode_set + rtems_mode mode_set ) { return( RTEMS_NOT_CONFIGURED ); } rtems_status_code rtems_signal_send( - Objects_Id id, + rtems_id id, rtems_signal_set signal_set ) { diff --git a/c/src/exec/rtems/src/event.c b/c/src/exec/rtems/src/event.c index 4390d3ee08..ec14c2aaa9 100644 --- a/c/src/exec/rtems/src/event.c +++ b/c/src/exec/rtems/src/event.c @@ -56,7 +56,7 @@ rtems_status_code rtems_event_send( ) ); case OBJECTS_LOCAL: - _Event_sets_Post( event_in, &the_thread->pending_events ); + _Event_sets_Post( event_in, &the_thread->RTEMS_API->pending_events ); _Event_Surrender( the_thread ); _Thread_Enable_dispatch(); return( RTEMS_SUCCESSFUL ); @@ -91,13 +91,13 @@ rtems_status_code rtems_event_receive( ) { if ( _Event_sets_Is_empty( event_in ) ) { - *event_out = _Thread_Executing->pending_events; + *event_out = _Thread_Executing->RTEMS_API->pending_events; return( RTEMS_SUCCESSFUL ); } _Thread_Disable_dispatch(); _Event_Seize( event_in, option_set, ticks ); _Thread_Enable_dispatch(); - *event_out = _Thread_Executing->events_out; + *event_out = _Thread_Executing->RTEMS_API->events_out; return( _Thread_Executing->Wait.return_code ); } diff --git a/c/src/exec/rtems/src/mp.c b/c/src/exec/rtems/src/mp.c index ffa53d1da7..c555ffb3f1 100644 --- a/c/src/exec/rtems/src/mp.c +++ b/c/src/exec/rtems/src/mp.c @@ -58,7 +58,7 @@ void rtems_multiprocessing_announce ( void ) _Thread_Disable_dispatch(); _Event_sets_Post( RTEMS_EVENT_0, - &_Internal_threads_System_initialization_thread->pending_events + &_Internal_threads_System_initialization_thread->RTEMS_API->pending_events ); _Event_Surrender( _Internal_threads_System_initialization_thread ); _Thread_Enable_dispatch(); diff --git a/c/src/exec/rtems/src/msg.c b/c/src/exec/rtems/src/msg.c index 6dfd26a8f0..ff4683f880 100644 --- a/c/src/exec/rtems/src/msg.c +++ b/c/src/exec/rtems/src/msg.c @@ -181,7 +181,7 @@ rtems_status_code rtems_message_queue_create( } if ( _Attributes_Is_global( attribute_set ) && - !( _Objects_MP_Open( &_Message_queue_Information, name, + !( _Objects_MP_Allocate_and_open( &_Message_queue_Information, name, the_message_queue->Object.id, FALSE ) ) ) { _Message_queue_Free( the_message_queue ); _Thread_Enable_dispatch(); @@ -195,8 +195,14 @@ rtems_status_code rtems_message_queue_create( _Chain_Initialize_empty( &the_message_queue->Pending_messages ); - _Thread_queue_Initialize( &the_message_queue->Wait_queue, attribute_set, - STATES_WAITING_FOR_MESSAGE ); + _Thread_queue_Initialize( + &the_message_queue->Wait_queue, + OBJECTS_RTEMS_MESSAGE_QUEUES, + _Attributes_Is_priority( attribute_set ) ? + THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO, + STATES_WAITING_FOR_MESSAGE, + _Message_queue_MP_Send_extract_proxy + ); _Objects_Open( &_Message_queue_Information, diff --git a/c/src/exec/rtems/src/msgmp.c b/c/src/exec/rtems/src/msgmp.c index 37ce2c9453..48e572c43b 100644 --- a/c/src/exec/rtems/src/msgmp.c +++ b/c/src/exec/rtems/src/msgmp.c @@ -259,7 +259,7 @@ void _Message_queue_MP_Process_packet ( case MESSAGE_QUEUE_MP_ANNOUNCE_CREATE: - ignored = _Objects_MP_Open( + ignored = _Objects_MP_Allocate_and_open( &_Message_queue_Information, the_packet->name, the_packet->Prefix.id, diff --git a/c/src/exec/rtems/src/part.c b/c/src/exec/rtems/src/part.c index a7e4308a13..3d21eed416 100644 --- a/c/src/exec/rtems/src/part.c +++ b/c/src/exec/rtems/src/part.c @@ -107,7 +107,7 @@ rtems_status_code rtems_partition_create( } if ( _Attributes_Is_global( attribute_set ) && - !( _Objects_MP_Open( &_Partition_Information, name, + !( _Objects_MP_Allocate_and_open( &_Partition_Information, name, the_partition->Object.id, FALSE ) ) ) { _Partition_Free( the_partition ); _Thread_Enable_dispatch(); diff --git a/c/src/exec/rtems/src/partmp.c b/c/src/exec/rtems/src/partmp.c index 074165777b..0097844183 100644 --- a/c/src/exec/rtems/src/partmp.c +++ b/c/src/exec/rtems/src/partmp.c @@ -184,7 +184,7 @@ void _Partition_MP_Process_packet ( case PARTITION_MP_ANNOUNCE_CREATE: - ignored = _Objects_MP_Open( + ignored = _Objects_MP_Allocate_and_open( &_Partition_Information, the_packet->name, the_packet->Prefix.id, diff --git a/c/src/exec/rtems/src/region.c b/c/src/exec/rtems/src/region.c index b54493eec7..25aca9cda7 100644 --- a/c/src/exec/rtems/src/region.c +++ b/c/src/exec/rtems/src/region.c @@ -113,7 +113,13 @@ rtems_status_code rtems_region_create( the_region->number_of_used_blocks = 0; _Thread_queue_Initialize( - &the_region->Wait_queue, attribute_set, STATES_WAITING_FOR_SEGMENT ); + &the_region->Wait_queue, + OBJECTS_RTEMS_REGIONS, + _Attributes_Is_priority( attribute_set ) ? + THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO, + STATES_WAITING_FOR_SEGMENT, + _Region_MP_Send_extract_proxy + ); _Objects_Open( &_Region_Information, &the_region->Object, &name ); diff --git a/c/src/exec/rtems/src/regionmp.c b/c/src/exec/rtems/src/regionmp.c index 07de556acc..b460e554fe 100644 --- a/c/src/exec/rtems/src/regionmp.c +++ b/c/src/exec/rtems/src/regionmp.c @@ -190,7 +190,7 @@ void _Region_MP_Process_packet ( case REGION_MP_ANNOUNCE_CREATE: - ignored = _Objects_MP_Open( + ignored = _Objects_MP_Allocate_and_open( &_Region_Information, the_packet->name, the_packet->Prefix.id, diff --git a/c/src/exec/rtems/src/sem.c b/c/src/exec/rtems/src/sem.c index d810c205ee..9e87550c31 100644 --- a/c/src/exec/rtems/src/sem.c +++ b/c/src/exec/rtems/src/sem.c @@ -87,10 +87,11 @@ void _Semaphore_Manager_initialization( */ rtems_status_code rtems_semaphore_create( - rtems_name name, - unsigned32 count, - rtems_attribute attribute_set, - Objects_Id *id + rtems_name name, + unsigned32 count, + rtems_attribute attribute_set, + rtems_task_priority priority_ceiling, + Objects_Id *id ) { register Semaphore_Control *the_semaphore; @@ -127,7 +128,7 @@ rtems_status_code rtems_semaphore_create( } if ( _Attributes_Is_global( attribute_set ) && - !( _Objects_MP_Open( &_Semaphore_Information, name, + !( _Objects_MP_Allocate_and_open( &_Semaphore_Information, name, the_semaphore->Object.id, FALSE ) ) ) { _Semaphore_Free( the_semaphore ); _Thread_Enable_dispatch(); @@ -148,8 +149,14 @@ rtems_status_code rtems_semaphore_create( the_semaphore->holder_id = 0; } - _Thread_queue_Initialize( &the_semaphore->Wait_queue, - attribute_set, STATES_WAITING_FOR_SEMAPHORE ); + _Thread_queue_Initialize( + &the_semaphore->Wait_queue, + OBJECTS_RTEMS_SEMAPHORES, + _Attributes_Is_priority( attribute_set ) ? + THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO, + STATES_WAITING_FOR_SEMAPHORE, + _Semaphore_MP_Send_extract_proxy + ); _Objects_Open( &_Semaphore_Information, &the_semaphore->Object, &name ); diff --git a/c/src/exec/rtems/src/semmp.c b/c/src/exec/rtems/src/semmp.c index 3be9fafb5f..03ca51a228 100644 --- a/c/src/exec/rtems/src/semmp.c +++ b/c/src/exec/rtems/src/semmp.c @@ -187,7 +187,7 @@ void _Semaphore_MP_Process_packet ( case SEMAPHORE_MP_ANNOUNCE_CREATE: - ignored = _Objects_MP_Open( + ignored = _Objects_MP_Allocate_and_open( &_Semaphore_Information, the_packet->name, the_packet->Prefix.id, diff --git a/c/src/exec/rtems/src/signal.c b/c/src/exec/rtems/src/signal.c index 411df5d86c..8a300d2969 100644 --- a/c/src/exec/rtems/src/signal.c +++ b/c/src/exec/rtems/src/signal.c @@ -37,22 +37,23 @@ */ rtems_status_code rtems_signal_catch( - rtems_asr_entry handler, - rtems_mode mode_set + rtems_asr_entry asr_handler, + rtems_mode mode_set ) { Thread_Control *executing; +/* XXX normalize mode */ executing = _Thread_Executing; _Thread_Disable_dispatch(); /* cannot reschedule while */ /* the thread is inconsistent */ - if ( ! _ASR_Is_null_handler( handler ) ) { - executing->Signal.mode_set = mode_set; - executing->Signal.handler = handler; + if ( !_ASR_Is_null_handler( asr_handler ) ) { + executing->RTEMS_API->Signal.mode_set = mode_set; + executing->RTEMS_API->Signal.handler = asr_handler; } else - _ASR_Initialize( &executing->Signal ); + _ASR_Initialize( &executing->RTEMS_API->Signal ); _Thread_Enable_dispatch(); return( RTEMS_SUCCESSFUL ); } @@ -91,11 +92,13 @@ rtems_status_code rtems_signal_send( signal_set ); case OBJECTS_LOCAL: - if ( ! _ASR_Is_null_handler( the_thread->Signal.handler ) ) { + if ( ! _ASR_Is_null_handler( the_thread->RTEMS_API->Signal.handler ) ) { if ( _Modes_Is_asr_disabled( the_thread->current_modes ) ) - _ASR_Post_signals( signal_set, &the_thread->Signal.signals_pending ); + _ASR_Post_signals( + signal_set, &the_thread->RTEMS_API->Signal.signals_pending ); else { - _ASR_Post_signals( signal_set, &the_thread->Signal.signals_posted ); + _ASR_Post_signals( + signal_set, &the_thread->RTEMS_API->Signal.signals_posted ); if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) _ISR_Signals_to_thread_executing = TRUE; } diff --git a/c/src/exec/rtems/src/taskmp.c b/c/src/exec/rtems/src/taskmp.c index 003c543c5a..2b7fb214c6 100644 --- a/c/src/exec/rtems/src/taskmp.c +++ b/c/src/exec/rtems/src/taskmp.c @@ -193,7 +193,7 @@ void _RTEMS_tasks_MP_Process_packet ( case RTEMS_TASKS_MP_ANNOUNCE_CREATE: - ignored = _Objects_MP_Open( + ignored = _Objects_MP_Allocate_and_open( &_RTEMS_tasks_Information, the_packet->name, the_packet->Prefix.id, diff --git a/c/src/exec/rtems/src/tasks.c b/c/src/exec/rtems/src/tasks.c index 5574a6633e..62bc8c1995 100644 --- a/c/src/exec/rtems/src/tasks.c +++ b/c/src/exec/rtems/src/tasks.c @@ -86,27 +86,35 @@ rtems_status_code rtems_task_create( ) { register Thread_Control *the_thread; - unsigned32 actual_stack_size; - unsigned32 memory_needed; - void *memory; + Objects_MP_Control *the_global_object = NULL; + boolean is_fp; + boolean is_global; rtems_attribute the_attribute_set; + Priority_Control core_priority; + if ( !rtems_is_name_valid( name ) ) return ( RTEMS_INVALID_NAME ); + /* + * Core Thread Initialize insures we get the minimum amount of + * stack space. + */ + #if 0 if ( !_Stack_Is_enough( stack_size ) ) return( RTEMS_INVALID_SIZE ); #endif - if ( !_Stack_Is_enough( stack_size ) ) - actual_stack_size = RTEMS_MINIMUM_STACK_SIZE; - else - actual_stack_size = stack_size; + /* + * Validate the RTEMS API priority and convert it to the core priority range. + */ if ( !_Priority_Is_valid( initial_priority ) ) return( RTEMS_INVALID_PRIORITY ); + core_priority = _RTEMS_Tasks_Priority_to_Core( initial_priority ); + /* * Fix the attribute set to match the attributes which * this processor (1) requires and (2) is able to support. @@ -120,11 +128,40 @@ rtems_status_code rtems_task_create( the_attribute_set = _Attributes_Clear( the_attribute_set, ATTRIBUTES_NOT_SUPPORTED ); - if ( _Attributes_Is_global( the_attribute_set ) && - !_Configuration_Is_multiprocessing() ) - return( RTEMS_MP_NOT_CONFIGURED ); + if ( _Attributes_Is_floating_point( the_attribute_set ) ) + is_fp = TRUE; + else + is_fp = FALSE; + + if ( _Attributes_Is_global( the_attribute_set ) ) { + + is_global = TRUE; + + if ( !_Configuration_Is_multiprocessing() ) + return( RTEMS_MP_NOT_CONFIGURED ); - _Thread_Disable_dispatch(); /* to prevent deletion */ + } else + is_global = FALSE; + + /* + * Make sure system is MP if this task is global + */ + + /* + * Disable dispatch for protection + */ + + _Thread_Disable_dispatch(); + + /* + * Allocate the thread control block and -- if the task is global -- + * allocate a global object control block. + * + * NOTE: This routine does not use the combined allocate and open + * global object routine because this results in a lack of + * control over when memory is allocated and can be freed in + * the event of an error. + */ the_thread = _RTEMS_tasks_Allocate(); @@ -133,71 +170,71 @@ rtems_status_code rtems_task_create( return( RTEMS_TOO_MANY ); } - actual_stack_size = _Stack_Adjust_size( actual_stack_size ); - memory_needed = actual_stack_size; + if ( is_global ) { + the_global_object = _Objects_MP_Allocate_global_object(); - if ( _Attributes_Is_floating_point( the_attribute_set ) ) - memory_needed += CONTEXT_FP_SIZE; + if ( _Objects_MP_Is_null_global_object( the_global_object ) ) { + _RTEMS_tasks_Free( the_thread ); + _Thread_Enable_dispatch(); + return( RTEMS_TOO_MANY ); + } + } - memory = _Workspace_Allocate( memory_needed ); +#if 0 + /* + * Allocate and initialize the RTEMS API specific information + */ + + the_thread->RTEMS_API = _Workspace_Allocate( sizeof( RTEMS_API_Control ) ); - if ( !memory ) { + if ( !the_thread->RTEMS_API ) { _RTEMS_tasks_Free( the_thread ); + if ( is_global ) + _Objects_MP_Free_global_object( the_global_object ); _Thread_Enable_dispatch(); return( RTEMS_UNSATISFIED ); } + the_thread->RTEMS_API->pending_events = EVENT_SETS_NONE_PENDING; + _ASR_Initialize( &the_thread->RTEMS_API->Signal ); +#endif + /* - * Stack is put in the lower address regions of the allocated memory. - * The optional floating point context area goes into the higher part - * of the allocated memory. + * Initialize the core thread for this task. */ - _Stack_Initialize( - &the_thread->Start.Initial_stack, memory, actual_stack_size ); - - if ( _Attributes_Is_floating_point( the_attribute_set ) ) - the_thread->fp_context = _Context_Fp_start( memory, actual_stack_size ); - else - the_thread->fp_context = NULL; - - the_thread->Start.fp_context = the_thread->fp_context; +/* XXX normalize mode */ - if ( _Attributes_Is_global( the_attribute_set ) && - !( _Objects_MP_Open( &_RTEMS_tasks_Information, name, - the_thread->Object.id, FALSE ) ) ) { + if ( !_Thread_Initialize( &_RTEMS_tasks_Information, the_thread, + NULL, stack_size, is_fp, core_priority, initial_modes, &name ) ) { + if ( is_global ) + _Objects_MP_Free_global_object( the_global_object ); _RTEMS_tasks_Free( the_thread ); - (void) _Workspace_Free( memory ); _Thread_Enable_dispatch(); - return( RTEMS_TOO_MANY ); + return( RTEMS_UNSATISFIED ); } - the_thread->attribute_set = the_attribute_set; - the_thread->current_state = STATES_DORMANT; - the_thread->current_modes = initial_modes; - the_thread->pending_events = EVENT_SETS_NONE_PENDING; - the_thread->resource_count = 0; - the_thread->real_priority = initial_priority; - the_thread->Start.initial_priority = initial_priority; - the_thread->Start.initial_modes = initial_modes; - - _Thread_Set_priority( the_thread, initial_priority ); - - _ASR_Initialize( &the_thread->Signal ); + *id = the_thread->Object.id; - _Objects_Open( &_RTEMS_tasks_Information, &the_thread->Object, &name ); + if ( is_global ) { - *id = the_thread->Object.id; + the_thread->RTEMS_API->is_global = TRUE; - _User_extensions_Task_create( the_thread ); + _Objects_MP_Open( + &_RTEMS_tasks_Information, + the_global_object, + name, + the_thread->Object.id + ); - if ( _Attributes_Is_global( the_attribute_set ) ) _RTEMS_tasks_MP_Send_process_packet( RTEMS_TASKS_MP_ANNOUNCE_CREATE, the_thread->Object.id, name ); + } + _Thread_Enable_dispatch(); return( RTEMS_SUCCESSFUL ); } @@ -252,9 +289,9 @@ rtems_status_code rtems_task_ident( */ rtems_status_code rtems_task_start( - Objects_Id id, + rtems_id id, rtems_task_entry entry_point, - unsigned32 argument + unsigned32 argument ) { register Thread_Control *the_thread; @@ -271,17 +308,8 @@ rtems_status_code rtems_task_start( _Thread_Dispatch(); return( RTEMS_ILLEGAL_ON_REMOTE_OBJECT ); case OBJECTS_LOCAL: - if ( _States_Is_dormant( the_thread->current_state ) ) { - - the_thread->Start.entry_point = entry_point; - the_thread->Start.initial_argument = argument; - - _Thread_Load_environment( the_thread ); - - _Thread_Ready( the_thread ); - - _User_extensions_Task_start( the_thread ); - + if ( _Thread_Start( + the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) { _Thread_Enable_dispatch(); return( RTEMS_SUCCESSFUL ); } @@ -316,7 +344,7 @@ rtems_status_code rtems_task_restart( ) { register Thread_Control *the_thread; - Objects_Locations location; + Objects_Locations location; the_thread = _Thread_Get( id, &location ); switch ( location ) { @@ -326,32 +354,11 @@ rtems_status_code rtems_task_restart( _Thread_Dispatch(); return( RTEMS_ILLEGAL_ON_REMOTE_OBJECT ); case OBJECTS_LOCAL: - if ( !_States_Is_dormant( the_thread->current_state ) ) { - - _Thread_Set_transient( the_thread ); - _ASR_Initialize( &the_thread->Signal ); - the_thread->pending_events = EVENT_SETS_NONE_PENDING; - the_thread->resource_count = 0; - the_thread->current_modes = the_thread->Start.initial_modes; - the_thread->Start.initial_argument = argument; - - _RTEMS_tasks_Cancel_wait( the_thread ); - - if ( the_thread->current_priority != - the_thread->Start.initial_priority ) { - the_thread->real_priority = the_thread->Start.initial_priority; - _Thread_Set_priority( the_thread, - the_thread->Start.initial_priority ); - } - - _Thread_Load_environment( the_thread ); + if ( _Thread_Restart( the_thread, NULL, argument ) ) { - _Thread_Ready( the_thread ); - - _User_extensions_Task_restart( the_thread ); - - if ( _Thread_Is_executing ( the_thread ) ) - _Thread_Restart_self(); + /* XXX until these are in an API extension they are too late. */ + _ASR_Initialize( &the_thread->RTEMS_API->Signal ); + the_thread->RTEMS_API->pending_events = EVENT_SETS_NONE_PENDING; _Thread_Enable_dispatch(); return( RTEMS_SUCCESSFUL ); @@ -396,25 +403,14 @@ rtems_status_code rtems_task_delete( _Thread_Dispatch(); return( RTEMS_ILLEGAL_ON_REMOTE_OBJECT ); case OBJECTS_LOCAL: - _Objects_Close( &_RTEMS_tasks_Information, &the_thread->Object ); - - _Thread_Set_state( the_thread, STATES_TRANSIENT ); - - _User_extensions_Task_delete( the_thread ); - -#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE ) - if ( _Thread_Is_allocated_fp( the_thread ) ) - _Thread_Deallocate_fp(); -#endif - the_thread->fp_context = NULL; - - _RTEMS_tasks_Cancel_wait( the_thread ); + _Thread_Close( &_RTEMS_tasks_Information, the_thread ); - (void) _Workspace_Free( the_thread->Start.Initial_stack.area ); + /* XXX */ + (void) _Workspace_Free( the_thread->RTEMS_API ); _RTEMS_tasks_Free( the_thread ); - if ( _Attributes_Is_global( the_thread->attribute_set ) ) { + if ( _Attributes_Is_global( the_thread->RTEMS_API->is_global ) ) { _Objects_MP_Close( &_RTEMS_tasks_Information, the_thread->Object.id ); @@ -551,7 +547,7 @@ rtems_status_code rtems_task_resume( */ rtems_status_code rtems_task_set_priority( - Objects_Id id, + Objects_Id id, rtems_task_priority new_priority, rtems_task_priority *old_priority ) @@ -662,7 +658,7 @@ rtems_status_code rtems_task_get_note( if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) || _Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) { - *note = _Thread_Executing->Notepads[ notepad ]; + *note = _Thread_Executing->RTEMS_API->Notepads[ notepad ]; return( RTEMS_SUCCESSFUL ); } @@ -681,7 +677,7 @@ rtems_status_code rtems_task_get_note( 0 /* Not used */ ); case OBJECTS_LOCAL: - *note= the_thread->Notepads[ notepad ]; + *note= the_thread->RTEMS_API->Notepads[ notepad ]; _Thread_Enable_dispatch(); return( RTEMS_SUCCESSFUL ); } @@ -729,7 +725,7 @@ rtems_status_code rtems_task_set_note( if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) || _Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) { - _Thread_Executing->Notepads[ notepad ] = note; + _Thread_Executing->RTEMS_API->Notepads[ notepad ] = note; return( RTEMS_SUCCESSFUL ); } @@ -747,7 +743,7 @@ rtems_status_code rtems_task_set_note( ); case OBJECTS_LOCAL: - the_thread->Notepads[ notepad ] = note; + the_thread->RTEMS_API->Notepads[ notepad ] = note; _Thread_Enable_dispatch(); return( RTEMS_SUCCESSFUL ); } diff --git a/c/src/exec/score/headers/mppkt.h b/c/src/exec/score/headers/mppkt.h index 4e72d6930a..d63d587fca 100644 --- a/c/src/exec/score/headers/mppkt.h +++ b/c/src/exec/score/headers/mppkt.h @@ -64,7 +64,7 @@ typedef struct { rtems_mp_packet_classes the_class; Objects_Id id; Objects_Id source_tid; - rtems_task_priority source_priority; + Priority_Control source_priority; rtems_status_code return_code; unsigned32 length; unsigned32 to_convert; diff --git a/c/src/exec/score/headers/object.h b/c/src/exec/score/headers/object.h index 5c84868dc1..b1d422d3d4 100644 --- a/c/src/exec/score/headers/object.h +++ b/c/src/exec/score/headers/object.h @@ -349,6 +349,19 @@ Objects_Control *_Objects_Get_next( ); /* + * _Objects_Get_information + * + * DESCRIPTION: + * + * Returns the information control block for the class of objects + * corresponding to this id. + */ + +Objects_Information *_Objects_Get_information( + Objects_Id id +); + +/* * _Objects_Build_id * * DESCRIPTION: @@ -404,6 +417,19 @@ STATIC INLINE unsigned32 rtems_get_index( ); /* + * _Objects_Is_class_valid + * + * DESCRIPTION: + * + * This function returns TRUE if the class is valid. + * + */ + +STATIC INLINE boolean _Objects_Is_class_valid( + Objects_Classes the_class +); + +/* * _Objects_Is_local_node * * DESCRIPTION: diff --git a/c/src/exec/score/headers/objectmp.h b/c/src/exec/score/headers/objectmp.h index 6ec5ed1781..b15d5cbb43 100644 --- a/c/src/exec/score/headers/objectmp.h +++ b/c/src/exec/score/headers/objectmp.h @@ -81,18 +81,35 @@ STATIC INLINE boolean _Objects_MP_Is_null_global_object ( Objects_MP_Control *the_object ); -/* +/*PAGE + * * _Objects_MP_Open * * DESCRIPTION: * + * This routine place the specified global object in the + * specified information table. + */ + +void _Objects_MP_Open ( + Objects_Information *information, + Objects_MP_Control *the_global_object, + unsigned32 the_name, /* XXX -- wrong for variable */ + Objects_Id the_id +); + +/* + * _Objects_MP_Allocate_and_open + * + * DESCRIPTION: + * * This routine allocates a global object control block * and places it in the specified information table. If the * allocation fails, then is_fatal_error determines the * error processing actions taken. */ -boolean _Objects_MP_Open ( +boolean _Objects_MP_Allocate_and_open ( Objects_Information *information, unsigned32 the_name, /* XXX -- wrong for variable length */ Objects_Id the_id, diff --git a/c/src/exec/score/headers/priority.h b/c/src/exec/score/headers/priority.h index 823611b080..44397e7a8a 100644 --- a/c/src/exec/score/headers/priority.h +++ b/c/src/exec/score/headers/priority.h @@ -29,7 +29,7 @@ extern "C" { * NOTE: Priority 0 is reserved for internal threads only. */ -typedef unsigned32 rtems_task_priority; +typedef unsigned32 Priority_Control; #define RTEMS_MINIMUM_PRIORITY 1 /* highest thread priority */ #define RTEMS_MAXIMUM_PRIORITY 255 /* lowest thread priority */ @@ -92,7 +92,7 @@ STATIC INLINE void _Priority_Handler_initialization( void ); */ STATIC INLINE boolean _Priority_Is_valid ( - rtems_task_priority the_priority + Priority_Control the_priority ); /* @@ -104,7 +104,7 @@ STATIC INLINE boolean _Priority_Is_valid ( */ STATIC INLINE unsigned32 _Priority_Major ( - rtems_task_priority the_priority + Priority_Control the_priority ); /* @@ -116,7 +116,7 @@ STATIC INLINE unsigned32 _Priority_Major ( */ STATIC INLINE unsigned32 _Priority_Minor ( - rtems_task_priority the_priority + Priority_Control the_priority ); /* @@ -155,7 +155,7 @@ STATIC INLINE void _Priority_Remove_from_bit_map ( * ready thread. */ -STATIC INLINE rtems_task_priority _Priority_Get_highest( void ); +STATIC INLINE Priority_Control _Priority_Get_highest( void ); /* * _Priority_Initialize_information @@ -169,7 +169,7 @@ STATIC INLINE rtems_task_priority _Priority_Get_highest( void ); STATIC INLINE void _Priority_Initialize_information( Priority_Information *the_priority_map, - rtems_task_priority new_priority + Priority_Control new_priority ); /* @@ -182,7 +182,7 @@ STATIC INLINE void _Priority_Initialize_information( */ STATIC INLINE boolean _Priority_Is_group_empty ( - rtems_task_priority the_priority + Priority_Control the_priority ); #include <rtems/priority.inl> diff --git a/c/src/exec/score/headers/thread.h b/c/src/exec/score/headers/thread.h index 9c5d0b040b..37a5898d01 100644 --- a/c/src/exec/score/headers/thread.h +++ b/c/src/exec/score/headers/thread.h @@ -86,22 +86,30 @@ typedef rtems_task ( *rtems_task_entry )( rtems_task_argument ); -typedef Thread ( *Thread_Entry )( - Thread_Argument - ); +typedef Thread ( *Thread_Entry )( ); /* * The following structure contains the information which defines * the starting state of a thread. */ +typedef enum { + THREAD_START_NUMERIC, + THREAD_START_POINTER, + THREAD_START_BOTH_POINTER_FIRST, + THREAD_START_BOTH_NUMERIC_FIRST +} Thread_Start_types; + typedef struct { Thread_Entry entry_point; /* starting thread address */ - unsigned32 initial_argument; /* initial argument */ - rtems_mode initial_modes; /* initial mode */ - rtems_task_priority initial_priority; /* initial priority */ - void *fp_context; /* initial FP context area address */ + Thread_Start_types prototype; /* how task is invoked */ + void *pointer_argument; /* pointer argument */ + unsigned32 numeric_argument; /* numeric argument */ + Modes_Control initial_modes; /* initial mode */ + Priority_Control initial_priority; /* initial priority */ Stack_Control Initial_stack; /* stack information */ + void *fp_context; /* initial FP context area address */ + void *stack; /* initial FP context area address */ } Thread_Start_information; /* @@ -134,8 +142,8 @@ typedef struct { typedef struct { Objects_Control Object; States_Control current_state; - rtems_task_priority current_priority; - rtems_task_priority real_priority; + Priority_Control current_priority; + Priority_Control real_priority; unsigned32 resource_count; Thread_Wait_information Wait; Watchdog_Control Timer; @@ -153,11 +161,21 @@ typedef struct { * memory images for the shared part. */ +/* XXX structure in wrong file .. API .. not core */ + +typedef struct { + boolean is_global; + unsigned32 Notepads[ RTEMS_NUMBER_NOTEPADS ]; + rtems_event_set pending_events; + rtems_event_set events_out; + ASR_Information Signal; +} RTEMS_API_Control; + typedef struct { Objects_Control Object; States_Control current_state; - rtems_task_priority current_priority; - rtems_task_priority real_priority; + Priority_Control current_priority; + Priority_Control real_priority; unsigned32 resource_count; Thread_Wait_information Wait; Watchdog_Control Timer; @@ -165,15 +183,11 @@ typedef struct { /****************** end of common block ********************/ Chain_Control *ready; Priority_Information Priority_map; - rtems_event_set pending_events; - rtems_event_set events_out; Thread_Start_information Start; - ASR_Information Signal; - rtems_mode current_modes; - rtems_attribute attribute_set; + Modes_Control current_modes; Context_Control Registers; void *fp_context; - unsigned32 Notepads[ RTEMS_NUMBER_NOTEPADS ]; + RTEMS_API_Control *RTEMS_API; void *extension; } Thread_Control; @@ -305,6 +319,71 @@ STATIC INLINE void _Thread_Dispatch_initialization( void ); void _Thread_Dispatch( void ); /* + * _Thread_Initialize + * + * DESCRIPTION: + * + * XXX + */ + +boolean _Thread_Initialize( + Objects_Information *information, + Thread_Control *the_thread, + void *stack_area, /* NULL if to be allocated */ + unsigned32 stack_size, /* insure it is >= min */ + boolean is_fp, /* TRUE if thread uses FP */ + Priority_Control priority, + Modes_Control mode, + Objects_Name name + +); + +/* + * _Thread_Start + * + * DESCRIPTION: + * + * XXX + */ + +boolean _Thread_Start( + Thread_Control *the_thread, + Thread_Start_types the_prototype, + void *entry_point, + void *pointer_argument, + unsigned32 numeric_argument +); + +/* + * _Thread_Restart + * + * DESCRIPTION: + * + * XXX + */ + +/* XXX multiple task arg profiles */ + +boolean _Thread_Restart( + Thread_Control *the_thread, + void *pointer_argument, + unsigned32 numeric_argument +); + +/* + * _Thread_Close + * + * DESCRIPTION: + * + * XXX + */ + +void _Thread_Close( + Objects_Information *information, + Thread_Control *the_thread +); + +/* * _Thread_Ready * * DESCRIPTION: @@ -493,7 +572,7 @@ void _Thread_Delay_ended( void _Thread_Change_priority ( Thread_Control *the_thread, - rtems_task_priority new_priority + Priority_Control new_priority ); /* @@ -507,7 +586,7 @@ void _Thread_Change_priority ( void _Thread_Set_priority( Thread_Control *the_thread, - rtems_task_priority new_priority + Priority_Control new_priority ); /* @@ -524,9 +603,9 @@ void _Thread_Set_priority( */ boolean _Thread_Change_mode( - rtems_mode new_mode_set, - rtems_mode mask, - rtems_mode *old_mode_set + Modes_Control new_mode_set, + Modes_Control mask, + Modes_Control *old_mode_set ); /* diff --git a/c/src/exec/score/headers/threadq.h b/c/src/exec/score/headers/threadq.h index 291044ead1..27a36ab63e 100644 --- a/c/src/exec/score/headers/threadq.h +++ b/c/src/exec/score/headers/threadq.h @@ -37,6 +37,19 @@ typedef void ( *Thread_queue_Flush_callout )( ); /* + * The following type defines the callout used when a local task + * is extracted from a remote thread queue (i.e. it's proxy must + * extracted from the remote queue). + */ + +typedef void ( *Thread_queue_Extract_callout )( + Thread_Control * + ); + +EXTERN Thread_queue_Extract_callout + _Thread_queue_Extract_table[ OBJECTS_CLASSES_LAST + 1 ]; + +/* * _Thread_queue_Dequeue * * DESCRIPTION: @@ -62,7 +75,7 @@ Thread_Control *_Thread_queue_Dequeue( void _Thread_queue_Enqueue( Thread_queue_Control *the_thread_queue, - rtems_interval timeout + rtems_interval timeout ); /* @@ -80,6 +93,20 @@ void _Thread_queue_Extract( ); /* + * _Thread_queue_Extract_with_proxy + * + * DESCRIPTION: + * + * This routine extracts the_thread from the_thread_queue + * and insures that if there is a proxy for this task on + * another node, it is also dealt with. + */ + +boolean _Thread_queue_Extract_with_proxy( + Thread_Control *the_thread +); + +/* * _Thread_queue_First * * DESCRIPTION: @@ -118,9 +145,11 @@ void _Thread_queue_Flush( */ void _Thread_queue_Initialize( - Thread_queue_Control *the_thread_queue, - rtems_attribute attribute_set, - States_Control state + Thread_queue_Control *the_thread_queue, + Objects_Classes the_class, + Thread_queue_Disciplines the_discipline, + States_Control state, + Thread_queue_Extract_callout proxy_extract_callout ); /* diff --git a/c/src/exec/score/headers/tqdata.h b/c/src/exec/score/headers/tqdata.h index 37dd6853d7..f962f409d2 100644 --- a/c/src/exec/score/headers/tqdata.h +++ b/c/src/exec/score/headers/tqdata.h @@ -31,8 +31,8 @@ extern "C" { */ typedef enum { - THREAD_QUEUE_DATA_FIFO_DISCIPLINE, /* RTEMS_FIFO queue discipline */ - THREAD_QUEUE_DATA_PRIORITY_DISCIPLINE /* RTEMS_PRIORITY queue discipline */ + THREAD_QUEUE_DISCIPLINE_FIFO, /* RTEMS_FIFO queue discipline */ + THREAD_QUEUE_DISCIPLINE_PRIORITY /* RTEMS_PRIORITY queue discipline */ } Thread_queue_Disciplines; /* @@ -63,7 +63,7 @@ typedef struct { */ STATIC INLINE unsigned32 _Thread_queue_Header_number ( - rtems_task_priority the_priority + Priority_Control the_priority ); /* @@ -77,7 +77,7 @@ STATIC INLINE unsigned32 _Thread_queue_Header_number ( */ STATIC INLINE boolean _Thread_queue_Is_reverse_search ( - rtems_task_priority the_priority + Priority_Control the_priority ); #include <rtems/tqdata.inl> diff --git a/c/src/exec/score/headers/userext.h b/c/src/exec/score/headers/userext.h index 37131959d9..56fae9b7db 100644 --- a/c/src/exec/score/headers/userext.h +++ b/c/src/exec/score/headers/userext.h @@ -69,8 +69,8 @@ STATIC INLINE void _User_extensions_Handler_initialization ( */ STATIC INLINE void _User_extensions_Add_set ( - User_extensions_Control *the_extension, - rtems_extensions_table *extension_table + User_extensions_Control *the_extension, + rtems_extensions_table *extension_table ); /* diff --git a/c/src/exec/score/include/rtems/score/mppkt.h b/c/src/exec/score/include/rtems/score/mppkt.h index 4e72d6930a..d63d587fca 100644 --- a/c/src/exec/score/include/rtems/score/mppkt.h +++ b/c/src/exec/score/include/rtems/score/mppkt.h @@ -64,7 +64,7 @@ typedef struct { rtems_mp_packet_classes the_class; Objects_Id id; Objects_Id source_tid; - rtems_task_priority source_priority; + Priority_Control source_priority; rtems_status_code return_code; unsigned32 length; unsigned32 to_convert; diff --git a/c/src/exec/score/include/rtems/score/object.h b/c/src/exec/score/include/rtems/score/object.h index 5c84868dc1..b1d422d3d4 100644 --- a/c/src/exec/score/include/rtems/score/object.h +++ b/c/src/exec/score/include/rtems/score/object.h @@ -349,6 +349,19 @@ Objects_Control *_Objects_Get_next( ); /* + * _Objects_Get_information + * + * DESCRIPTION: + * + * Returns the information control block for the class of objects + * corresponding to this id. + */ + +Objects_Information *_Objects_Get_information( + Objects_Id id +); + +/* * _Objects_Build_id * * DESCRIPTION: @@ -404,6 +417,19 @@ STATIC INLINE unsigned32 rtems_get_index( ); /* + * _Objects_Is_class_valid + * + * DESCRIPTION: + * + * This function returns TRUE if the class is valid. + * + */ + +STATIC INLINE boolean _Objects_Is_class_valid( + Objects_Classes the_class +); + +/* * _Objects_Is_local_node * * DESCRIPTION: diff --git a/c/src/exec/score/include/rtems/score/objectmp.h b/c/src/exec/score/include/rtems/score/objectmp.h index 6ec5ed1781..b15d5cbb43 100644 --- a/c/src/exec/score/include/rtems/score/objectmp.h +++ b/c/src/exec/score/include/rtems/score/objectmp.h @@ -81,18 +81,35 @@ STATIC INLINE boolean _Objects_MP_Is_null_global_object ( Objects_MP_Control *the_object ); -/* +/*PAGE + * * _Objects_MP_Open * * DESCRIPTION: * + * This routine place the specified global object in the + * specified information table. + */ + +void _Objects_MP_Open ( + Objects_Information *information, + Objects_MP_Control *the_global_object, + unsigned32 the_name, /* XXX -- wrong for variable */ + Objects_Id the_id +); + +/* + * _Objects_MP_Allocate_and_open + * + * DESCRIPTION: + * * This routine allocates a global object control block * and places it in the specified information table. If the * allocation fails, then is_fatal_error determines the * error processing actions taken. */ -boolean _Objects_MP_Open ( +boolean _Objects_MP_Allocate_and_open ( Objects_Information *information, unsigned32 the_name, /* XXX -- wrong for variable length */ Objects_Id the_id, diff --git a/c/src/exec/score/include/rtems/score/priority.h b/c/src/exec/score/include/rtems/score/priority.h index 823611b080..44397e7a8a 100644 --- a/c/src/exec/score/include/rtems/score/priority.h +++ b/c/src/exec/score/include/rtems/score/priority.h @@ -29,7 +29,7 @@ extern "C" { * NOTE: Priority 0 is reserved for internal threads only. */ -typedef unsigned32 rtems_task_priority; +typedef unsigned32 Priority_Control; #define RTEMS_MINIMUM_PRIORITY 1 /* highest thread priority */ #define RTEMS_MAXIMUM_PRIORITY 255 /* lowest thread priority */ @@ -92,7 +92,7 @@ STATIC INLINE void _Priority_Handler_initialization( void ); */ STATIC INLINE boolean _Priority_Is_valid ( - rtems_task_priority the_priority + Priority_Control the_priority ); /* @@ -104,7 +104,7 @@ STATIC INLINE boolean _Priority_Is_valid ( */ STATIC INLINE unsigned32 _Priority_Major ( - rtems_task_priority the_priority + Priority_Control the_priority ); /* @@ -116,7 +116,7 @@ STATIC INLINE unsigned32 _Priority_Major ( */ STATIC INLINE unsigned32 _Priority_Minor ( - rtems_task_priority the_priority + Priority_Control the_priority ); /* @@ -155,7 +155,7 @@ STATIC INLINE void _Priority_Remove_from_bit_map ( * ready thread. */ -STATIC INLINE rtems_task_priority _Priority_Get_highest( void ); +STATIC INLINE Priority_Control _Priority_Get_highest( void ); /* * _Priority_Initialize_information @@ -169,7 +169,7 @@ STATIC INLINE rtems_task_priority _Priority_Get_highest( void ); STATIC INLINE void _Priority_Initialize_information( Priority_Information *the_priority_map, - rtems_task_priority new_priority + Priority_Control new_priority ); /* @@ -182,7 +182,7 @@ STATIC INLINE void _Priority_Initialize_information( */ STATIC INLINE boolean _Priority_Is_group_empty ( - rtems_task_priority the_priority + Priority_Control the_priority ); #include <rtems/priority.inl> diff --git a/c/src/exec/score/include/rtems/score/thread.h b/c/src/exec/score/include/rtems/score/thread.h index 9c5d0b040b..37a5898d01 100644 --- a/c/src/exec/score/include/rtems/score/thread.h +++ b/c/src/exec/score/include/rtems/score/thread.h @@ -86,22 +86,30 @@ typedef rtems_task ( *rtems_task_entry )( rtems_task_argument ); -typedef Thread ( *Thread_Entry )( - Thread_Argument - ); +typedef Thread ( *Thread_Entry )( ); /* * The following structure contains the information which defines * the starting state of a thread. */ +typedef enum { + THREAD_START_NUMERIC, + THREAD_START_POINTER, + THREAD_START_BOTH_POINTER_FIRST, + THREAD_START_BOTH_NUMERIC_FIRST +} Thread_Start_types; + typedef struct { Thread_Entry entry_point; /* starting thread address */ - unsigned32 initial_argument; /* initial argument */ - rtems_mode initial_modes; /* initial mode */ - rtems_task_priority initial_priority; /* initial priority */ - void *fp_context; /* initial FP context area address */ + Thread_Start_types prototype; /* how task is invoked */ + void *pointer_argument; /* pointer argument */ + unsigned32 numeric_argument; /* numeric argument */ + Modes_Control initial_modes; /* initial mode */ + Priority_Control initial_priority; /* initial priority */ Stack_Control Initial_stack; /* stack information */ + void *fp_context; /* initial FP context area address */ + void *stack; /* initial FP context area address */ } Thread_Start_information; /* @@ -134,8 +142,8 @@ typedef struct { typedef struct { Objects_Control Object; States_Control current_state; - rtems_task_priority current_priority; - rtems_task_priority real_priority; + Priority_Control current_priority; + Priority_Control real_priority; unsigned32 resource_count; Thread_Wait_information Wait; Watchdog_Control Timer; @@ -153,11 +161,21 @@ typedef struct { * memory images for the shared part. */ +/* XXX structure in wrong file .. API .. not core */ + +typedef struct { + boolean is_global; + unsigned32 Notepads[ RTEMS_NUMBER_NOTEPADS ]; + rtems_event_set pending_events; + rtems_event_set events_out; + ASR_Information Signal; +} RTEMS_API_Control; + typedef struct { Objects_Control Object; States_Control current_state; - rtems_task_priority current_priority; - rtems_task_priority real_priority; + Priority_Control current_priority; + Priority_Control real_priority; unsigned32 resource_count; Thread_Wait_information Wait; Watchdog_Control Timer; @@ -165,15 +183,11 @@ typedef struct { /****************** end of common block ********************/ Chain_Control *ready; Priority_Information Priority_map; - rtems_event_set pending_events; - rtems_event_set events_out; Thread_Start_information Start; - ASR_Information Signal; - rtems_mode current_modes; - rtems_attribute attribute_set; + Modes_Control current_modes; Context_Control Registers; void *fp_context; - unsigned32 Notepads[ RTEMS_NUMBER_NOTEPADS ]; + RTEMS_API_Control *RTEMS_API; void *extension; } Thread_Control; @@ -305,6 +319,71 @@ STATIC INLINE void _Thread_Dispatch_initialization( void ); void _Thread_Dispatch( void ); /* + * _Thread_Initialize + * + * DESCRIPTION: + * + * XXX + */ + +boolean _Thread_Initialize( + Objects_Information *information, + Thread_Control *the_thread, + void *stack_area, /* NULL if to be allocated */ + unsigned32 stack_size, /* insure it is >= min */ + boolean is_fp, /* TRUE if thread uses FP */ + Priority_Control priority, + Modes_Control mode, + Objects_Name name + +); + +/* + * _Thread_Start + * + * DESCRIPTION: + * + * XXX + */ + +boolean _Thread_Start( + Thread_Control *the_thread, + Thread_Start_types the_prototype, + void *entry_point, + void *pointer_argument, + unsigned32 numeric_argument +); + +/* + * _Thread_Restart + * + * DESCRIPTION: + * + * XXX + */ + +/* XXX multiple task arg profiles */ + +boolean _Thread_Restart( + Thread_Control *the_thread, + void *pointer_argument, + unsigned32 numeric_argument +); + +/* + * _Thread_Close + * + * DESCRIPTION: + * + * XXX + */ + +void _Thread_Close( + Objects_Information *information, + Thread_Control *the_thread +); + +/* * _Thread_Ready * * DESCRIPTION: @@ -493,7 +572,7 @@ void _Thread_Delay_ended( void _Thread_Change_priority ( Thread_Control *the_thread, - rtems_task_priority new_priority + Priority_Control new_priority ); /* @@ -507,7 +586,7 @@ void _Thread_Change_priority ( void _Thread_Set_priority( Thread_Control *the_thread, - rtems_task_priority new_priority + Priority_Control new_priority ); /* @@ -524,9 +603,9 @@ void _Thread_Set_priority( */ boolean _Thread_Change_mode( - rtems_mode new_mode_set, - rtems_mode mask, - rtems_mode *old_mode_set + Modes_Control new_mode_set, + Modes_Control mask, + Modes_Control *old_mode_set ); /* diff --git a/c/src/exec/score/include/rtems/score/threadq.h b/c/src/exec/score/include/rtems/score/threadq.h index 291044ead1..27a36ab63e 100644 --- a/c/src/exec/score/include/rtems/score/threadq.h +++ b/c/src/exec/score/include/rtems/score/threadq.h @@ -37,6 +37,19 @@ typedef void ( *Thread_queue_Flush_callout )( ); /* + * The following type defines the callout used when a local task + * is extracted from a remote thread queue (i.e. it's proxy must + * extracted from the remote queue). + */ + +typedef void ( *Thread_queue_Extract_callout )( + Thread_Control * + ); + +EXTERN Thread_queue_Extract_callout + _Thread_queue_Extract_table[ OBJECTS_CLASSES_LAST + 1 ]; + +/* * _Thread_queue_Dequeue * * DESCRIPTION: @@ -62,7 +75,7 @@ Thread_Control *_Thread_queue_Dequeue( void _Thread_queue_Enqueue( Thread_queue_Control *the_thread_queue, - rtems_interval timeout + rtems_interval timeout ); /* @@ -80,6 +93,20 @@ void _Thread_queue_Extract( ); /* + * _Thread_queue_Extract_with_proxy + * + * DESCRIPTION: + * + * This routine extracts the_thread from the_thread_queue + * and insures that if there is a proxy for this task on + * another node, it is also dealt with. + */ + +boolean _Thread_queue_Extract_with_proxy( + Thread_Control *the_thread +); + +/* * _Thread_queue_First * * DESCRIPTION: @@ -118,9 +145,11 @@ void _Thread_queue_Flush( */ void _Thread_queue_Initialize( - Thread_queue_Control *the_thread_queue, - rtems_attribute attribute_set, - States_Control state + Thread_queue_Control *the_thread_queue, + Objects_Classes the_class, + Thread_queue_Disciplines the_discipline, + States_Control state, + Thread_queue_Extract_callout proxy_extract_callout ); /* diff --git a/c/src/exec/score/include/rtems/score/tqdata.h b/c/src/exec/score/include/rtems/score/tqdata.h index 37dd6853d7..f962f409d2 100644 --- a/c/src/exec/score/include/rtems/score/tqdata.h +++ b/c/src/exec/score/include/rtems/score/tqdata.h @@ -31,8 +31,8 @@ extern "C" { */ typedef enum { - THREAD_QUEUE_DATA_FIFO_DISCIPLINE, /* RTEMS_FIFO queue discipline */ - THREAD_QUEUE_DATA_PRIORITY_DISCIPLINE /* RTEMS_PRIORITY queue discipline */ + THREAD_QUEUE_DISCIPLINE_FIFO, /* RTEMS_FIFO queue discipline */ + THREAD_QUEUE_DISCIPLINE_PRIORITY /* RTEMS_PRIORITY queue discipline */ } Thread_queue_Disciplines; /* @@ -63,7 +63,7 @@ typedef struct { */ STATIC INLINE unsigned32 _Thread_queue_Header_number ( - rtems_task_priority the_priority + Priority_Control the_priority ); /* @@ -77,7 +77,7 @@ STATIC INLINE unsigned32 _Thread_queue_Header_number ( */ STATIC INLINE boolean _Thread_queue_Is_reverse_search ( - rtems_task_priority the_priority + Priority_Control the_priority ); #include <rtems/tqdata.inl> diff --git a/c/src/exec/score/include/rtems/score/userext.h b/c/src/exec/score/include/rtems/score/userext.h index 37131959d9..56fae9b7db 100644 --- a/c/src/exec/score/include/rtems/score/userext.h +++ b/c/src/exec/score/include/rtems/score/userext.h @@ -69,8 +69,8 @@ STATIC INLINE void _User_extensions_Handler_initialization ( */ STATIC INLINE void _User_extensions_Add_set ( - User_extensions_Control *the_extension, - rtems_extensions_table *extension_table + User_extensions_Control *the_extension, + rtems_extensions_table *extension_table ); /* diff --git a/c/src/exec/score/inline/object.inl b/c/src/exec/score/inline/object.inl index 687ffd923b..b6ae73a351 100644 --- a/c/src/exec/score/inline/object.inl +++ b/c/src/exec/score/inline/object.inl @@ -76,6 +76,19 @@ STATIC INLINE unsigned32 rtems_get_index( /*PAGE * + * _Objects_Is_class_valid + * + */ + +STATIC INLINE boolean _Objects_Is_class_valid( + Objects_Classes the_class +) +{ + return the_class <= OBJECTS_CLASSES_LAST; +} + +/*PAGE + * * _Objects_Is_local_node * */ diff --git a/c/src/exec/score/inline/priority.inl b/c/src/exec/score/inline/priority.inl index 9e7c159f65..b2bc8535ff 100644 --- a/c/src/exec/score/inline/priority.inl +++ b/c/src/exec/score/inline/priority.inl @@ -41,7 +41,7 @@ STATIC INLINE void _Priority_Handler_initialization( void ) */ STATIC INLINE boolean _Priority_Is_valid ( - rtems_task_priority the_priority + Priority_Control the_priority ) { return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) && @@ -55,7 +55,7 @@ STATIC INLINE boolean _Priority_Is_valid ( */ STATIC INLINE unsigned32 _Priority_Major ( - rtems_task_priority the_priority + Priority_Control the_priority ) { return ( the_priority / 16 ); @@ -68,7 +68,7 @@ STATIC INLINE unsigned32 _Priority_Major ( */ STATIC INLINE unsigned32 _Priority_Minor ( - rtems_task_priority the_priority + Priority_Control the_priority ) { return ( the_priority % 16 ); @@ -109,7 +109,7 @@ STATIC INLINE void _Priority_Remove_from_bit_map ( * */ -STATIC INLINE rtems_task_priority _Priority_Get_highest( void ) +STATIC INLINE Priority_Control _Priority_Get_highest( void ) { Priority_Bit_map_control minor; Priority_Bit_map_control major; @@ -129,7 +129,7 @@ STATIC INLINE rtems_task_priority _Priority_Get_highest( void ) STATIC INLINE void _Priority_Initialize_information( Priority_Information *the_priority_map, - rtems_task_priority new_priority + Priority_Control new_priority ) { Priority_Bit_map_control major; @@ -158,7 +158,7 @@ STATIC INLINE void _Priority_Initialize_information( */ STATIC INLINE boolean _Priority_Is_group_empty ( - rtems_task_priority the_priority + Priority_Control the_priority ) { return the_priority == 0; diff --git a/c/src/exec/score/inline/rtems/score/object.inl b/c/src/exec/score/inline/rtems/score/object.inl index 687ffd923b..b6ae73a351 100644 --- a/c/src/exec/score/inline/rtems/score/object.inl +++ b/c/src/exec/score/inline/rtems/score/object.inl @@ -76,6 +76,19 @@ STATIC INLINE unsigned32 rtems_get_index( /*PAGE * + * _Objects_Is_class_valid + * + */ + +STATIC INLINE boolean _Objects_Is_class_valid( + Objects_Classes the_class +) +{ + return the_class <= OBJECTS_CLASSES_LAST; +} + +/*PAGE + * * _Objects_Is_local_node * */ diff --git a/c/src/exec/score/inline/rtems/score/priority.inl b/c/src/exec/score/inline/rtems/score/priority.inl index 9e7c159f65..b2bc8535ff 100644 --- a/c/src/exec/score/inline/rtems/score/priority.inl +++ b/c/src/exec/score/inline/rtems/score/priority.inl @@ -41,7 +41,7 @@ STATIC INLINE void _Priority_Handler_initialization( void ) */ STATIC INLINE boolean _Priority_Is_valid ( - rtems_task_priority the_priority + Priority_Control the_priority ) { return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) && @@ -55,7 +55,7 @@ STATIC INLINE boolean _Priority_Is_valid ( */ STATIC INLINE unsigned32 _Priority_Major ( - rtems_task_priority the_priority + Priority_Control the_priority ) { return ( the_priority / 16 ); @@ -68,7 +68,7 @@ STATIC INLINE unsigned32 _Priority_Major ( */ STATIC INLINE unsigned32 _Priority_Minor ( - rtems_task_priority the_priority + Priority_Control the_priority ) { return ( the_priority % 16 ); @@ -109,7 +109,7 @@ STATIC INLINE void _Priority_Remove_from_bit_map ( * */ -STATIC INLINE rtems_task_priority _Priority_Get_highest( void ) +STATIC INLINE Priority_Control _Priority_Get_highest( void ) { Priority_Bit_map_control minor; Priority_Bit_map_control major; @@ -129,7 +129,7 @@ STATIC INLINE rtems_task_priority _Priority_Get_highest( void ) STATIC INLINE void _Priority_Initialize_information( Priority_Information *the_priority_map, - rtems_task_priority new_priority + Priority_Control new_priority ) { Priority_Bit_map_control major; @@ -158,7 +158,7 @@ STATIC INLINE void _Priority_Initialize_information( */ STATIC INLINE boolean _Priority_Is_group_empty ( - rtems_task_priority the_priority + Priority_Control the_priority ) { return the_priority == 0; diff --git a/c/src/exec/score/inline/rtems/score/tqdata.inl b/c/src/exec/score/inline/rtems/score/tqdata.inl index 7ec1e9e186..3168d058f5 100644 --- a/c/src/exec/score/inline/rtems/score/tqdata.inl +++ b/c/src/exec/score/inline/rtems/score/tqdata.inl @@ -24,7 +24,7 @@ */ STATIC INLINE unsigned32 _Thread_queue_Header_number ( - rtems_task_priority the_priority + Priority_Control the_priority ) { return ( the_priority >> 6 ); @@ -37,7 +37,7 @@ STATIC INLINE unsigned32 _Thread_queue_Header_number ( */ STATIC INLINE boolean _Thread_queue_Is_reverse_search ( - rtems_task_priority the_priority + Priority_Control the_priority ) { return ( the_priority & 0x20 ); diff --git a/c/src/exec/score/inline/rtems/score/userext.inl b/c/src/exec/score/inline/rtems/score/userext.inl index 1558da968a..fa5a31c37b 100644 --- a/c/src/exec/score/inline/rtems/score/userext.inl +++ b/c/src/exec/score/inline/rtems/score/userext.inl @@ -41,8 +41,8 @@ STATIC INLINE void _User_extensions_Handler_initialization ( */ STATIC INLINE void _User_extensions_Add_set ( - User_extensions_Control *the_extension, - rtems_extensions_table *extension_table + User_extensions_Control *the_extension, + rtems_extensions_table *extension_table ) { the_extension->Callouts = *extension_table; diff --git a/c/src/exec/score/inline/tqdata.inl b/c/src/exec/score/inline/tqdata.inl index 7ec1e9e186..3168d058f5 100644 --- a/c/src/exec/score/inline/tqdata.inl +++ b/c/src/exec/score/inline/tqdata.inl @@ -24,7 +24,7 @@ */ STATIC INLINE unsigned32 _Thread_queue_Header_number ( - rtems_task_priority the_priority + Priority_Control the_priority ) { return ( the_priority >> 6 ); @@ -37,7 +37,7 @@ STATIC INLINE unsigned32 _Thread_queue_Header_number ( */ STATIC INLINE boolean _Thread_queue_Is_reverse_search ( - rtems_task_priority the_priority + Priority_Control the_priority ) { return ( the_priority & 0x20 ); diff --git a/c/src/exec/score/inline/userext.inl b/c/src/exec/score/inline/userext.inl index 1558da968a..fa5a31c37b 100644 --- a/c/src/exec/score/inline/userext.inl +++ b/c/src/exec/score/inline/userext.inl @@ -41,8 +41,8 @@ STATIC INLINE void _User_extensions_Handler_initialization ( */ STATIC INLINE void _User_extensions_Add_set ( - User_extensions_Control *the_extension, - rtems_extensions_table *extension_table + User_extensions_Control *the_extension, + rtems_extensions_table *extension_table ) { the_extension->Callouts = *extension_table; diff --git a/c/src/exec/score/macros/object.inl b/c/src/exec/score/macros/object.inl index 27675b19bf..7a346af720 100644 --- a/c/src/exec/score/macros/object.inl +++ b/c/src/exec/score/macros/object.inl @@ -57,6 +57,15 @@ /*PAGE * + * _Objects_Is_class_valid + * + */ + +#define _Objects_Is_class_valid( _the_class ) \ + ( (_the_class) <= OBJECTS_CLASSES_LAST ) + +/*PAGE + * * _Objects_Is_local_node * */ diff --git a/c/src/exec/score/macros/rtems/score/object.inl b/c/src/exec/score/macros/rtems/score/object.inl index 27675b19bf..7a346af720 100644 --- a/c/src/exec/score/macros/rtems/score/object.inl +++ b/c/src/exec/score/macros/rtems/score/object.inl @@ -57,6 +57,15 @@ /*PAGE * + * _Objects_Is_class_valid + * + */ + +#define _Objects_Is_class_valid( _the_class ) \ + ( (_the_class) <= OBJECTS_CLASSES_LAST ) + +/*PAGE + * * _Objects_Is_local_node * */ diff --git a/c/src/exec/score/macros/rtems/score/thread.inl b/c/src/exec/score/macros/rtems/score/thread.inl index 0e041de5ac..d7d37cb218 100644 --- a/c/src/exec/score/macros/rtems/score/thread.inl +++ b/c/src/exec/score/macros/rtems/score/thread.inl @@ -93,7 +93,7 @@ #define _Thread_Calculate_heir() \ { \ - rtems_task_priority highest; \ + Priority_Control highest; \ \ _Priority_Get_highest( highest ); \ \ diff --git a/c/src/exec/score/macros/thread.inl b/c/src/exec/score/macros/thread.inl index 0e041de5ac..d7d37cb218 100644 --- a/c/src/exec/score/macros/thread.inl +++ b/c/src/exec/score/macros/thread.inl @@ -93,7 +93,7 @@ #define _Thread_Calculate_heir() \ { \ - rtems_task_priority highest; \ + Priority_Control highest; \ \ _Priority_Get_highest( highest ); \ \ diff --git a/c/src/exec/score/src/mpci.c b/c/src/exec/score/src/mpci.c index e8d3803d76..26c27ae733 100644 --- a/c/src/exec/score/src/mpci.c +++ b/c/src/exec/score/src/mpci.c @@ -36,8 +36,10 @@ void _MPCI_Handler_initialization ( void ) { _Thread_queue_Initialize( &_MPCI_Remote_blocked_threads, - RTEMS_FIFO, - STATES_WAITING_FOR_RPC_REPLY + OBJECTS_NO_CLASS, + THREAD_QUEUE_DISCIPLINE_FIFO, + STATES_WAITING_FOR_RPC_REPLY, + NULL ); } diff --git a/c/src/exec/score/src/object.c b/c/src/exec/score/src/object.c index b829258a48..b274579736 100644 --- a/c/src/exec/score/src/object.c +++ b/c/src/exec/score/src/object.c @@ -476,3 +476,25 @@ final: *next_id_p = RTEMS_OBJECT_ID_FINAL; return 0; } + +/*PAGE + * + * _Objects_Get_information + * + * XXX + */ + +Objects_Information *_Objects_Get_information( + Objects_Id id +) +{ + Objects_Classes the_class; + + the_class = rtems_get_class( id ); + + if ( !_Objects_Is_class_valid( the_class ) ) + return NULL; + + return _Objects_Information_table[ the_class ]; +} + diff --git a/c/src/exec/score/src/objectmp.c b/c/src/exec/score/src/objectmp.c index a8b067020d..9752aadbc6 100644 --- a/c/src/exec/score/src/objectmp.c +++ b/c/src/exec/score/src/objectmp.c @@ -50,8 +50,31 @@ void _Objects_MP_Handler_initialization ( * _Objects_MP_Open * */ + +void _Objects_MP_Open ( + Objects_Information *information, + Objects_MP_Control *the_global_object, + unsigned32 the_name, /* XXX -- wrong for variable */ + Objects_Id the_id +) +{ + the_global_object->Object.id = the_id; + the_global_object->name = the_name; + + _Chain_Prepend( + &information->global_table[ rtems_get_node( the_id ) ], + &the_global_object->Object.Node + ); + +} -boolean _Objects_MP_Open ( +/*PAGE + * + * _Objects_MP_Allocate_and_open + * + */ + +boolean _Objects_MP_Allocate_and_open ( Objects_Information *information, unsigned32 the_name, /* XXX -- wrong for variable */ Objects_Id the_id, @@ -70,13 +93,7 @@ boolean _Objects_MP_Open ( } - the_global_object->Object.id = the_id; - the_global_object->name = the_name; - - _Chain_Prepend( - &information->global_table[ rtems_get_node( the_id ) ], - &the_global_object->Object.Node - ); + _Objects_MP_Open( information, the_global_object, the_name, the_id ); return TRUE; } diff --git a/c/src/exec/score/src/thread.c b/c/src/exec/score/src/thread.c index c4dde3e6f8..dfc5324cb8 100644 --- a/c/src/exec/score/src/thread.c +++ b/c/src/exec/score/src/thread.c @@ -142,11 +142,11 @@ void _Thread_Enable_dispatch( void ) void _Thread_Dispatch( void ) { - Thread_Control *executing; - Thread_Control *heir; - ISR_Level level; + Thread_Control *executing; + Thread_Control *heir; + ISR_Level level; rtems_signal_set signal_set; - rtems_mode previous_mode; + Modes_Control previous_mode; executing = _Thread_Executing; _ISR_Disable( level ); @@ -199,19 +199,19 @@ void _Thread_Dispatch( void ) _Thread_Dispatch_disable_level = 0; - if ( _ASR_Are_signals_pending( &executing->Signal ) ) { - signal_set = executing->Signal.signals_posted; - executing->Signal.signals_posted = 0; + if ( _ASR_Are_signals_pending( &executing->RTEMS_API->Signal ) ) { + signal_set = executing->RTEMS_API->Signal.signals_posted; + executing->RTEMS_API->Signal.signals_posted = 0; _ISR_Enable( level ); - executing->Signal.nest_level += 1; - if (_Thread_Change_mode( executing->Signal.mode_set, + executing->RTEMS_API->Signal.nest_level += 1; + if (_Thread_Change_mode( executing->RTEMS_API->Signal.mode_set, RTEMS_ALL_MODE_MASKS, &previous_mode )) _Thread_Dispatch(); - (*executing->Signal.handler)( signal_set ); + (*executing->RTEMS_API->Signal.handler)( signal_set ); - executing->Signal.nest_level -= 1; + executing->RTEMS_API->Signal.nest_level -= 1; if (_Thread_Change_mode( previous_mode, RTEMS_ALL_MODE_MASKS, &previous_mode )) _Thread_Dispatch(); @@ -222,6 +222,257 @@ void _Thread_Dispatch( void ) /*PAGE * + * _Thread_Initialize + * + * XXX + */ + +boolean _Thread_Initialize( + Objects_Information *information, + Thread_Control *the_thread, + void *stack_area, /* NULL if to be allocated */ + unsigned32 stack_size, /* insure it is >= min */ + boolean is_fp, /* TRUE if thread uses FP */ + Priority_Control priority, + Modes_Control mode, + Objects_Name name + +) +{ + unsigned32 actual_stack_size; + void *stack; + void *fp_area; + + /* + * Allocate and Initialize the stack for this thread. + */ + + if ( !_Stack_Is_enough( stack_size ) ) + actual_stack_size = RTEMS_MINIMUM_STACK_SIZE; + else + actual_stack_size = stack_size; + + actual_stack_size = _Stack_Adjust_size( actual_stack_size ); + stack = stack_area; + + if ( !stack ) { + stack = _Workspace_Allocate( actual_stack_size ); + + if ( !stack ) + return FALSE; + + the_thread->Start.stack = stack; + } else + the_thread->Start.stack = NULL; + + _Stack_Initialize( + &the_thread->Start.Initial_stack, + stack, + actual_stack_size + ); + + /* + * Allocate the floating point area for this thread + */ + + if ( is_fp ) { + + fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE ); + if ( !fp_area ) { + (void) _Workspace_Free( stack ); + return FALSE; + } + fp_area = _Context_Fp_start( fp_area, 0 ); + + } else + fp_area = NULL; + + the_thread->fp_context = fp_area; + the_thread->Start.fp_context = fp_area; + +/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */ + /* + * Allocate and initialize the RTEMS API specific information + */ + + the_thread->RTEMS_API = _Workspace_Allocate( sizeof( RTEMS_API_Control ) ); + + if ( !the_thread->RTEMS_API ) { +/* XXX when in task_create + _RTEMS_tasks_Free( the_thread ); + _Objects_MP_Free_global_object( the_global_object ); + + _Thread_Enable_dispatch(); + return( RTEMS_UNSATISFIED ); +*/ + (void) _Workspace_Free( stack ); + (void) _Workspace_Free( fp_area ); + return FALSE; + + } + + the_thread->RTEMS_API->is_global = FALSE; + the_thread->RTEMS_API->pending_events = EVENT_SETS_NONE_PENDING; + _ASR_Initialize( &the_thread->RTEMS_API->Signal ); + + /* XXX should not be here .... */ + +/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */ + + /* + * General initialization + */ + + the_thread->current_state = STATES_DORMANT; + the_thread->current_modes = mode; + the_thread->resource_count = 0; + the_thread->real_priority = priority; + the_thread->Start.initial_priority = priority; + the_thread->Start.initial_modes = mode; + + _Thread_Set_priority( the_thread, priority ); + + /* + * Open the object + */ + + _Objects_Open( information, &the_thread->Object, name ); + + /* + * Invoke create extensions + */ + + _User_extensions_Task_create( the_thread ); + /* XXX if this fails ... */ + + return TRUE; +} + +/* + * _Thread_Start + * + * DESCRIPTION: + * + * XXX + */ + +boolean _Thread_Start( + Thread_Control *the_thread, + Thread_Start_types the_prototype, + void *entry_point, + void *pointer_argument, + unsigned32 numeric_argument +) +{ + if ( _States_Is_dormant( the_thread->current_state ) ) { + + the_thread->Start.entry_point = entry_point; + + the_thread->Start.prototype = the_prototype; + the_thread->Start.pointer_argument = pointer_argument; + the_thread->Start.numeric_argument = numeric_argument; + + _Thread_Load_environment( the_thread ); + + _Thread_Ready( the_thread ); + + _User_extensions_Task_start( the_thread ); + + return TRUE; + } + + return FALSE; + +} + +/* + * _Thread_Restart + * + * DESCRIPTION: + * + * XXX + */ + +boolean _Thread_Restart( + Thread_Control *the_thread, + void *pointer_argument, + unsigned32 numeric_argument +) +{ + if ( !_States_Is_dormant( the_thread->current_state ) ) { + + _Thread_Set_transient( the_thread ); + the_thread->resource_count = 0; + the_thread->current_modes = the_thread->Start.initial_modes; + + the_thread->Start.pointer_argument = pointer_argument; + the_thread->Start.numeric_argument = numeric_argument; + + if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) { + + if ( _Watchdog_Is_active( &the_thread->Timer ) ) + (void) _Watchdog_Remove( &the_thread->Timer ); + } + + if ( the_thread->current_priority != the_thread->Start.initial_priority ) { + the_thread->real_priority = the_thread->Start.initial_priority; + _Thread_Set_priority( the_thread, the_thread->Start.initial_priority ); + } + + _Thread_Load_environment( the_thread ); + + _Thread_Ready( the_thread ); + + _User_extensions_Task_restart( the_thread ); + + if ( _Thread_Is_executing ( the_thread ) ) + _Thread_Restart_self(); + + return TRUE; + } + + return FALSE; +} + +/* + * _Thread_Close + * + * DESCRIPTION: + * + * XXX + */ + +void _Thread_Close( + Objects_Information *information, + Thread_Control *the_thread +) +{ + _Objects_Close( information, &the_thread->Object ); + + _Thread_Set_state( the_thread, STATES_TRANSIENT ); + + if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) { + + if ( _Watchdog_Is_active( &the_thread->Timer ) ) + (void) _Watchdog_Remove( &the_thread->Timer ); + } + + _User_extensions_Task_delete( the_thread ); + +#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE ) + if ( _Thread_Is_allocated_fp( the_thread ) ) + _Thread_Deallocate_fp(); +#endif + the_thread->fp_context = NULL; + + (void) _Workspace_Free( the_thread->Start.fp_context ); + + if ( the_thread->Start.stack ) + (void) _Workspace_Free( the_thread->Start.stack ); +} + +/*PAGE + * * _Thread_Ready * * This kernel routine readies the requested thread, the thread chain @@ -595,7 +846,26 @@ void _Thread_Handler( void ) _Thread_Enable_dispatch(); - (*executing->Start.entry_point)( executing->Start.initial_argument ); + switch ( executing->Start.prototype ) { + case THREAD_START_NUMERIC: + (*executing->Start.entry_point)( executing->Start.numeric_argument ); + break; + case THREAD_START_POINTER: + (*executing->Start.entry_point)( executing->Start.pointer_argument ); + break; + case THREAD_START_BOTH_POINTER_FIRST: + (*executing->Start.entry_point)( + executing->Start.pointer_argument, + executing->Start.numeric_argument + ); + break; + case THREAD_START_BOTH_NUMERIC_FIRST: + (*executing->Start.entry_point)( + executing->Start.numeric_argument, + executing->Start.pointer_argument + ); + break; + } _User_extensions_Task_exitted( executing ); @@ -654,8 +924,8 @@ void _Thread_Delay_ended( */ void _Thread_Change_priority( - Thread_Control *the_thread, - rtems_task_priority new_priority + Thread_Control *the_thread, + Priority_Control new_priority ) { ISR_Level level; @@ -704,8 +974,8 @@ void _Thread_Change_priority( */ void _Thread_Set_priority( - Thread_Control *the_thread, - rtems_task_priority new_priority + Thread_Control *the_thread, + Priority_Control new_priority ) { the_thread->current_priority = new_priority; @@ -735,13 +1005,13 @@ void _Thread_Set_priority( */ boolean _Thread_Change_mode( - unsigned32 new_mode_set, - unsigned32 mask, - unsigned32 *old_mode_set + Modes_Control new_mode_set, + Modes_Control mask, + Modes_Control *old_mode_set ) { - rtems_mode changed; - rtems_mode threads_new_mode_set; + Modes_Control changed; + Modes_Control threads_new_mode_set; Thread_Control *executing; boolean need_dispatch; @@ -754,7 +1024,7 @@ boolean _Thread_Change_mode( _Modes_Set_interrupt_level( threads_new_mode_set ); if ( _Modes_Mask_changed( changed, RTEMS_ASR_MASK ) ) - _ASR_Swap_signals( &executing->Signal ); + _ASR_Swap_signals( &executing->RTEMS_API->Signal ); executing->current_modes = threads_new_mode_set; need_dispatch = TRUE; @@ -765,7 +1035,7 @@ boolean _Thread_Change_mode( _Context_Switch_necessary = TRUE; - else if ( !_ASR_Are_signals_pending( &executing->Signal ) ) + else if ( !_ASR_Are_signals_pending( &executing->RTEMS_API->Signal ) ) need_dispatch = FALSE; diff --git a/c/src/exec/score/src/threadq.c b/c/src/exec/score/src/threadq.c index 60ffb5db38..7b4647bb7f 100644 --- a/c/src/exec/score/src/threadq.c +++ b/c/src/exec/score/src/threadq.c @@ -30,33 +30,39 @@ * * Input parameters: * the_thread_queue - pointer to a threadq header - * attribute_set - used to determine queueing discipline + * the_class - class of the object to which this belongs + * discipline - queueing discipline * state - state of waiting threads * * Output parameters: NONE */ void _Thread_queue_Initialize( - Thread_queue_Control *the_thread_queue, - rtems_attribute attribute_set, - States_Control state + Thread_queue_Control *the_thread_queue, + Objects_Classes the_class, + Thread_queue_Disciplines the_discipline, + States_Control state, + Thread_queue_Extract_callout proxy_extract_callout ) { unsigned32 index; - if ( _Attributes_Is_priority( attribute_set ) ) { - the_thread_queue->discipline = THREAD_QUEUE_DATA_PRIORITY_DISCIPLINE; - for( index=0 ; - index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ; - index++) - _Chain_Initialize_empty( &the_thread_queue->Queues.Priority[index] ); - } - else { - the_thread_queue->discipline = THREAD_QUEUE_DATA_FIFO_DISCIPLINE; - _Chain_Initialize_empty( &the_thread_queue->Queues.Fifo ); - } + _Thread_queue_Extract_table[ the_class ] = proxy_extract_callout; + + the_thread_queue->state = state; + the_thread_queue->discipline = the_discipline; - the_thread_queue->state = state; + switch ( the_discipline ) { + case THREAD_QUEUE_DISCIPLINE_FIFO: + _Chain_Initialize_empty( &the_thread_queue->Queues.Fifo ); + break; + case THREAD_QUEUE_DISCIPLINE_PRIORITY: + for( index=0 ; + index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ; + index++) + _Chain_Initialize_empty( &the_thread_queue->Queues.Priority[index] ); + break; + } } @@ -107,10 +113,10 @@ void _Thread_queue_Enqueue( } switch( the_thread_queue->discipline ) { - case THREAD_QUEUE_DATA_FIFO_DISCIPLINE: + case THREAD_QUEUE_DISCIPLINE_FIFO: _Thread_queue_Enqueue_fifo( the_thread_queue, the_thread, timeout ); break; - case THREAD_QUEUE_DATA_PRIORITY_DISCIPLINE: + case THREAD_QUEUE_DISCIPLINE_PRIORITY: _Thread_queue_Enqueue_priority( the_thread_queue, the_thread, timeout ); break; @@ -144,10 +150,10 @@ Thread_Control *_Thread_queue_Dequeue( ISR_Level level; switch ( the_thread_queue->discipline ) { - case THREAD_QUEUE_DATA_FIFO_DISCIPLINE: + case THREAD_QUEUE_DISCIPLINE_FIFO: the_thread = _Thread_queue_Dequeue_fifo( the_thread_queue ); break; - case THREAD_QUEUE_DATA_PRIORITY_DISCIPLINE: + case THREAD_QUEUE_DISCIPLINE_PRIORITY: the_thread = _Thread_queue_Dequeue_priority( the_thread_queue ); break; default: /* this is only to prevent warnings */ @@ -171,6 +177,45 @@ Thread_Control *_Thread_queue_Dequeue( /*PAGE * + * _Thread_queue_Extract_with_proxy + * + * This routine extracts the_thread from the_thread_queue + * and insures that if there is a proxy for this task on + * another node, it is also dealt with. + * + * XXX + */ + +boolean _Thread_queue_Extract_with_proxy( + Thread_Control *the_thread +) +{ + States_Control state; + Objects_Classes the_class; + Thread_queue_Extract_callout proxy_extract_callout; + + state = the_thread->current_state; + + if ( _States_Is_waiting_on_thread_queue( state ) ) { + if ( _States_Is_waiting_for_rpc_reply( state ) && + _States_Is_locally_blocked( state ) ) { + + the_class = rtems_get_class( the_thread->Wait.id ); + + proxy_extract_callout = _Thread_queue_Extract_table[ the_class ]; + + if ( proxy_extract_callout ) + (*proxy_extract_callout)( the_thread ); + } + _Thread_queue_Extract( the_thread->Wait.queue, the_thread ); + + return TRUE; + } + return FALSE; +} + +/*PAGE + * * _Thread_queue_Extract * * This routine removes a specific thread from the specified threadq, @@ -191,10 +236,10 @@ void _Thread_queue_Extract( ) { switch ( the_thread_queue->discipline ) { - case THREAD_QUEUE_DATA_FIFO_DISCIPLINE: + case THREAD_QUEUE_DISCIPLINE_FIFO: _Thread_queue_Extract_fifo( the_thread_queue, the_thread ); break; - case THREAD_QUEUE_DATA_PRIORITY_DISCIPLINE: + case THREAD_QUEUE_DISCIPLINE_PRIORITY: _Thread_queue_Extract_priority( the_thread_queue, the_thread ); break; } @@ -248,10 +293,10 @@ Thread_Control *_Thread_queue_First( Thread_Control *the_thread; switch ( the_thread_queue->discipline ) { - case THREAD_QUEUE_DATA_FIFO_DISCIPLINE: + case THREAD_QUEUE_DISCIPLINE_FIFO: the_thread = _Thread_queue_First_fifo( the_thread_queue ); break; - case THREAD_QUEUE_DATA_PRIORITY_DISCIPLINE: + case THREAD_QUEUE_DISCIPLINE_PRIORITY: the_thread = _Thread_queue_First_priority( the_thread_queue ); break; default: /* this is only to prevent warnings */ @@ -437,16 +482,17 @@ void _Thread_queue_Extract_fifo( if ( !_Watchdog_Is_active( &the_thread->Timer ) ) { _ISR_Enable( level ); - _Thread_Unblock( the_thread ); } else { _Watchdog_Deactivate( &the_thread->Timer ); _ISR_Enable( level ); (void) _Watchdog_Remove( &the_thread->Timer ); - _Thread_Unblock( the_thread ); } + _Thread_Unblock( the_thread ); + if ( !_Objects_Is_local_id( the_thread->Object.id ) ) _Thread_MP_Free_proxy( the_thread ); + } /*PAGE @@ -498,17 +544,17 @@ void _Thread_queue_Enqueue_priority( rtems_interval timeout ) { - rtems_task_priority search_priority; - Thread_Control *search_thread; - ISR_Level level; - Chain_Control *header; - unsigned32 header_index; - Chain_Node *the_node; - Chain_Node *next_node; - Chain_Node *previous_node; - Chain_Node *search_node; - rtems_task_priority priority; - States_Control block_state; + Priority_Control search_priority; + Thread_Control *search_thread; + ISR_Level level; + Chain_Control *header; + unsigned32 header_index; + Chain_Node *the_node; + Chain_Node *next_node; + Chain_Node *previous_node; + Chain_Node *search_node; + Priority_Control priority; + States_Control block_state; _Chain_Initialize_empty( &the_thread->Wait.Block2n ); diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/clock/ckinit.c b/c/src/lib/libbsp/no_cpu/no_bsp/clock/ckinit.c index 426b55137b..e4e695ad82 100644 --- a/c/src/lib/libbsp/no_cpu/no_bsp/clock/ckinit.c +++ b/c/src/lib/libbsp/no_cpu/no_bsp/clock/ckinit.c @@ -16,8 +16,12 @@ #include <stdlib.h> #include <rtems.h> +#include <rtems/libio.h> #include <bsp.h> -#include <clockdrv.h> + +void Clock_exit( void ); +rtems_isr Clock_isr( rtems_vector_number vector ); + /* * The interrupt vector number associated with the clock tick device @@ -30,6 +34,7 @@ * Clock_driver_ticks is a monotonically increasing counter of the * number of clock ticks since the driver was initialized. */ + volatile rtems_unsigned32 Clock_driver_ticks; /* @@ -43,27 +48,17 @@ volatile rtems_unsigned32 Clock_driver_ticks; rtems_unsigned32 Clock_isrs; /* ISRs until next tick */ /* - * The previous ISR on this clock tick interrupt vector. + * These are set by clock driver during its init */ - -rtems_isr_entry Old_ticker; + +rtems_device_major_number rtems_clock_major = ~0; +rtems_device_minor_number rtems_clock_minor; /* - * Clock_initialize - * - * Device driver entry point for clock tick driver initialization. + * The previous ISR on this clock tick interrupt vector. */ -rtems_device_driver Clock_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *pargp, - rtems_id tid, - rtems_unsigned32 *rval -) -{ - Install_clock( Clock_isr ); -} +rtems_isr_entry Old_ticker; /* * Reinstall_clock @@ -141,3 +136,55 @@ void Clock_exit( void ) /* XXX: If necessary, restore the old vector */ } } + +/* + * Clock_initialize + * + * Device driver entry point for clock tick driver initialization. + */ + +rtems_device_driver Clock_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + Install_clock((rtems_isr_entry) Clock_isr); + + /* + * make major/minor avail to others such as shared memory driver + */ + rtems_clock_major = major; + rtems_clock_minor = minor; + + return RTEMS_SUCCESSFUL; +} + +rtems_device_driver Clock_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + rtems_libio_ioctl_args_t *args = pargp; + + if (args == 0) + goto done; + + /* + * This is hokey, but until we get a defined interface + * to do this, it will just be this simple... + */ + + if (args->command == rtems_build_name('I', 'S', 'R', ' ')) + { + Clock_isr(CLOCK_VECTOR); + } + else if (args->command == rtems_build_name('N', 'E', 'W', ' ')) + { + ReInstall_clock(args->buffer); + } + +done: + return RTEMS_SUCCESSFUL; +} diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/include/bsp.h b/c/src/lib/libbsp/no_cpu/no_bsp/include/bsp.h index 0f1c94caf4..5bb7c62577 100644 --- a/c/src/lib/libbsp/no_cpu/no_bsp/include/bsp.h +++ b/c/src/lib/libbsp/no_cpu/no_bsp/include/bsp.h @@ -23,6 +23,7 @@ extern "C" { #endif #include <rtems.h> +#include <clockdrv.h> /* * Define the time limits for RTEMS Test Suite test durations. @@ -67,6 +68,20 @@ extern "C" { extern rtems_configuration_table BSP_Configuration; +/* + * Console driver init + */ + +rtems_device_driver console_initialize( + rtems_device_major_number, rtems_device_minor_number minor, void *); + +#define CONSOLE_DRIVER_TABLE_ENTRY \ + { console_initialize, NULL, NULL, NULL, NULL, NULL } + +/* + * NOTE: Use the standard Clock driver entry + */ + /* functions */ void bsp_cleanup( void ); diff --git a/c/src/lib/libc/libio.c b/c/src/lib/libc/libio.c index ce41643a09..f2046501ce 100644 --- a/c/src/lib/libc/libio.c +++ b/c/src/lib/libc/libio.c @@ -111,10 +111,13 @@ rtems_libio_init(void) rtems_libio_last_iop = rtems_libio_iops + (rtems_libio_number_iops - 1); } - rc = rtems_semaphore_create(RTEMS_LIBIO_SEM, - 1, - RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, - &rtems_libio_semaphore); + rc = rtems_semaphore_create( + RTEMS_LIBIO_SEM, + 1, + RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, + RTEMS_NO_PRIORITY, + &rtems_libio_semaphore + ); if (rc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred(rc); } @@ -199,9 +202,13 @@ rtems_libio_allocate(void) * Got one; create a semaphore for it */ - rc = rtems_semaphore_create(RTEMS_LIBIO_IOP_SEM(iop - rtems_libio_iops), - 1, RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, - &iop->sem); + rc = rtems_semaphore_create( + RTEMS_LIBIO_IOP_SEM(iop - rtems_libio_iops), + 1, + RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, + RTEMS_NO_PRIORITY, + &iop->sem + ); if (rc != RTEMS_SUCCESSFUL) goto failed; diff --git a/c/src/lib/libc/support.c b/c/src/lib/libc/support.c index ac7b06963d..c4e207df0a 100644 --- a/c/src/lib/libc/support.c +++ b/c/src/lib/libc/support.c @@ -22,7 +22,7 @@ void MY_task_set_note( unsigned32 note ) { - the_thread->Notepads[ notepad ] = note; + the_thread->RTEMS_API->Notepads[ notepad ] = note; } @@ -31,7 +31,7 @@ unsigned32 MY_task_get_note( unsigned32 notepad ) { - return the_thread->Notepads[ notepad ]; + return the_thread->RTEMS_API->Notepads[ notepad ]; } void *MY_CPU_Context_FP_start( diff --git a/c/src/lib/libmisc/monitor/mon-task.c b/c/src/lib/libmisc/monitor/mon-task.c index 4e5b80aed6..1f4dee7dee 100644 --- a/c/src/lib/libmisc/monitor/mon-task.c +++ b/c/src/lib/libmisc/monitor/mon-task.c @@ -21,16 +21,16 @@ rtems_monitor_task_canonical( Thread_Control *rtems_thread = (Thread_Control *) thread_void; canonical_task->entry = rtems_thread->Start.entry_point; - canonical_task->argument = rtems_thread->Start.initial_argument; + canonical_task->argument = rtems_thread->Start.numeric_argument; canonical_task->stack = rtems_thread->Start.Initial_stack.area; canonical_task->stack_size = rtems_thread->Start.Initial_stack.size; canonical_task->priority = rtems_thread->current_priority; canonical_task->state = rtems_thread->current_state; canonical_task->wait_id = rtems_thread->Wait.id; - canonical_task->events = rtems_thread->pending_events; + canonical_task->events = rtems_thread->RTEMS_API->pending_events; canonical_task->modes = rtems_thread->current_modes; - canonical_task->attributes = rtems_thread->attribute_set; - (void) memcpy(canonical_task->notepad, rtems_thread->Notepads, sizeof(canonical_task->notepad)); + canonical_task->attributes = 0 /* XXX FIX ME rtems_thread->RTEMS_API->attribute_set */; + (void) memcpy(canonical_task->notepad, rtems_thread->RTEMS_API->Notepads, sizeof(canonical_task->notepad)); (void) memcpy(&canonical_task->wait_args, &rtems_thread->Wait.Extra, sizeof(canonical_task->wait_args)); } diff --git a/c/src/lib/libmisc/stackchk/check.c b/c/src/lib/libmisc/stackchk/check.c index 1d30bc813e..f9f32c5204 100644 --- a/c/src/lib/libmisc/stackchk/check.c +++ b/c/src/lib/libmisc/stackchk/check.c @@ -433,7 +433,7 @@ void Stack_check_Dump_usage( void ) class_index++ ) { information = _Objects_Information_table[ class_index ]; if ( information && information->is_thread ) { - for ( i=1 ; i < information->maximum ; i++ ) { + for ( i=1 ; i <= information->maximum ; i++ ) { the_thread = (Thread_Control *)information->local_table[ i ]; Stack_check_Dump_threads_usage( the_thread ); if ( the_thread == _Thread_Executing ) diff --git a/c/src/libmisc/monitor/mon-task.c b/c/src/libmisc/monitor/mon-task.c index 4e5b80aed6..1f4dee7dee 100644 --- a/c/src/libmisc/monitor/mon-task.c +++ b/c/src/libmisc/monitor/mon-task.c @@ -21,16 +21,16 @@ rtems_monitor_task_canonical( Thread_Control *rtems_thread = (Thread_Control *) thread_void; canonical_task->entry = rtems_thread->Start.entry_point; - canonical_task->argument = rtems_thread->Start.initial_argument; + canonical_task->argument = rtems_thread->Start.numeric_argument; canonical_task->stack = rtems_thread->Start.Initial_stack.area; canonical_task->stack_size = rtems_thread->Start.Initial_stack.size; canonical_task->priority = rtems_thread->current_priority; canonical_task->state = rtems_thread->current_state; canonical_task->wait_id = rtems_thread->Wait.id; - canonical_task->events = rtems_thread->pending_events; + canonical_task->events = rtems_thread->RTEMS_API->pending_events; canonical_task->modes = rtems_thread->current_modes; - canonical_task->attributes = rtems_thread->attribute_set; - (void) memcpy(canonical_task->notepad, rtems_thread->Notepads, sizeof(canonical_task->notepad)); + canonical_task->attributes = 0 /* XXX FIX ME rtems_thread->RTEMS_API->attribute_set */; + (void) memcpy(canonical_task->notepad, rtems_thread->RTEMS_API->Notepads, sizeof(canonical_task->notepad)); (void) memcpy(&canonical_task->wait_args, &rtems_thread->Wait.Extra, sizeof(canonical_task->wait_args)); } diff --git a/c/src/libmisc/stackchk/check.c b/c/src/libmisc/stackchk/check.c index 1d30bc813e..f9f32c5204 100644 --- a/c/src/libmisc/stackchk/check.c +++ b/c/src/libmisc/stackchk/check.c @@ -433,7 +433,7 @@ void Stack_check_Dump_usage( void ) class_index++ ) { information = _Objects_Information_table[ class_index ]; if ( information && information->is_thread ) { - for ( i=1 ; i < information->maximum ; i++ ) { + for ( i=1 ; i <= information->maximum ; i++ ) { the_thread = (Thread_Control *)information->local_table[ i ]; Stack_check_Dump_threads_usage( the_thread ); if ( the_thread == _Thread_Executing ) diff --git a/c/src/optman/rtems/no-sem.c b/c/src/optman/rtems/no-sem.c index 52f64c0aa5..d96b1693e2 100644 --- a/c/src/optman/rtems/no-sem.c +++ b/c/src/optman/rtems/no-sem.c @@ -31,10 +31,11 @@ void _Semaphore_Manager_initialization( } rtems_status_code rtems_semaphore_create( - rtems_name name, - unsigned32 count, - rtems_attribute attribute_set, - Objects_Id *id + rtems_name name, + unsigned32 count, + rtems_attribute attribute_set, + rtems_task_priority priority_ceiling, + Objects_Id *id ) { return( RTEMS_NOT_CONFIGURED ); diff --git a/c/src/optman/rtems/no-signal.c b/c/src/optman/rtems/no-signal.c index 50f941887c..fedbf87db3 100644 --- a/c/src/optman/rtems/no-signal.c +++ b/c/src/optman/rtems/no-signal.c @@ -22,14 +22,14 @@ rtems_status_code rtems_signal_catch( rtems_asr_entry handler, - rtems_mode mode_set + rtems_mode mode_set ) { return( RTEMS_NOT_CONFIGURED ); } rtems_status_code rtems_signal_send( - Objects_Id id, + rtems_id id, rtems_signal_set signal_set ) { diff --git a/c/src/tests/mptests/mp08/init.c b/c/src/tests/mptests/mp08/init.c index 2a669d2b9a..6f43d6635d 100644 --- a/c/src/tests/mptests/mp08/init.c +++ b/c/src/tests/mptests/mp08/init.c @@ -50,6 +50,7 @@ rtems_task Init( Semaphore_name[ 1 ], 1, RTEMS_GLOBAL, + RTEMS_NO_PRIORITY, &Semaphore_id[ 1 ] ); directive_failed( status, "rtems_semaphore_create" ); diff --git a/c/src/tests/mptests/mp10/init.c b/c/src/tests/mptests/mp10/init.c index c5fe62e099..4d150be3da 100644 --- a/c/src/tests/mptests/mp10/init.c +++ b/c/src/tests/mptests/mp10/init.c @@ -69,6 +69,7 @@ rtems_task Init( Semaphore_name[ 1 ], 0, RTEMS_GLOBAL | RTEMS_PRIORITY, + RTEMS_NO_PRIORITY, &Semaphore_id[ 1 ] ); directive_failed( status, "rtems_semaphore_create" ); diff --git a/c/src/tests/mptests/mp11/init.c b/c/src/tests/mptests/mp11/init.c index c2837a7fc2..a560b35159 100644 --- a/c/src/tests/mptests/mp11/init.c +++ b/c/src/tests/mptests/mp11/init.c @@ -85,6 +85,7 @@ rtems_task Init( Semaphore_name[ 1 ], 1, RTEMS_GLOBAL, + RTEMS_NO_PRIORITY, &junk_id ); fatal_directive_status( status, RTEMS_TOO_MANY, "rtems_semaphore_create" ); diff --git a/c/src/tests/mptests/mp13/init.c b/c/src/tests/mptests/mp13/init.c index eb2de9733c..cff264e506 100644 --- a/c/src/tests/mptests/mp13/init.c +++ b/c/src/tests/mptests/mp13/init.c @@ -62,6 +62,7 @@ rtems_task Init( Semaphore_name[ 1 ], 1, RTEMS_GLOBAL | RTEMS_PRIORITY, + RTEMS_NO_PRIORITY, &Semaphore_id[ 1 ] ); directive_failed( status, "rtems_semaphore_create" ); diff --git a/c/src/tests/mptests/mp14/init.c b/c/src/tests/mptests/mp14/init.c index 99891d50ba..bc35d86469 100644 --- a/c/src/tests/mptests/mp14/init.c +++ b/c/src/tests/mptests/mp14/init.c @@ -94,6 +94,7 @@ rtems_task Init( Semaphore_name[ 1 ], 1, RTEMS_GLOBAL, + RTEMS_NO_PRIORITY, &Semaphore_id[ 1 ] ); directive_failed( status, "rtems_semaphore_create" ); diff --git a/c/src/tests/sptests/sp09/screen05.c b/c/src/tests/sptests/sp09/screen05.c index 2ba984aba2..c47a25f89d 100644 --- a/c/src/tests/sptests/sp09/screen05.c +++ b/c/src/tests/sptests/sp09/screen05.c @@ -23,7 +23,13 @@ void Screen5() { rtems_status_code status; - status = rtems_semaphore_create( 0, 1, RTEMS_DEFAULT_ATTRIBUTES, &Junk_id ); + status = rtems_semaphore_create( + 0, + 1, + RTEMS_DEFAULT_ATTRIBUTES, + RTEMS_NO_PRIORITY, + &Junk_id + ); fatal_directive_status( status, RTEMS_INVALID_NAME, @@ -35,6 +41,7 @@ void Screen5() Semaphore_name[ 1 ], 1, RTEMS_DEFAULT_ATTRIBUTES, + RTEMS_NO_PRIORITY, &Semaphore_id[ 1 ] ); directive_failed( status, "rtems_semaphore_create" ); @@ -44,6 +51,7 @@ void Screen5() Semaphore_name[ 2 ], 1, RTEMS_BINARY_SEMAPHORE, + RTEMS_NO_PRIORITY, &Semaphore_id[ 2 ] ); directive_failed( status, "rtems_semaphore_create" ); @@ -54,7 +62,9 @@ void Screen5() Semaphore_name[ 3 ], 1, RTEMS_DEFAULT_ATTRIBUTES, - &Junk_id); + RTEMS_NO_PRIORITY, + &Junk_id + ); } while (status == RTEMS_SUCCESSFUL); fatal_directive_status( @@ -68,6 +78,7 @@ void Screen5() Semaphore_name[ 1 ], 1, RTEMS_INHERIT_PRIORITY | RTEMS_BINARY_SEMAPHORE | RTEMS_FIFO, + RTEMS_NO_PRIORITY, &Junk_id ); fatal_directive_status( @@ -81,6 +92,7 @@ void Screen5() Semaphore_name[ 1 ], 1, RTEMS_INHERIT_PRIORITY | RTEMS_COUNTING_SEMAPHORE | RTEMS_PRIORITY, + RTEMS_NO_PRIORITY, &Junk_id ); fatal_directive_status( @@ -94,6 +106,7 @@ void Screen5() Semaphore_name[ 1 ], 2, RTEMS_BINARY_SEMAPHORE, + RTEMS_NO_PRIORITY, &Junk_id ); fatal_directive_status( @@ -107,6 +120,7 @@ void Screen5() Semaphore_name[ 3 ], 1, RTEMS_GLOBAL, + RTEMS_NO_PRIORITY, &Junk_id ); fatal_directive_status( diff --git a/c/src/tests/sptests/sp12/init.c b/c/src/tests/sptests/sp12/init.c index dd702ca75e..3bbd0ef1c6 100644 --- a/c/src/tests/sptests/sp12/init.c +++ b/c/src/tests/sptests/sp12/init.c @@ -53,10 +53,11 @@ rtems_task Init( Semaphore_name[ 3 ] = rtems_build_name( 'S', 'M', '3', ' ' ); status = rtems_semaphore_create( - Semaphore_name[ 1 ], - 1, - RTEMS_DEFAULT_ATTRIBUTES, - &Semaphore_id[ 1 ] + Semaphore_name[ 1 ], + 1, + RTEMS_DEFAULT_ATTRIBUTES, + RTEMS_NO_PRIORITY, + &Semaphore_id[ 1 ] ); directive_failed( status, "rtems_semaphore_create of SM1" ); @@ -64,6 +65,7 @@ rtems_task Init( Semaphore_name[ 2 ], 0, RTEMS_PRIORITY, + RTEMS_NO_PRIORITY, &Semaphore_id[ 2 ] ); directive_failed( status, "rtems_semaphore_create of SM2" ); @@ -72,6 +74,7 @@ rtems_task Init( Semaphore_name[ 3 ], 1, RTEMS_DEFAULT_ATTRIBUTES, + RTEMS_NO_PRIORITY, &Semaphore_id[ 3 ] ); directive_failed( status, "rtems_semaphore_create of SM3" ); @@ -94,6 +97,7 @@ pause(); Semaphore_name[ 2 ], 0, RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY, + RTEMS_NO_PRIORITY, &Semaphore_id[ 2 ] ); directive_failed( status, "rtems_semaphore_create of priority inherit SM2" ); @@ -110,6 +114,7 @@ pause(); Semaphore_name[ 2 ], 1, RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY, + RTEMS_NO_PRIORITY, &Semaphore_id[ 2 ] ); directive_failed( status, "rtems_semaphore_create of priority inherit SM2" ); @@ -125,6 +130,7 @@ pause(); Semaphore_name[ 2 ], 0, RTEMS_PRIORITY, + RTEMS_NO_PRIORITY, &Semaphore_id[ 2 ] ); directive_failed( status, "rtems_semaphore_create of priority SM2" ); diff --git a/c/src/tests/tmtests/tm01/task1.c b/c/src/tests/tmtests/tm01/task1.c index 2463722320..c4e4e4bc0d 100644 --- a/c/src/tests/tmtests/tm01/task1.c +++ b/c/src/tests/tmtests/tm01/task1.c @@ -82,6 +82,7 @@ rtems_task Test_task( name, OPERATION_COUNT, RTEMS_DEFAULT_MODES, + RTEMS_NO_PRIORITY, &smid ); end_time = Read_timer(); @@ -110,6 +111,7 @@ rtems_task Test_task( name, OPERATION_COUNT, RTEMS_DEFAULT_ATTRIBUTES, + RTEMS_NO_PRIORITY, &smid ); diff --git a/c/src/tests/tmtests/tm02/task1.c b/c/src/tests/tmtests/tm02/task1.c index e86ed6af65..46f947b405 100644 --- a/c/src/tests/tmtests/tm02/task1.c +++ b/c/src/tests/tmtests/tm02/task1.c @@ -107,6 +107,7 @@ void test_init() rtems_build_name( 'S', 'M', '1', ' '), 0, RTEMS_DEFAULT_ATTRIBUTES, + RTEMS_NO_PRIORITY, &Semaphore_id ); directive_failed( status, "rtems_semaphore_create of SM1" ); diff --git a/c/src/tests/tmtests/tm03/task1.c b/c/src/tests/tmtests/tm03/task1.c index 0ee82005d7..5c14f5b6e4 100644 --- a/c/src/tests/tmtests/tm03/task1.c +++ b/c/src/tests/tmtests/tm03/task1.c @@ -71,6 +71,7 @@ rtems_task test_init( rtems_build_name( 'S', 'M', '1', '\0'), 0, RTEMS_DEFAULT_ATTRIBUTES, + RTEMS_NO_PRIORITY, &Semaphore_id ); directive_failed( status, "rtems_semaphore_create of SM1" ); diff --git a/c/src/tests/tmtests/tm04/task1.c b/c/src/tests/tmtests/tm04/task1.c index 0014d02dd3..371f250282 100644 --- a/c/src/tests/tmtests/tm04/task1.c +++ b/c/src/tests/tmtests/tm04/task1.c @@ -77,6 +77,7 @@ void test_init() rtems_build_name( 'S', 'M', '1', ' ' ), 0, RTEMS_DEFAULT_ATTRIBUTES, + RTEMS_NO_PRIORITY, &Semaphore_id ); directive_failed( status, "rtems_semaphore_create of SM1" ); diff --git a/c/src/tests/tmtests/tm21/task1.c b/c/src/tests/tmtests/tm21/task1.c index 9b8715aa83..3bd8dc61dc 100644 --- a/c/src/tests/tmtests/tm21/task1.c +++ b/c/src/tests/tmtests/tm21/task1.c @@ -82,6 +82,7 @@ rtems_task Task_1( index, OPERATION_COUNT, RTEMS_DEFAULT_ATTRIBUTES, + RTEMS_NO_PRIORITY, &id ); directive_failed( status, "rtems_semaphore_create" ); diff --git a/c/src/tests/tmtests/tm25/task1.c b/c/src/tests/tmtests/tm25/task1.c index 1959b668e3..26eaa2a452 100644 --- a/c/src/tests/tmtests/tm25/task1.c +++ b/c/src/tests/tmtests/tm25/task1.c @@ -41,6 +41,7 @@ rtems_task Init( rtems_build_name( 'S', 'M', '1', ' ') , 0, RTEMS_DEFAULT_ATTRIBUTES, + RTEMS_NO_PRIORITY, &Semaphore_id ); directive_failed( status, "rtems_semaphore_create of SM1" ); diff --git a/c/src/tests/tmtests/tm26/task1.c b/c/src/tests/tmtests/tm26/task1.c index 6442017101..745e2682f1 100644 --- a/c/src/tests/tmtests/tm26/task1.c +++ b/c/src/tests/tmtests/tm26/task1.c @@ -141,6 +141,7 @@ rtems_task Init( rtems_build_name( 'S', 'E', 'M', '1' ), OPERATION_COUNT, RTEMS_DEFAULT_ATTRIBUTES, + RTEMS_NO_PRIORITY, &Semaphore_id ); directive_failed( status, "rtems_semaphore_create" ); diff --git a/c/src/tests/tmtests/tmoverhd/dumrtems.h b/c/src/tests/tmtests/tmoverhd/dumrtems.h index d0492c1014..161ab1c7fa 100644 --- a/c/src/tests/tmtests/tmoverhd/dumrtems.h +++ b/c/src/tests/tmtests/tmoverhd/dumrtems.h @@ -172,8 +172,8 @@ #define rtems_region_return_segment( rnid, segaddr ) \ Empty_directive( rnid, segaddr ) -#define rtems_semaphore_create( name, count, attr, smid ) \ - Empty_directive( name, count, attr, smid ) +#define rtems_semaphore_create( name, count, attr, priceil, smid ) \ + Empty_directive( name, count, attr, priceil, smid ) #define rtems_semaphore_delete( smid ) \ Empty_directive( smid ) #define rtems_semaphore_ident( name, node, smid ) \ diff --git a/c/src/tests/tmtests/tmoverhd/testtask.c b/c/src/tests/tmtests/tmoverhd/testtask.c index 0586f39a35..9daa1f0949 100644 --- a/c/src/tests/tmtests/tmoverhd/testtask.c +++ b/c/src/tests/tmtests/tmoverhd/testtask.c @@ -510,6 +510,7 @@ pause(); name, 128, RTEMS_DEFAULT_ATTRIBUTES, + RTEMS_NO_PRIORITY, &id ); end_time = Read_timer(); |