summaryrefslogtreecommitdiffstats
path: root/cpukit
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2004-02-26 17:23:54 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2004-02-26 17:23:54 +0000
commitf4fe0e9a3cc39591879d1a3c5b5c9bb72c091af7 (patch)
treeefd7f676f32a9ac739f65be60a8f4e493a6325cc /cpukit
parent2004-02-26 Thomas Rauscher <trauscher@loytec.com. (diff)
downloadrtems-f4fe0e9a3cc39591879d1a3c5b5c9bb72c091af7.tar.bz2
2004-02-26 Andreas Karlsson <andreas.karlsson@space.se>
* cpu_asm.S: Close window while restoring interrupted task state which resulted in CWP corruption.
Diffstat (limited to 'cpukit')
-rw-r--r--cpukit/score/cpu/sparc/ChangeLog5
-rw-r--r--cpukit/score/cpu/sparc/cpu_asm.S11
2 files changed, 16 insertions, 0 deletions
diff --git a/cpukit/score/cpu/sparc/ChangeLog b/cpukit/score/cpu/sparc/ChangeLog
index 230da65ca7..f0b277a9c6 100644
--- a/cpukit/score/cpu/sparc/ChangeLog
+++ b/cpukit/score/cpu/sparc/ChangeLog
@@ -1,3 +1,8 @@
+2004-02-26 Andreas Karlsson <andreas.karlsson@space.se>
+
+ * cpu_asm.S: Close window while restoring interrupted task state which
+ resulted in CWP corruption.
+
2004-01-21 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
* configure.ac: Move RTEMS_TOP one subdir down.
diff --git a/cpukit/score/cpu/sparc/cpu_asm.S b/cpukit/score/cpu/sparc/cpu_asm.S
index ec0dce2bb9..357e3dcbd4 100644
--- a/cpukit/score/cpu/sparc/cpu_asm.S
+++ b/cpukit/score/cpu/sparc/cpu_asm.S
@@ -684,6 +684,17 @@ SYM(_ISR_Dispatch):
call SYM(_Thread_Dispatch), 0
nop
+ /*
+ * We invoked _Thread_Dispatch in a state similar to the interrupted
+ * task. In order to safely be able to tinker with the register
+ * windows and get the task back to its pre-interrupt state,
+ * we need to disable interrupts disabled so we can safely tinker
+ * with the register windowing. In particular, the CWP in the PSR
+ * is fragile during this period. (See PR578.)
+ */
+ mov 2,%g1 ! syscall (disable interrupts)
+ ta 0 ! syscall (disable interrupts)
+
/*
* The CWP in place at this point may be different from
* that which was in effect at the beginning of the ISR if we