[PATCH 1/1] sparc: Fix context switch on SMP
Daniel Cederman
cederman at gaisler.com
Mon Nov 16 09:03:23 UTC 2015
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
--
2.1.4
More information about the devel
mailing list