Hi, On Tue, 19 Feb 2008, Finn Thain wrote:
> Unable to handle kernel NULL pointer dereference at virtual address 00000000 > Oops: 00000000 > Modules linked in: > PC: [<000035b8>] buserr_c+0x4a6/0x546 > SR: 2704 SP: 0079ba60 a2: 00478030 > d0: 00000020 d1: 00000020 d2: 00000000 d3: 00000000 > d4: 00000001 d5: 00000000 a0: 50f10100 a1: 001d6bc8 > Process dd (pid: 198, task=00478030) > Frame format=7 eff addr=0079ba18 ssw=00a5 faddr=50f10100 > wb 1 stat/addr/data: 00a5 50f10100 00000000 > wb 2 stat/addr/data: 0025 50f10100 00000000 > wb 3 stat/addr/data: 0045 0079bb58 00000000 > push data: 00000000 00102000 0000362a 0079baf8 > Stack from 0079bac8: > 00000000 0007a120 00000000 00000000 00000001 00501f80 0802b001 > 005282a0 > 00273078 0079bb14 0000271a 0079baf8 00000000 00000000 0007a120 > 00000000 > 00000000 50f10100 00001a00 00478030 00000001 ffffffff 00000034 > 27040016 ^^^^^^^^ > 6be47008 0079bb48 00a50025 00a500a5 50f10100 50f10100 00000000 > 50f10100 ^^^^^^^^ Exception frames are a little difficult to handle for a simple call trace, as the exception address is misaligned, so it's not always immediately visible. Anyway, above is the frame header and the exception originally came from 0x166be4, which is: (gdb) x/i 0x166be4 0x166be4 <mac_esp_send_pdma_cmd+424>: nop which I guess is expected at this point. > 00000000 50f10100 00000000 00000000 27040016 6be60008 00000000 > 00533050 ^^^^^^^^^^^^^^^^^ > 0802a800 00163b62 00000001 0079bec6 00000800 002aa970 005282a0 > 00163ba8 Here is another frame header, which points to: (gdb) x/i 0x166be6 0x166be6 <mac_esp_send_pdma_cmd+426>: moveal %a5@(16),%a0 which is the exception exit, so we already called send_fault_sig() which sets up everything for the proper exception exit. The only missing bit is to skip the writeback, as the fault has to be first fixed by the caller, so the patch below should do the trick... bye, Roman --- arch/m68k/kernel/traps.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) Index: linux-2.6/arch/m68k/kernel/traps.c =================================================================== --- linux-2.6.orig/arch/m68k/kernel/traps.c +++ linux-2.6/arch/m68k/kernel/traps.c @@ -477,9 +477,16 @@ static inline void access_error040(struc if (fp->un.fmt7.wb3a == fp->un.fmt7.faddr) fp->un.fmt7.wb3s &= ~WBV_040; } - } else if (send_fault_sig(&fp->ptregs) > 0) { - printk("68040 access error, ssw=%x\n", ssw); - trap_c(fp); + } else { + /* In case of a bus error we either kill the process or expect + * the kernel to catch the fault, which then is also responsible + * for cleaning up the mess, so skip writebacks. + */ + current->thread.signo = SIGBUS; + current->thread.faddr = fp->un.fmt7.faddr; + if (send_fault_sig(&fp->ptregs) > 0) + printk("68040 access error, ssw=%x\n", ssw); + return; } do_040writebacks(fp); - To unsubscribe from this list: send the line "unsubscribe linux-m68k" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html