forked from Imagelibrary/rtems
score: Fix CPU context usage on SMP
We must not alter the is executing indicator in _CPU_Context_Initialize() since this would cause an invalid state during a self restart. The is executing indicator must be valid at creation time since otherwise _Thread_Kill_zombies() uses an undefined value for not started threads. This could result in a system life lock.
This commit is contained in:
@@ -123,17 +123,11 @@ void _CPU_Context_Initialize(
|
||||
else
|
||||
msr_value &= ~PPC_MSR_FP;
|
||||
|
||||
memset( the_context, 0, sizeof( *the_context ) );
|
||||
|
||||
the_ppc_context = ppc_get_context( the_context );
|
||||
the_ppc_context->gpr1 = sp;
|
||||
the_ppc_context->msr = msr_value;
|
||||
the_ppc_context->lr = (uint32_t) entry_point;
|
||||
|
||||
#ifdef RTEMS_SMP
|
||||
the_ppc_context->is_executing = false;
|
||||
#endif
|
||||
|
||||
#ifdef __ALTIVEC__
|
||||
_CPU_Context_initialize_altivec( the_ppc_context );
|
||||
#endif
|
||||
|
||||
@@ -327,28 +327,26 @@ PROC (_CPU_Context_switch):
|
||||
stw r2, PPC_CONTEXT_OFFSET_GPR2(r3)
|
||||
|
||||
#ifdef RTEMS_SMP
|
||||
/* Indicate that this context is no longer executing */
|
||||
/* The executing context no longer executes on this processor */
|
||||
msync
|
||||
li r5, 0
|
||||
stb r5, PPC_CONTEXT_OFFSET_IS_EXECUTING(r3)
|
||||
#endif
|
||||
|
||||
/* Restore context from r4 */
|
||||
restore_context:
|
||||
|
||||
#ifdef RTEMS_SMP
|
||||
/* Wait for context to stop execution if necessary */
|
||||
/* Wait for heir context to stop execution */
|
||||
1:
|
||||
lbz r5, PPC_CONTEXT_OFFSET_IS_EXECUTING(r4)
|
||||
cmpwi r5, 0
|
||||
bne 1b
|
||||
|
||||
/* Indicate that this context is executing */
|
||||
/* The heir context executes now on this processor */
|
||||
li r5, 1
|
||||
stb r5, PPC_CONTEXT_OFFSET_IS_EXECUTING(r4)
|
||||
isync
|
||||
#endif
|
||||
|
||||
/* Restore context from r4 */
|
||||
restore_context:
|
||||
|
||||
#ifdef __ALTIVEC__
|
||||
mr r14, r4
|
||||
.extern _CPU_Context_switch_altivec
|
||||
|
||||
Reference in New Issue
Block a user