[PATCH 1/1] sparc: Fix context switch on SMP
Sebastian Huber
sebastian.huber at embedded-brains.de
Mon Nov 16 09:09:13 UTC 2015
Hello Daniel,
could you please add comments to the move to PSR which are not followed
by three nops and explain why they are not necessary.
On 16/11/15 10:03, Daniel Cederman wrote:
> We must not load registers (e.g. PSR) from the heir context area before
> the heir stopped execution.
> ---
> c/src/lib/libbsp/sparc/shared/irq_asm.S | 30 +++++++++++++-----------------
> 1 file changed, 13 insertions(+), 17 deletions(-)
>
> diff --git a/c/src/lib/libbsp/sparc/shared/irq_asm.S b/c/src/lib/libbsp/sparc/shared/irq_asm.S
> index f7222e7..5931e77 100644
> --- a/c/src/lib/libbsp/sparc/shared/irq_asm.S
> +++ b/c/src/lib/libbsp/sparc/shared/irq_asm.S
> @@ -127,14 +127,9 @@ SYM(_CPU_Context_restore_heir):
> * g5 = scratch
> */
>
> - ld [%o1 + PSR_OFFSET], %g1 ! g1 = saved psr
> -
> and %o2, SPARC_PSR_CWP_MASK, %g3 ! g3 = CWP
> - ! g1 = psr w/o cwp
> - andn %g1, SPARC_PSR_ET_MASK | SPARC_PSR_CWP_MASK, %g1
> - or %g1, %g3, %g1 ! g1 = heirs psr
> - mov %g1, %psr ! restore status register and
> - ! **** DISABLE TRAPS ****
> + andn %o2, SPARC_PSR_ET_MASK, %g1 ! g1 = psr with traps disabled
> + mov %g1, %psr ! **** DISABLE TRAPS ****
> mov %wim, %g2 ! g2 = wim
> mov 1, %g4
> sll %g4, %g3, %g4 ! g4 = WIM mask for CW invalid
> @@ -173,19 +168,13 @@ save_frame_loop:
>
> done_flushing:
>
> - add %g3, 1, %g3 ! calculate desired WIM
> - and %g3, SPARC_NUMBER_OF_REGISTER_WINDOWS - 1, %g3
> + mov %g1, %psr ! restore cwp
> + add %g3, 1, %g2 ! calculate desired WIM
> + and %g2, SPARC_NUMBER_OF_REGISTER_WINDOWS - 1, %g2
> mov 1, %g4
> - sll %g4, %g3, %g4 ! g4 = new WIM
> + sll %g4, %g2, %g4 ! g4 = new WIM
> mov %g4, %wim
>
> - or %g1, SPARC_PSR_ET_MASK, %g1
> - mov %g1, %psr ! **** ENABLE TRAPS ****
> - ! and restore CWP
> - nop
> - nop
> - nop
> -
> #if defined(RTEMS_SMP)
> ! The executing context no longer executes on this processor
> st %g0, [%o0 + SPARC_CONTEXT_CONTROL_IS_EXECUTING_OFFSET]
> @@ -202,6 +191,13 @@ try_update_is_executing:
> ! The next load is in a delay slot, which is all right
> #endif
>
> + ld [%o1 + PSR_OFFSET], %g1 ! g1 = heir psr
> + andn %g1, SPARC_PSR_CWP_MASK, %g1 ! g1 = heir psr w/o cwp
> + or %g1, %g3, %g1 ! g1 = heir psr with cwp
> + or %g1, SPARC_PSR_ET_MASK, %g1 ! g1 = heir psr traps enabled
> + mov %g1, %psr ! restore status register and
> + ! **** ENABLE TRAPS ****
> +
> ld [%o1 + G5_OFFSET], %g5 ! restore the global registers
> ld [%o1 + G7_OFFSET], %g7
>
--
Sebastian Huber, embedded brains GmbH
Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone : +49 89 189 47 41-16
Fax : +49 89 189 47 41-09
E-Mail : sebastian.huber at embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
More information about the devel
mailing list