Browse Source

Blackfin arch: fix bug when sending signals with the wrong PC, cause gdb get confused

We need to send signals with the proper PC, or gdb gets
confused, and lots of tests fail. This should fix that.

Signed-off-by: Robin Getz <robin.getz@analog.com>
Signed-off-by: Bryan Wu <bryan.wu@analog.com>
Robin Getz 17 years ago
parent
commit
fb322915a0
1 changed files with 8 additions and 6 deletions
  1. 8 6
      arch/blackfin/kernel/traps.c

+ 8 - 6
arch/blackfin/kernel/traps.c

@@ -463,18 +463,20 @@ asmlinkage void trap_c(struct pt_regs *fp)
 #endif
 #endif
 			panic("Kernel exception");
 			panic("Kernel exception");
 		}
 		}
-
-		/* Ensure that bad return addresses don't end up in an infinite
-		 * loop, due to speculative loads/reads
-		 */
-		if (trapnr == VEC_CPLB_I_M)
-			fp->pc = SAFE_USER_INSTRUCTION;
 	}
 	}
+
 	info.si_signo = sig;
 	info.si_signo = sig;
 	info.si_errno = 0;
 	info.si_errno = 0;
 	info.si_addr = (void *)fp->pc;
 	info.si_addr = (void *)fp->pc;
 	force_sig_info(sig, &info, current);
 	force_sig_info(sig, &info, current);
 
 
+	/* Ensure that bad return addresses don't end up in an infinite
+	 * loop, due to speculative loads/reads. This needs to be done after
+	 * the signal has been sent.
+	 */
+	if (trapnr == VEC_CPLB_I_M && sig != SIGTRAP)
+		fp->pc = SAFE_USER_INSTRUCTION;
+
 	trace_buffer_restore(j);
 	trace_buffer_restore(j);
 	return;
 	return;
 }
 }