From 32991495b48d1b5e4804b2f10a67a800f4608e75 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 9 Dec 2019 16:03:11 +0100 Subject: score: Statically allocate idle/MPCI stacks Place idle and MPCI stacks into extra linker sections. This can be optionally used by applications to control the placement of the stacks. Update #3835. --- cpukit/score/src/mpci.c | 7 +++---- cpukit/score/src/mpcidefault.c | 8 ++++++++ cpukit/score/src/threadcreateidle.c | 11 +++++------ 3 files changed, 16 insertions(+), 10 deletions(-) (limited to 'cpukit/score') diff --git a/cpukit/score/src/mpci.c b/cpukit/score/src/mpci.c index 1f9b838796..f173eeb588 100644 --- a/cpukit/score/src/mpci.c +++ b/cpukit/score/src/mpci.c @@ -135,11 +135,10 @@ static void _MPCI_Create_server( void ) config.budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; config.is_fp = CPU_ALL_TASKS_ARE_FP; config.stack_size = _Stack_Minimum() + + _MPCI_Configuration.extra_mpci_receive_server_stack + CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK - + _MPCI_Configuration.extra_mpci_receive_server_stack; - config.stack_size = _Stack_Extend_size( config.stack_size, config.is_fp ); - config.stack_area = _Stack_Allocate( config.stack_size ); - _Assert( config.stack_area != NULL ); + + CPU_ALL_TASKS_ARE_FP * CONTEXT_FP_SIZE; + config.stack_area = _MPCI_Receive_server_stack; ok = _Thread_Initialize( &_Thread_Information, diff --git a/cpukit/score/src/mpcidefault.c b/cpukit/score/src/mpcidefault.c index fad806c5c1..395515759b 100644 --- a/cpukit/score/src/mpcidefault.c +++ b/cpukit/score/src/mpcidefault.c @@ -19,6 +19,7 @@ #endif #include +#include #include #include #include @@ -35,3 +36,10 @@ const MPCI_Configuration _MPCI_Configuration = { STACK_MINIMUM_SIZE, /* MPCI receive server stack size */ NULL /* pointer to MPCI address table */ }; + +char _MPCI_Receive_server_stack[ + STACK_MINIMUM_SIZE + + CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK + + CPU_ALL_TASKS_ARE_FP * CONTEXT_FP_SIZE +] RTEMS_ALIGNED( CPU_INTERRUPT_STACK_ALIGNMENT ) +RTEMS_SECTION( ".rtemsstack.mpci" ); diff --git a/cpukit/score/src/threadcreateidle.c b/cpukit/score/src/threadcreateidle.c index c06f211a6b..dbb2018bf8 100644 --- a/cpukit/score/src/threadcreateidle.c +++ b/cpukit/score/src/threadcreateidle.c @@ -51,12 +51,11 @@ static void _Thread_Create_idle_for_CPU( Per_CPU_Control *cpu ) config.name.name_u32 = _Objects_Build_name( 'I', 'D', 'L', 'E' ); config.is_fp = CPU_IDLE_TASK_IS_FP; config.is_preemptible = true; - config.stack_size = _Stack_Ensure_minimum( - rtems_configuration_get_idle_task_stack_size() - ); - config.stack_size = _Stack_Extend_size( config.stack_size, config.is_fp ); - config.stack_area = _Stack_Allocate( config.stack_size ); - _Assert( config.stack_area != NULL ); + config.stack_size = rtems_configuration_get_idle_task_stack_size() + + CPU_IDLE_TASK_IS_FP * CONTEXT_FP_SIZE; + config.stack_area = &_Thread_Idle_stacks[ + _Per_CPU_Get_index( cpu ) * config.stack_size + ]; /* * The entire workspace is zeroed during its initialization. Thus, all -- cgit v1.2.3