Re: [PATCH RFC v1] m68k: kernel/traps.c - only force 030 bus error if PC not in exception table

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks Eero,

I'll add your Tested-by (and Reported-by; sorry to have forgotten that) in v2.

Cheers,

	Michael


Am 24.02.2023 um 13:31 schrieb Eero Tamminen:
Hi Michael,

On 22.2.2023 21.50, Michael Schmitz wrote:
__get_kernel_nofault() does copy data in supervisor mode when
forcing a task backtrace dump through the sysrq trigger.

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 send
a bus error 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.

Both 040 and 060 access error handlers do not care whether
a fault happened on supervisor mode access, and will call
do_page_fault() even on those.

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.

Tested on 030 Atari Falcon.


I've verified that the kernel Oops was there with unpatched kernel, and
this fixes it, also when using Hatari emulator 030 / Atari Falcon
emulation.

(Verified both with both v6.0 & v6.2 of Linus' kernel sources.)


    - Eero


Signed-off-by: Michael Schmitz <schmitzmic@xxxxxxxxx># Please enter
the commit message for your changes. Lines starting
CC: Eero Tamminen <oak@xxxxxxxxxxxxxx>
CC: Finn Thain <ftain@xxxxxxxxxxxxxx>
CC: Andreas Schwab <schwab@xxxxxxxxxxxxxx>
CC: Geert Uytterhoeven <geert@xxxxxxxxxxxxxx>
Link:
https://lore.kernel.org/r/daca2f68-19fa-a2b6-97c6-16b5b7e26afe@xxxxxxxxxxxxxx

---
  arch/m68k/kernel/traps.c | 3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c
index 5c8cba0efc63..67576fb0c466 100644
--- a/arch/m68k/kernel/traps.c
+++ b/arch/m68k/kernel/traps.c
@@ -30,6 +30,7 @@
  #include <linux/init.h>
  #include <linux/ptrace.h>
  #include <linux/kallsyms.h>
+#include <linux/extable.h>
    #include <asm/setup.h>
  #include <asm/fpu.h>
@@ -545,7 +546,7 @@ static inline void bus_error030 (struct frame *fp)
              errorcode |= 2;
            if (mmusr & (MMU_I | MMU_WP)) {
-            if (ssw & 4) {
+            if (ssw & 4 && !search_exception_tables(fp->ptregs.pc)) {
                  pr_err("Data %s fault at %#010lx in %s (pc=%#lx)\n",
                         ssw & RW ? "read" : "write",
                         fp->un.fmtb.daddr,



[Index of Archives]     [Video for Linux]     [Yosemite News]     [Linux S/390]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux