From 042072bfdfa6ff6a54c74cc54476c5175377bf63 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 14 Jun 2016 10:12:34 +0200 Subject: score: _Scheduler_priority_Ready_queue_initialize Use priority maximum of scheduler instance. This avoids a potential memory corruption on SMP configurations. --- cpukit/score/include/rtems/score/schedulerpriorityimpl.h | 9 +++++---- cpukit/score/src/schedulerpriority.c | 5 ++++- cpukit/score/src/schedulerprioritysmp.c | 5 ++++- cpukit/score/src/schedulerstrongapa.c | 5 ++++- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/cpukit/score/include/rtems/score/schedulerpriorityimpl.h b/cpukit/score/include/rtems/score/schedulerpriorityimpl.h index ab5abdc65f..a18840fb4c 100644 --- a/cpukit/score/include/rtems/score/schedulerpriorityimpl.h +++ b/cpukit/score/include/rtems/score/schedulerpriorityimpl.h @@ -54,14 +54,15 @@ RTEMS_INLINE_ROUTINE Scheduler_priority_Node *_Scheduler_priority_Thread_get_nod * This routine initializes @a ready_queues for priority-based scheduling. */ RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_initialize( - Chain_Control *ready_queues + Chain_Control *ready_queues, + Priority_Control maximum_priority ) { size_t index; - /* initialize ready queue structures */ - for( index=0; index <= PRIORITY_MAXIMUM; index++) - _Chain_Initialize_empty( &ready_queues[index] ); + for ( index = 0 ; index <= (size_t) maximum_priority ; ++index ) { + _Chain_Initialize_empty( &ready_queues[ index ] ); + } } /** diff --git a/cpukit/score/src/schedulerpriority.c b/cpukit/score/src/schedulerpriority.c index 6dc055a536..61505a4fce 100644 --- a/cpukit/score/src/schedulerpriority.c +++ b/cpukit/score/src/schedulerpriority.c @@ -27,5 +27,8 @@ void _Scheduler_priority_Initialize( const Scheduler_Control *scheduler ) _Scheduler_priority_Get_context( scheduler ); _Priority_bit_map_Initialize( &context->Bit_map ); - _Scheduler_priority_Ready_queue_initialize( &context->Ready[ 0 ] ); + _Scheduler_priority_Ready_queue_initialize( + &context->Ready[ 0 ], + scheduler->maximum_priority + ); } diff --git a/cpukit/score/src/schedulerprioritysmp.c b/cpukit/score/src/schedulerprioritysmp.c index c08799f270..bd042d2534 100644 --- a/cpukit/score/src/schedulerprioritysmp.c +++ b/cpukit/score/src/schedulerprioritysmp.c @@ -39,7 +39,10 @@ void _Scheduler_priority_SMP_Initialize( const Scheduler_Control *scheduler ) _Scheduler_SMP_Initialize( &self->Base ); _Priority_bit_map_Initialize( &self->Bit_map ); - _Scheduler_priority_Ready_queue_initialize( &self->Ready[ 0 ] ); + _Scheduler_priority_Ready_queue_initialize( + &self->Ready[ 0 ], + scheduler->maximum_priority + ); } void _Scheduler_priority_SMP_Node_initialize( diff --git a/cpukit/score/src/schedulerstrongapa.c b/cpukit/score/src/schedulerstrongapa.c index 09efde9cf9..dd4409766e 100644 --- a/cpukit/score/src/schedulerstrongapa.c +++ b/cpukit/score/src/schedulerstrongapa.c @@ -165,7 +165,10 @@ void _Scheduler_strong_APA_Initialize( const Scheduler_Control *scheduler ) _Scheduler_SMP_Initialize( &self->Base ); _Priority_bit_map_Initialize( &self->Bit_map ); - _Scheduler_priority_Ready_queue_initialize( &self->Ready[ 0 ] ); + _Scheduler_priority_Ready_queue_initialize( + &self->Ready[ 0 ], + scheduler->maximum_priority + ); } void _Scheduler_strong_APA_Node_initialize( -- cgit v1.2.3