Skip to content

Commit e36a82b

Browse files
Michael Schmitzgeertu
authored andcommitted
m68k: Only force 030 bus error if PC not in exception table
__get_kernel_nofault() does copy data in supervisor mode when forcing a task backtrace log through /proc/sysrq_trigger. This is expected cause a bus error exception on e.g. NULL pointer dereferencing when logging a kernel task has no workqueue associated. This bus error ought to be ignored. Our 030 bus error handler is ill equipped to deal with this: Whenever ssw indicates a kernel mode access on a data fault, we don't even attempt to handle the fault and instead always send a SEGV signal (or panic). As a result, the check for exception handling at the fault PC (buried in send_sig_fault() which gets called from do_page_fault() eventually) is never used. In contrast, both 040 and 060 access error handlers do not care whether a fault happened on supervisor mode access, and will call do_page_fault() on those, ultimately honoring the exception table. Add a check in bus_error030 to call do_page_fault() in case we do have an entry for the fault PC in our exception table. I had attempted a fix for this earlier in 2019 that did rely on testing pagefault_disabled() (see link below) to achieve the same thing, but this patch should be more generic. Tested on 030 Atari Falcon. Reported-by: Eero Tamminen <[email protected]> Link: https://lore.kernel.org/r/[email protected] Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Michael Schmitz <[email protected]> Reviewed-by: Geert Uytterhoeven <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Geert Uytterhoeven <[email protected]>
1 parent d4b9792 commit e36a82b

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

arch/m68k/kernel/traps.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include <linux/init.h>
3131
#include <linux/ptrace.h>
3232
#include <linux/kallsyms.h>
33+
#include <linux/extable.h>
3334

3435
#include <asm/setup.h>
3536
#include <asm/fpu.h>
@@ -545,7 +546,8 @@ static inline void bus_error030 (struct frame *fp)
545546
errorcode |= 2;
546547

547548
if (mmusr & (MMU_I | MMU_WP)) {
548-
if (ssw & 4) {
549+
/* We might have an exception table for this PC */
550+
if (ssw & 4 && !search_exception_tables(fp->ptregs.pc)) {
549551
pr_err("Data %s fault at %#010lx in %s (pc=%#lx)\n",
550552
ssw & RW ? "read" : "write",
551553
fp->un.fmtb.daddr,

0 commit comments

Comments
 (0)