diff options
Diffstat (limited to 'c')
-rw-r--r-- | c/src/lib/libbsp/sparc/shared/irq_asm.S | 19 | ||||
-rw-r--r-- | c/src/lib/libcpu/powerpc/new-exceptions/cpu_asm.S | 29 |
2 files changed, 29 insertions, 19 deletions
diff --git a/c/src/lib/libbsp/sparc/shared/irq_asm.S b/c/src/lib/libbsp/sparc/shared/irq_asm.S index 7a595d1711..a842a62a1e 100644 --- a/c/src/lib/libbsp/sparc/shared/irq_asm.S +++ b/c/src/lib/libbsp/sparc/shared/irq_asm.S @@ -178,17 +178,22 @@ done_flushing: mov %g4, %wim #if defined(RTEMS_SMP) - ! The executing context no longer executes on this processor + /* + * The executing thread no longer executes on this processor. Switch + * the stack to the temporary interrupt stack of this processor. Mark + * the context of the executing thread as not executing. + */ + add %g6, PER_CPU_INTERRUPT_FRAME_AREA + CPU_INTERRUPT_FRAME_SIZE, %sp st %g0, [%o0 + SPARC_CONTEXT_CONTROL_IS_EXECUTING_OFFSET] ! Try to update the is executing indicator of the heir context mov 1, %g1 -try_update_is_executing: +.Ltry_update_is_executing: swap [%o1 + SPARC_CONTEXT_CONTROL_IS_EXECUTING_OFFSET], %g1 cmp %g1, 0 - bne check_is_executing + bne .Lcheck_is_executing ! The next load is in a delay slot, which is all right #endif @@ -225,12 +230,12 @@ try_update_is_executing: nop ! delay slot #if defined(RTEMS_SMP) -check_is_executing: +.Lcheck_is_executing: ! Check the is executing indicator of the heir context ld [%o1 + SPARC_CONTEXT_CONTROL_IS_EXECUTING_OFFSET], %g1 cmp %g1, 0 - beq try_update_is_executing + beq .Ltry_update_is_executing mov 1, %g1 ! We may have a new heir @@ -242,7 +247,7 @@ check_is_executing: ! Update the executing only if necessary to avoid cache line ! monopolization. cmp %g2, %g4 - beq try_update_is_executing + beq .Ltry_update_is_executing mov 1, %g1 ! Calculate the heir context pointer @@ -252,7 +257,7 @@ check_is_executing: ! Update the executing st %g4, [%g6 + PER_CPU_OFFSET_EXECUTING] - ba try_update_is_executing + ba .Ltry_update_is_executing mov 1, %g1 #endif diff --git a/c/src/lib/libcpu/powerpc/new-exceptions/cpu_asm.S b/c/src/lib/libcpu/powerpc/new-exceptions/cpu_asm.S index 7f3c036cf6..e5b4fcdbcd 100644 --- a/c/src/lib/libcpu/powerpc/new-exceptions/cpu_asm.S +++ b/c/src/lib/libcpu/powerpc/new-exceptions/cpu_asm.S @@ -402,23 +402,30 @@ PROC (_CPU_Context_switch): #endif #ifdef RTEMS_SMP - /* The executing context no longer executes on this processor */ + /* + * The executing thread no longer executes on this processor. Switch + * the stack to the temporary interrupt stack of this processor. Mark + * the context of the executing thread as not executing. + */ msync + + GET_SELF_CPU_CONTROL r12 + addi r1, r12, PER_CPU_INTERRUPT_FRAME_AREA + CPU_INTERRUPT_FRAME_SIZE li r6, 0 stw r6, PPC_CONTEXT_OFFSET_IS_EXECUTING(r3) -check_is_executing: +.Lcheck_is_executing: /* Check the is executing indicator of the heir context */ addi r6, r5, PPC_CONTEXT_OFFSET_IS_EXECUTING lwarx r7, r0, r6 cmpwi r7, 0 - bne get_potential_new_heir + bne .Lget_potential_new_heir /* Try to update the is executing indicator of the heir context */ li r7, 1 stwcx. r7, r0, r6 - bne get_potential_new_heir + bne .Lget_potential_new_heir isync #endif @@ -537,22 +544,20 @@ PROC (_CPU_Context_restore): b restore_context #ifdef RTEMS_SMP -get_potential_new_heir: - - GET_SELF_CPU_CONTROL r6 +.Lget_potential_new_heir: /* We may have a new heir */ /* Read the executing and heir */ - lwz r7, PER_CPU_OFFSET_EXECUTING(r6) - lwz r8, PER_CPU_OFFSET_HEIR(r6) + lwz r7, PER_CPU_OFFSET_EXECUTING(r12) + lwz r8, PER_CPU_OFFSET_HEIR(r12) /* * Update the executing only if necessary to avoid cache line * monopolization. */ cmpw r7, r8 - beq check_is_executing + beq .Lcheck_is_executing /* Calculate the heir context pointer */ sub r7, r4, r7 @@ -560,7 +565,7 @@ get_potential_new_heir: clrrwi r5, r4, PPC_DEFAULT_CACHE_LINE_POWER /* Update the executing */ - stw r8, PER_CPU_OFFSET_EXECUTING(r6) + stw r8, PER_CPU_OFFSET_EXECUTING(r12) - b check_is_executing + b .Lcheck_is_executing #endif |