[rtems commit] sparc: Fix SMP context switch

Sebastian Huber sebh at rtems.org
Fri Mar 18 06:46:40 UTC 2016


Module:    rtems
Branch:    master
Commit:    d64f2e7a852326c5a6f06ec0197d0afae6d5eb2d
Changeset: http://git.rtems.org/rtems/commit/?id=d64f2e7a852326c5a6f06ec0197d0afae6d5eb2d

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Thu Mar 17 13:30:54 2016 +0100

sparc: Fix SMP context switch

The value of register %g1 was overwritten in a delay slot.  Use
additional %g4 register.

Bug introduced by 258ad71e9626c16f30b40e06c321326636c976ff.

---

 c/src/lib/libbsp/sparc/shared/irq_asm.S | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/c/src/lib/libbsp/sparc/shared/irq_asm.S b/c/src/lib/libbsp/sparc/shared/irq_asm.S
index 0d70e8b..b7f372c 100644
--- a/c/src/lib/libbsp/sparc/shared/irq_asm.S
+++ b/c/src/lib/libbsp/sparc/shared/irq_asm.S
@@ -236,21 +236,21 @@ check_is_executing:
         ! We may have a new heir
 
         ! Read the executing and heir
-        ld      [%g6 + PER_CPU_OFFSET_EXECUTING], %g1
-        ld      [%g6 + PER_CPU_OFFSET_HEIR], %g2
+        ld      [%g6 + PER_CPU_OFFSET_EXECUTING], %g2
+        ld      [%g6 + PER_CPU_OFFSET_HEIR], %g4
 
         ! Update the executing only if necessary to avoid cache line
         ! monopolization.
-        cmp     %g1, %g2
+        cmp     %g2, %g4
         beq     try_update_is_executing
          mov    1, %g1
 
         ! Calculate the heir context pointer
-        sub     %o1, %g1, %g1
-        add     %g1, %g2, %o1
+        sub     %o1, %g2, %g2
+        add     %g2, %g4, %o1
 
         ! Update the executing
-        st      %g2, [%g6 + PER_CPU_OFFSET_EXECUTING]
+        st      %g4, [%g6 + PER_CPU_OFFSET_EXECUTING]
 
         ba      try_update_is_executing
          mov    1, %g1




More information about the vc mailing list