I like the simplification. We should also clean up any BSPs that have dead code beyond calling boot_card().
Does it make sense to add noreturn attributes to the initialization call path starting with boot_card through rtems_initialize_start_multitasking()? -Gedare On Thu, Feb 13, 2014 at 4:09 AM, Sebastian Huber <sebastian.hu...@embedded-brains.de> wrote: > Do not return to BSP context in the exit() shutdown path. This makes it > possible to re-use the initialization stack. It can be used for the > interrupt stack for example. On targets with a small RAM this is a > considerable benefit. > > This change eliminates also some special cases and simplifies the code. > > Disable thread dispatching in rtems_shutdown_executive(). > > Delete _Thread_Set_global_exit_status(), > _Thread_Get_global_exit_status() and _Thread_Stop_multitasking(). > --- > cpukit/sapi/src/exinit.c | 10 +--- > cpukit/sapi/src/exshutdown.c | 18 +++--- > .../score/cpu/arm/armv7m-multitasking-start-stop.c | 36 ++--------- > cpukit/score/cpu/arm/rtems/score/cpu.h | 5 +- > cpukit/score/include/rtems/score/threadimpl.h | 65 > +------------------- > cpukit/score/src/smp.c | 2 +- > cpukit/score/src/threadstartmultitasking.c | 27 +++------ > testsuites/sptests/spsize/size.c | 3 +- > 8 files changed, 29 insertions(+), 137 deletions(-) > > diff --git a/cpukit/sapi/src/exinit.c b/cpukit/sapi/src/exinit.c > index 10c1559..e8b009b 100644 > --- a/cpukit/sapi/src/exinit.c > +++ b/cpukit/sapi/src/exinit.c > @@ -33,7 +33,6 @@ > #include <rtems/config.h> > #include <rtems/debug.h> > #include <rtems/extensionimpl.h> > -#include <rtems/fatal.h> > #include <rtems/init.h> > #include <rtems/io.h> > #include <rtems/score/sysstate.h> > @@ -215,25 +214,20 @@ void rtems_initialize_device_drivers(void) > > void rtems_initialize_start_multitasking(void) > { > - uint32_t status; > - > _System_state_Set( SYSTEM_STATE_UP ); > > #if defined(RTEMS_SMP) > _SMP_Request_other_cores_to_perform_first_context_switch(); > #endif > > - _Thread_Start_multitasking( &_Thread_BSP_context ); > + _Thread_Start_multitasking(); > > /******************************************************************* > ******************************************************************* > ******************************************************************* > ****** APPLICATION RUNS HERE ****** > - ****** RETURNS WHEN SYSTEM IS SHUT DOWN ****** > + ****** THE FUNCTION NEVER RETURNS ****** > ******************************************************************* > ******************************************************************* > *******************************************************************/ > - > - status = _Thread_Get_global_exit_status(); > - rtems_fatal( RTEMS_FATAL_SOURCE_EXIT, status ); > } > diff --git a/cpukit/sapi/src/exshutdown.c b/cpukit/sapi/src/exshutdown.c > index 7a96869..7cf7d35 100644 > --- a/cpukit/sapi/src/exshutdown.c > +++ b/cpukit/sapi/src/exshutdown.c > @@ -38,25 +38,25 @@ void rtems_shutdown_executive( > uint32_t result > ) > { > + _Thread_Disable_dispatch(); > + > if ( _System_state_Is_up( _System_state_Get() ) ) { > #if defined(RTEMS_SMP) > _SMP_Request_other_cores_to_shutdown(); > #endif > > - _Thread_Set_global_exit_status( result ); > _System_state_Set( SYSTEM_STATE_SHUTDOWN ); > - _Thread_Stop_multitasking(); > - > - /******************************************************************* > - ******************************************************************* > - ****** RETURN TO RTEMS_INITIALIZE_START_MULTITASKING() ****** > - ****** AND THEN TO BOOT_CARD() ****** > - ******************************************************************* > - *******************************************************************/ > + _Internal_error_Occurred( RTEMS_FATAL_SOURCE_EXIT, false, result ); > } > _Internal_error_Occurred( > INTERNAL_ERROR_CORE, > true, > INTERNAL_ERROR_SHUTDOWN_WHEN_NOT_UP > ); > + > + /*************************************************************** > + *************************************************************** > + * SYSTEM SHUTS DOWN!!! WE DO NOT RETURN TO THIS POINT!!! * > + *************************************************************** > + ***************************************************************/ > } > diff --git a/cpukit/score/cpu/arm/armv7m-multitasking-start-stop.c > b/cpukit/score/cpu/arm/armv7m-multitasking-start-stop.c > index f3e96e3..864bb53 100644 > --- a/cpukit/score/cpu/arm/armv7m-multitasking-start-stop.c > +++ b/cpukit/score/cpu/arm/armv7m-multitasking-start-stop.c > @@ -1,14 +1,14 @@ > /** > * @file > * > - * @brief ARMV7M Start and Stop Multitasking > + * @brief ARMV7M Start Multitasking > */ > > /* > - * Copyright (c) 2011 Sebastian Huber. All rights reserved. > + * Copyright (c) 2011-2014 Sebastian Huber. All rights reserved. > * > * embedded brains GmbH > - * Obere Lagerstr. 30 > + * Dornierstr. 4 > * 82178 Puchheim > * Germany > * <rt...@embedded-brains.de> > @@ -27,18 +27,14 @@ > #ifdef ARM_MULTILIB_ARCH_V7M > > void __attribute__((naked)) _ARMV7M_Start_multitasking( > - Context_Control *bsp, > Context_Control *heir > ) > { > __asm__ volatile ( > - /* Store BSP context */ > - "stm r0, {r4-r11, lr}\n" > - "str sp, [r0, %[spctxoff]]\n" > /* Restore heir context */ > - "ldr r2, [r1, %[spctxoff]]\n" > + "ldr r2, [r0, %[spctxoff]]\n" > "msr psp, r2\n" > - "ldm r1, {r4-r11, lr}\n" > + "ldm r0, {r4-r11, lr}\n" > /* Enable process stack pointer (PSP) */ > "mrs r2, control\n" > "orr r2, #0x2\n" > @@ -50,26 +46,4 @@ void __attribute__((naked)) _ARMV7M_Start_multitasking( > ); > } > > -void __attribute__((naked)) _ARMV7M_Stop_multitasking( Context_Control *bsp ) > -{ > - __asm__ volatile ( > - /* Disable interrupts */ > - "mov r2, #0x80\n" > - "msr basepri_max, r2\n" > - /* Restore BSP context */ > - "ldr r2, [r0, %[spctxoff]]\n" > - "msr msp, r2\n" > - "ldm r0, {r4-r11, lr}\n" > - /* Disable process stack pointer (PSP) */ > - "mrs r2, control\n" > - "bic r2, #0x2\n" > - "msr control, r2\n" > - /* Return to BSP */ > - "bx lr\n" > - : > - : [spctxoff] "J" (offsetof(Context_Control, register_sp)) > - ); > - __builtin_unreachable(); > -} > - > #endif /* ARM_MULTILIB_ARCH_V7M */ > diff --git a/cpukit/score/cpu/arm/rtems/score/cpu.h > b/cpukit/score/cpu/arm/rtems/score/cpu.h > index b423dba..f56f9a6 100644 > --- a/cpukit/score/cpu/arm/rtems/score/cpu.h > +++ b/cpukit/score/cpu/arm/rtems/score/cpu.h > @@ -458,11 +458,8 @@ void _CPU_Context_restore( Context_Control *new_context ) > RTEMS_COMPILER_NO_RETURN_ATTRIBUTE; > > #if defined(ARM_MULTILIB_ARCH_V7M) > - void _ARMV7M_Start_multitasking( Context_Control *bsp, Context_Control > *heir ); > - void _ARMV7M_Stop_multitasking( Context_Control *bsp ) > - RTEMS_COMPILER_NO_RETURN_ATTRIBUTE; > + void _ARMV7M_Start_multitasking( Context_Control *heir ); > #define _CPU_Start_multitasking _ARMV7M_Start_multitasking > - #define _CPU_Stop_multitasking _ARMV7M_Stop_multitasking > #endif > > void _CPU_Context_volatile_clobber( uintptr_t pattern ); > diff --git a/cpukit/score/include/rtems/score/threadimpl.h > b/cpukit/score/include/rtems/score/threadimpl.h > index 4f4fbc7..7c1d2a7 100644 > --- a/cpukit/score/include/rtems/score/threadimpl.h > +++ b/cpukit/score/include/rtems/score/threadimpl.h > @@ -20,6 +20,7 @@ > #define _RTEMS_SCORE_THREADIMPL_H > > #include <rtems/score/thread.h> > +#include <rtems/score/interr.h> > #include <rtems/score/isr.h> > #include <rtems/score/objectimpl.h> > #include <rtems/score/statesimpl.h> > @@ -54,15 +55,6 @@ SCORE_EXTERN void *rtems_ada_self; > SCORE_EXTERN Objects_Information _Thread_Internal_information; > > /** > - * The following context area contains the context of the "thread" > - * which invoked the start multitasking routine. This context is > - * restored as the last action of the stop multitasking routine. Thus > - * control of the processor can be returned to the environment > - * which initiated the system. > - */ > -SCORE_EXTERN Context_Control _Thread_BSP_context; > - > -/** > * The following holds how many user extensions are in the system. This > * is used to determine how many user extension data areas to allocate > * per thread. > @@ -114,13 +106,8 @@ void _Thread_Create_idle(void); > * This routine initiates multitasking. It is invoked only as > * part of initialization and its invocation is the last act of > * the non-multitasking part of the system initialization. > - * > - * > - * - INTERRUPT LATENCY: > - * + ready chain > - * + select heir > */ > -void _Thread_Start_multitasking( Context_Control *context ); > +void _Thread_Start_multitasking( void ) RTEMS_COMPILER_NO_RETURN_ATTRIBUTE; > > /** > * @brief Allocate the requested stack space for the thread. > @@ -446,36 +433,6 @@ void _Thread_blocking_operation_Cancel( > ); > > /** > - * This routine halts multitasking and returns control to > - * the "thread" (i.e. the BSP) which initially invoked the > - * routine which initialized the system. > - */ > - > -RTEMS_INLINE_ROUTINE void _Thread_Stop_multitasking( void ) > -{ > -#if defined(_CPU_Stop_multitasking) > - _CPU_Stop_multitasking( &_Thread_BSP_context ); > -#else > - /* > - * This may look a bit of an odd but _Context_Restart_self is just > - * a very careful restore of a specific context which ensures that > - * if we were running within the same context, it would work. > - * > - * And we will not return to this thread, so there is no point of > - * saving the context. > - */ > - _Context_Restart_self( &_Thread_BSP_context ); > -#endif > - > - /*************************************************************** > - *************************************************************** > - * SYSTEM SHUTS DOWN!!! WE DO NOT RETURN TO THIS POINT!!! * > - *************************************************************** > - *************************************************************** > - */ > -} > - > -/** > * This function returns true if the_thread is the currently executing > * thread, and false otherwise. > */ > @@ -630,24 +587,6 @@ RTEMS_INLINE_ROUTINE void _Thread_Internal_free ( > _Objects_Free( &_Thread_Internal_information, &the_task->Object ); > } > > -RTEMS_INLINE_ROUTINE void _Thread_Set_global_exit_status( > - uint32_t exit_status > -) > -{ > - Thread_Control *idle = (Thread_Control *) > - _Thread_Internal_information.local_table[ 1 ]; > - > - idle->Wait.return_code = exit_status; > -} > - > -RTEMS_INLINE_ROUTINE uint32_t _Thread_Get_global_exit_status( void ) > -{ > - const Thread_Control *idle = (const Thread_Control *) > - _Thread_Internal_information.local_table[ 1 ]; > - > - return idle->Wait.return_code; > -} > - > RTEMS_INLINE_ROUTINE void _Thread_Signal_notification( Thread_Control > *thread ) > { > if ( _ISR_Is_in_progress() && _Thread_Is_executing( thread ) ) { > diff --git a/cpukit/score/src/smp.c b/cpukit/score/src/smp.c > index 2f8a488..df1c6d3 100644 > --- a/cpukit/score/src/smp.c > +++ b/cpukit/score/src/smp.c > @@ -40,7 +40,7 @@ void rtems_smp_secondary_cpu_initialize( void ) > > _Per_CPU_Wait_for_state( self_cpu, PER_CPU_STATE_BEGIN_MULTITASKING ); > > - _Thread_Start_multitasking( NULL ); > + _Thread_Start_multitasking(); > } > > void rtems_smp_process_interrupt( void ) > diff --git a/cpukit/score/src/threadstartmultitasking.c > b/cpukit/score/src/threadstartmultitasking.c > index 52337ab..a676364 100644 > --- a/cpukit/score/src/threadstartmultitasking.c > +++ b/cpukit/score/src/threadstartmultitasking.c > @@ -20,7 +20,7 @@ > > #include <rtems/score/threadimpl.h> > > -void _Thread_Start_multitasking( Context_Control *context ) > +void _Thread_Start_multitasking( void ) > { > Per_CPU_Control *self_cpu = _Per_CPU_Get(); > Thread_Control *heir = self_cpu->heir; > @@ -28,7 +28,13 @@ void _Thread_Start_multitasking( Context_Control *context ) > #if defined(RTEMS_SMP) > _Per_CPU_Change_state( self_cpu, PER_CPU_STATE_UP ); > > + /* > + * Threads begin execution in the _Thread_Handler() function. This > + * function will set the thread dispatch disable level to zero and calls > + * _Per_CPU_Release(). > + */ > _Per_CPU_Acquire( self_cpu ); > + self_cpu->thread_dispatch_disable_level = 1; > > self_cpu->executing->is_executing = false; > heir->is_executing = true; > @@ -59,26 +65,9 @@ void _Thread_Start_multitasking( Context_Control *context ) > _Context_Restore_fp( &heir->fp_context ); > #endif > > -#if defined(RTEMS_SMP) > - if ( context != NULL ) { > -#endif > - > #if defined(_CPU_Start_multitasking) > - _CPU_Start_multitasking( context, &heir->Registers ); > + _CPU_Start_multitasking( &heir->Registers ); > #else > - _Context_Switch( context, &heir->Registers ); > -#endif > - > -#if defined(RTEMS_SMP) > - } else { > - /* > - * Threads begin execution in the _Thread_Handler() function. This > - * function will set the thread dispatch disable level to zero and calls > - * _Per_CPU_Release(). > - */ > - self_cpu->thread_dispatch_disable_level = 1; > - > _CPU_Context_restore( &heir->Registers ); > - } > #endif > } > diff --git a/testsuites/sptests/spsize/size.c > b/testsuites/sptests/spsize/size.c > index f204c05..5b3cefe 100644 > --- a/testsuites/sptests/spsize/size.c > +++ b/testsuites/sptests/spsize/size.c > @@ -385,8 +385,7 @@ uninitialized = > > /*tasksimpl.h*/ (sizeof _RTEMS_tasks_Information) + > > -/*thread.h*/ (sizeof _Thread_BSP_context) + > - (sizeof _Thread_Dispatch_disable_level) + > +/*thread.h*/ (sizeof _Thread_Dispatch_disable_level) + > (sizeof _Thread_Maximum_extensions) + > (sizeof _Thread_Ticks_per_timeslice) + > (sizeof _Thread_Executing) + > -- > 1.7.7 > > _______________________________________________ > rtems-devel mailing list > rtems-devel@rtems.org > http://www.rtems.org/mailman/listinfo/rtems-devel _______________________________________________ rtems-devel mailing list rtems-devel@rtems.org http://www.rtems.org/mailman/listinfo/rtems-devel