diff options
Diffstat (limited to 'arch/blackfin/kernel/traps.c')
-rw-r--r-- | arch/blackfin/kernel/traps.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c index d88098c58bfa..910cdd43fe60 100644 --- a/arch/blackfin/kernel/traps.c +++ b/arch/blackfin/kernel/traps.c | |||
@@ -463,18 +463,20 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
463 | #endif | 463 | #endif |
464 | panic("Kernel exception"); | 464 | panic("Kernel exception"); |
465 | } | 465 | } |
466 | |||
467 | /* Ensure that bad return addresses don't end up in an infinite | ||
468 | * loop, due to speculative loads/reads | ||
469 | */ | ||
470 | if (trapnr == VEC_CPLB_I_M) | ||
471 | fp->pc = SAFE_USER_INSTRUCTION; | ||
472 | } | 466 | } |
467 | |||
473 | info.si_signo = sig; | 468 | info.si_signo = sig; |
474 | info.si_errno = 0; | 469 | info.si_errno = 0; |
475 | info.si_addr = (void *)fp->pc; | 470 | info.si_addr = (void *)fp->pc; |
476 | force_sig_info(sig, &info, current); | 471 | force_sig_info(sig, &info, current); |
477 | 472 | ||
473 | /* Ensure that bad return addresses don't end up in an infinite | ||
474 | * loop, due to speculative loads/reads. This needs to be done after | ||
475 | * the signal has been sent. | ||
476 | */ | ||
477 | if (trapnr == VEC_CPLB_I_M && sig != SIGTRAP) | ||
478 | fp->pc = SAFE_USER_INSTRUCTION; | ||
479 | |||
478 | trace_buffer_restore(j); | 480 | trace_buffer_restore(j); |
479 | return; | 481 | return; |
480 | } | 482 | } |