[PATCH] sparc: Fix context switch on SMP
Sebastian Huber
sebastian.huber at embedded-brains.de
Thu Nov 12 12:45:11 UTC 2015
We must not load registers (e.g. PSR) from the heir context area before
the heir stopped execution. Bug reported by Daniel Cederman.
---
c/src/lib/libbsp/sparc/shared/irq_asm.S | 32 ++++++++++++++++----------------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/c/src/lib/libbsp/sparc/shared/irq_asm.S b/c/src/lib/libbsp/sparc/shared/irq_asm.S
index 9d8600e..d6c0ee6 100644
--- a/c/src/lib/libbsp/sparc/shared/irq_asm.S
+++ b/c/src/lib/libbsp/sparc/shared/irq_asm.S
@@ -91,6 +91,22 @@ SYM(_CPU_Context_switch):
PUBLIC(_CPU_Context_restore_heir)
SYM(_CPU_Context_restore_heir):
+#if defined(RTEMS_SMP)
+ ! The executing context no longer executes on this processor
+ 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:
+
+ swap [%o1 + SPARC_CONTEXT_CONTROL_IS_EXECUTING_OFFSET], %g1
+ cmp %g1, 0
+ bne check_is_executing
+
+ ! The next load is in a delay slot, which is all right
+#endif
+
/*
* Flush all windows with valid contents except the current one.
* In examining the set register windows, one may logically divide
@@ -186,22 +202,6 @@ done_flushing:
nop
nop
-#if defined(RTEMS_SMP)
- ! The executing context no longer executes on this processor
- 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:
-
- swap [%o1 + SPARC_CONTEXT_CONTROL_IS_EXECUTING_OFFSET], %g1
- cmp %g1, 0
- bne check_is_executing
-
- ! The next load is in a delay slot, which is all right
-#endif
-
ld [%o1 + G5_OFFSET], %g5 ! restore the global registers
ld [%o1 + G7_OFFSET], %g7
--
1.8.4.5
More information about the devel
mailing list