SPRN_ICR must be read for clearing the internal freeze signal which
is asserted by the single step exception, otherwise the timebase and
decrementer remain freezed

Signed-off-by: Christophe Leroy <christophe.le...@c-s.fr>
---
 arch/powerpc/include/asm/reg_8xx.h | 1 +
 arch/powerpc/kernel/traps.c        | 8 ++++++++
 2 files changed, 9 insertions(+)

diff --git a/arch/powerpc/include/asm/reg_8xx.h 
b/arch/powerpc/include/asm/reg_8xx.h
index feaf641..6dae71f 100644
--- a/arch/powerpc/include/asm/reg_8xx.h
+++ b/arch/powerpc/include/asm/reg_8xx.h
@@ -17,6 +17,7 @@
 #define SPRN_DC_DAT    570     /* Read-only data register */
 
 /* Misc Debug */
+#define SPRN_ICR       148
 #define SPRN_DPDR      630
 #define SPRN_MI_CAM    816
 #define SPRN_MI_RAM0   817
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index 2cb5892..0f1f0ce 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -400,8 +400,16 @@ static inline int check_io_access(struct pt_regs *regs)
 #define REASON_TRAP            0x20000
 
 #define single_stepping(regs)  ((regs)->msr & MSR_SE)
+#ifdef CONFIG_PPC_8xx
+static inline void clear_single_step(struct pt_regs *regs)
+{
+       regs->msr &= ~MSR_SE;
+       mfspr(SPRN_ICR);
+}
+#else
 #define clear_single_step(regs)        ((regs)->msr &= ~MSR_SE)
 #endif
+#endif
 
 #if defined(CONFIG_4xx)
 int machine_check_4xx(struct pt_regs *regs)
-- 
2.1.0

Reply via email to