From: David Howells Date: Mon, 6 Jun 2011 14:47:14 +0000 (+0100) Subject: MN10300: die_if_no_fixup() shouldn't use get_user() as it doesn't call set_fs() X-Git-Tag: 2.1b_release~3778 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=db1c9dfa649f9bd8dc11415fbfe5cfe1e24c5b33;p=platform%2Fkernel%2Fkernel-mfld-blackbay.git MN10300: die_if_no_fixup() shouldn't use get_user() as it doesn't call set_fs() die_if_no_fixup() shouldn't use get_user() as it doesn't call set_fs() to indicate that it wants to probe a kernel address. Instead it should use probe_kernel_read(). This fixes the problem of gdb seeing SIGILL rather than SIGTRAP when hitting the KGDB special breakpoint upon SysRq+g being seen. The problem was that die_if_no_fixup() was failing to read the opcode of the instruction that caused the exception, and thus not fixing up the exception. This caused gdb to get a S04 response to the $? request in its remote protocol rather than S05 - which would then cause it to continue with $C04 rather than $c in an attempt to pass the signal onto the inferior process. The kernel, however, does not support $Cnn, and so objects by returning an E22 response, indicating an error. gdb does not expect this and prints: warning: Remote failure reply: E22 and then returns to the gdb command prompt unable to continue. Signed-off-by: David Howells Signed-off-by: Linus Torvalds --- diff --git a/arch/mn10300/kernel/traps.c b/arch/mn10300/kernel/traps.c index f03cb27..bd3e5e7 100644 --- a/arch/mn10300/kernel/traps.c +++ b/arch/mn10300/kernel/traps.c @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #include #include @@ -156,7 +156,7 @@ int die_if_no_fixup(const char *str, struct pt_regs *regs, case EXCEP_TRAP: case EXCEP_UNIMPINS: - if (get_user(opcode, (uint8_t __user *)regs->pc) != 0) + if (probe_kernel_read(&opcode, (u8 *)regs->pc, 1) < 0) break; if (opcode == 0xff) { if (notify_die(DIE_BREAKPOINT, str, regs, code, 0, 0))