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:
Sebastian Huber
2014-05-08 10:11:13 +02:00
parent 35a3af7af8
commit 11b05f11d4
14 changed files with 132 additions and 61 deletions

View File

@@ -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

View File

@@ -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