diff options
| -rw-r--r-- | arch/m68k/kernel/traps.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c index fd4858e2dd63..75b8340b254b 100644 --- a/arch/m68k/kernel/traps.c +++ b/arch/m68k/kernel/traps.c | |||
| @@ -468,15 +468,26 @@ static inline void access_error040(struct frame *fp) | |||
| 468 | * (if do_page_fault didn't fix the mapping, | 468 | * (if do_page_fault didn't fix the mapping, |
| 469 | * the writeback won't do good) | 469 | * the writeback won't do good) |
| 470 | */ | 470 | */ |
| 471 | disable_wb: | ||
| 471 | #ifdef DEBUG | 472 | #ifdef DEBUG |
| 472 | printk(".. disabling wb2\n"); | 473 | printk(".. disabling wb2\n"); |
| 473 | #endif | 474 | #endif |
| 474 | if (fp->un.fmt7.wb2a == fp->un.fmt7.faddr) | 475 | if (fp->un.fmt7.wb2a == fp->un.fmt7.faddr) |
| 475 | fp->un.fmt7.wb2s &= ~WBV_040; | 476 | fp->un.fmt7.wb2s &= ~WBV_040; |
| 477 | if (fp->un.fmt7.wb3a == fp->un.fmt7.faddr) | ||
| 478 | fp->un.fmt7.wb3s &= ~WBV_040; | ||
| 476 | } | 479 | } |
| 477 | } else if (send_fault_sig(&fp->ptregs) > 0) { | 480 | } else { |
| 478 | printk("68040 access error, ssw=%x\n", ssw); | 481 | /* In case of a bus error we either kill the process or expect |
| 479 | trap_c(fp); | 482 | * the kernel to catch the fault, which then is also responsible |
| 483 | * for cleaning up the mess. | ||
| 484 | */ | ||
| 485 | current->thread.signo = SIGBUS; | ||
| 486 | current->thread.faddr = fp->un.fmt7.faddr; | ||
| 487 | if (send_fault_sig(&fp->ptregs) >= 0) | ||
| 488 | printk("68040 bus error (ssw=%x, faddr=%lx)\n", ssw, | ||
| 489 | fp->un.fmt7.faddr); | ||
| 490 | goto disable_wb; | ||
| 480 | } | 491 | } |
| 481 | 492 | ||
| 482 | do_040writebacks(fp); | 493 | do_040writebacks(fp); |
