MN10300: die_if_no_fixup() shouldn't use get_user() as it doesn't call set_fs()
authorDavid Howells <dhowells@redhat.com>
Mon, 6 Jun 2011 14:47:14 +0000 (15:47 +0100)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 8 Jun 2011 02:03:52 +0000 (19:03 -0700)
commitdb1c9dfa649f9bd8dc11415fbfe5cfe1e24c5b33
treee032d804997b7494ff994b496aa5b3575e3a7495
parent2e65d1f6eecc176ba1341541b5f41edd7eb4346a
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 <dhowells@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
arch/mn10300/kernel/traps.c