Does this impact the porting guide or any CPU supplement?
On Mon, May 17, 2021 at 4:42 PM Gedare Bloom <ged...@rtems.org> wrote: > ok to me > > On Mon, May 17, 2021 at 5:43 AM Sebastian Huber > <sebastian.hu...@embedded-brains.de> wrote: > > > > The __builtin_unreachable() cannot be used with current GCC versions to > > tell the compiler that a function does not return to the caller, see: > > > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99151 > > > > Add a no return variant of _CPU_Context_switch() to avoid generation of > > dead code in _Thread_Start_multitasking() if RTEMS was built with SMP > > support enabled. > > --- > > bsps/powerpc/shared/cpu_asm.S | 2 ++ > > cpukit/score/cpu/arm/cpu_asm.S | 3 ++ > > .../score/cpu/arm/include/rtems/score/cpu.h | 5 ++++ > > .../cpu/no_cpu/include/rtems/score/cpu.h | 30 +++++++++++++++++-- > > .../cpu/powerpc/include/rtems/score/cpu.h | 5 ++++ > > .../score/cpu/riscv/include/rtems/score/cpu.h | 5 ++++ > > cpukit/score/cpu/riscv/riscv-context-switch.S | 2 ++ > > cpukit/score/cpu/sparc/cpu_asm.S | 2 ++ > > .../score/cpu/sparc/include/rtems/score/cpu.h | 5 ++++ > > cpukit/score/src/threadstartmultitasking.c | 2 +- > > 10 files changed, 57 insertions(+), 4 deletions(-) > > > > diff --git a/bsps/powerpc/shared/cpu_asm.S > b/bsps/powerpc/shared/cpu_asm.S > > index e4d627016c..63f6a3fdfe 100644 > > --- a/bsps/powerpc/shared/cpu_asm.S > > +++ b/bsps/powerpc/shared/cpu_asm.S > > @@ -258,7 +258,9 @@ PROC (_CPU_Context_restore_fp): > > > > ALIGN (PPC_CACHE_ALIGNMENT, PPC_CACHE_ALIGN_POWER) > > PUBLIC_PROC (_CPU_Context_switch) > > + PUBLIC_PROC (_CPU_Context_switch_no_return) > > PROC (_CPU_Context_switch): > > +PROC (_CPU_Context_switch_no_return): > > > > #ifdef BSP_USE_SYNC_IN_CONTEXT_SWITCH > > sync > > diff --git a/cpukit/score/cpu/arm/cpu_asm.S > b/cpukit/score/cpu/arm/cpu_asm.S > > index 66f8ba6032..46eb46b914 100644 > > --- a/cpukit/score/cpu/arm/cpu_asm.S > > +++ b/cpukit/score/cpu/arm/cpu_asm.S > > @@ -54,6 +54,9 @@ > > */ > > > > DEFINE_FUNCTION_ARM(_CPU_Context_switch) > > + .globl _CPU_Context_switch_no_return > > + .set _CPU_Context_switch_no_return, _CPU_Context_switch > > + > > /* Start saving context */ > > GET_SELF_CPU_CONTROL r2 > > ldr r3, [r2, #PER_CPU_ISR_DISPATCH_DISABLE] > > diff --git a/cpukit/score/cpu/arm/include/rtems/score/cpu.h > b/cpukit/score/cpu/arm/include/rtems/score/cpu.h > > index e5b23e7100..dcda4d525c 100644 > > --- a/cpukit/score/cpu/arm/include/rtems/score/cpu.h > > +++ b/cpukit/score/cpu/arm/include/rtems/score/cpu.h > > @@ -465,6 +465,11 @@ void _CPU_ISR_install_vector( > > */ > > void _CPU_Context_switch( Context_Control *run, Context_Control *heir ); > > > > +RTEMS_NO_RETURN void _CPU_Context_switch_no_return( > > + Context_Control *executing, > > + Context_Control *heir > > +); > > + > > RTEMS_NO_RETURN void _CPU_Context_restore( Context_Control *new_context > ); > > > > #if defined(ARM_MULTILIB_ARCH_V7M) > > diff --git a/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h > b/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h > > index c067501502..c437ded5fb 100644 > > --- a/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h > > +++ b/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h > > @@ -1054,22 +1054,46 @@ void _CPU_ISR_install_vector( > > void *_CPU_Thread_Idle_body( uintptr_t ignored ); > > > > /** > > + * @brief Peforms a context switch from the executing thread to the heir > > + * thread. > > + * > > * @addtogroup RTEMSScoreCPUExampleContext > > * > > * This routine switches from the run context to the heir context. > > * > > - * @param[in] run points to the context of the currently executing task > > - * @param[in] heir points to the context of the heir task > > + * @param[out] executing points to the context of the currently > executing task. > > + * > > + * @param[in, out] heir points to the context of the heir task. > > * > > * Port Specific Information: > > * > > * XXX document implementation including references if appropriate > > */ > > void _CPU_Context_switch( > > - Context_Control *run, > > + Context_Control *executing, > > Context_Control *heir > > ); > > > > +/** > > + * @brief Peforms a context switch from the executing thread to the > heir thread > > + * and does not return. > > + * > > + * @addtogroup RTEMSScoreCPUExampleContext > > + * > > + * This routine shall be a strong alias to _CPU_Context_switch(). It > shall be > > + * provided for all target architectures which support an SMP build > > + * configuration (RTEMS_SMP). The purpose is help to compiler to avoid > > + * generation of dead code in _Thread_Start_multitasking(). > > + * > > + * @param[out] executing points to the context of the currently > executing task. > > + * > > + * @param[in, out] heir points to the context of the heir task. > > + */ > > +RTEMS_NO_RETURN void _CPU_Context_switch_no_return( > > + Context_Control *executing, > > + Context_Control *heir > > +); > > + > > /** > > * @addtogroup RTEMSScoreCPUExampleContext > > * > > diff --git a/cpukit/score/cpu/powerpc/include/rtems/score/cpu.h > b/cpukit/score/cpu/powerpc/include/rtems/score/cpu.h > > index 996b6f8e60..f22e1cd7ec 100644 > > --- a/cpukit/score/cpu/powerpc/include/rtems/score/cpu.h > > +++ b/cpukit/score/cpu/powerpc/include/rtems/score/cpu.h > > @@ -914,6 +914,11 @@ void _CPU_Context_switch( > > Context_Control *heir > > ); > > > > +RTEMS_NO_RETURN void _CPU_Context_switch_no_return( > > + Context_Control *executing, > > + Context_Control *heir > > +); > > + > > /* > > * _CPU_Context_restore > > * > > diff --git a/cpukit/score/cpu/riscv/include/rtems/score/cpu.h > b/cpukit/score/cpu/riscv/include/rtems/score/cpu.h > > index 38eb92394d..a44b815b12 100644 > > --- a/cpukit/score/cpu/riscv/include/rtems/score/cpu.h > > +++ b/cpukit/score/cpu/riscv/include/rtems/score/cpu.h > > @@ -383,6 +383,11 @@ void _CPU_Context_switch( > > Context_Control *heir > > ); > > > > +RTEMS_NO_RETURN void _CPU_Context_switch_no_return( > > + Context_Control *executing, > > + Context_Control *heir > > +); > > + > > /* > > * _CPU_Context_restore > > * > > diff --git a/cpukit/score/cpu/riscv/riscv-context-switch.S > b/cpukit/score/cpu/riscv/riscv-context-switch.S > > index 96c117b3de..830f8629a4 100644 > > --- a/cpukit/score/cpu/riscv/riscv-context-switch.S > > +++ b/cpukit/score/cpu/riscv/riscv-context-switch.S > > @@ -37,9 +37,11 @@ > > .align 2 > > > > PUBLIC(_CPU_Context_switch) > > +PUBLIC(_CPU_Context_switch_no_return) > > PUBLIC(_CPU_Context_restore) > > > > SYM(_CPU_Context_switch): > > +SYM(_CPU_Context_switch_no_return): > > GET_SELF_CPU_CONTROL a2 > > lw a3, PER_CPU_ISR_DISPATCH_DISABLE(a2) > > > > diff --git a/cpukit/score/cpu/sparc/cpu_asm.S > b/cpukit/score/cpu/sparc/cpu_asm.S > > index e884fb2f9e..a7b87ad5f8 100644 > > --- a/cpukit/score/cpu/sparc/cpu_asm.S > > +++ b/cpukit/score/cpu/sparc/cpu_asm.S > > @@ -57,7 +57,9 @@ > > > > .align 4 > > PUBLIC(_CPU_Context_switch) > > + PUBLIC(_CPU_Context_switch_no_return) > > SYM(_CPU_Context_switch): > > +SYM(_CPU_Context_switch_no_return): > > st %g5, [%o0 + G5_OFFSET] ! save the global registers > > > > /* > > diff --git a/cpukit/score/cpu/sparc/include/rtems/score/cpu.h > b/cpukit/score/cpu/sparc/include/rtems/score/cpu.h > > index 8c5330b8ce..6c167e3f08 100644 > > --- a/cpukit/score/cpu/sparc/include/rtems/score/cpu.h > > +++ b/cpukit/score/cpu/sparc/include/rtems/score/cpu.h > > @@ -971,6 +971,11 @@ void _CPU_Context_switch( > > Context_Control *heir > > ); > > > > +RTEMS_NO_RETURN void _CPU_Context_switch_no_return( > > + Context_Control *executing, > > + Context_Control *heir > > +); > > + > > /** > > * @brief SPARC specific context restore. > > * > > diff --git a/cpukit/score/src/threadstartmultitasking.c > b/cpukit/score/src/threadstartmultitasking.c > > index a0b465a226..094a535394 100644 > > --- a/cpukit/score/src/threadstartmultitasking.c > > +++ b/cpukit/score/src/threadstartmultitasking.c > > @@ -59,7 +59,7 @@ void _Thread_Start_multitasking( void ) > > * executing to the currently selected heir thread. > > */ > > _CPU_Context_Set_is_executing( &trash, true ); > > - _CPU_Context_switch( &trash, &heir->Registers ); > > + _CPU_Context_switch_no_return( &trash, &heir->Registers ); > > RTEMS_UNREACHABLE(); > > } > > #else > > -- > > 2.26.2 > > > > _______________________________________________ > > devel mailing list > > devel@rtems.org > > http://lists.rtems.org/mailman/listinfo/devel > _______________________________________________ > devel mailing list > devel@rtems.org > http://lists.rtems.org/mailman/listinfo/devel >
_______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel