uml: kernel segfaults should dump proper registers
If there's a segfault inside the kernel, we want a dump of the registers at the point of the segfault, not the registers at the point of calling panic or the last userspace registers. sig_handler_common_skas now uses a static register set in the case of a SIGSEGV to avoid messing up the process registers if the segfault turns out to be non-fatal. The architecture sigcontext-to-pt_regs copying code was repurposed to copy data out of the SEGV stack frame. Signed-off-by: Jeff Dike <jdike@linux.intel.com> Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
@@ -15,6 +15,8 @@
|
||||
#include "sysdep/ptrace_user.h"
|
||||
#include "os.h"
|
||||
|
||||
static union uml_pt_regs ksig_regs[UM_NR_CPUS];
|
||||
|
||||
void sig_handler_common_skas(int sig, void *sc_ptr)
|
||||
{
|
||||
struct sigcontext *sc = sc_ptr;
|
||||
@@ -27,10 +29,19 @@ void sig_handler_common_skas(int sig, void *sc_ptr)
|
||||
* the process will die.
|
||||
* XXX Figure out why this is better than SA_NODEFER
|
||||
*/
|
||||
if(sig == SIGSEGV)
|
||||
if(sig == SIGSEGV) {
|
||||
change_sig(SIGSEGV, 1);
|
||||
/* For segfaults, we want the data from the
|
||||
* sigcontext. In this case, we don't want to mangle
|
||||
* the process registers, so use a static set of
|
||||
* registers. For other signals, the process
|
||||
* registers are OK.
|
||||
*/
|
||||
r = &ksig_regs[cpu()];
|
||||
copy_sc(r, sc_ptr);
|
||||
}
|
||||
else r = TASK_REGS(get_current());
|
||||
|
||||
r = TASK_REGS(get_current());
|
||||
save_user = r->skas.is_user;
|
||||
r->skas.is_user = 0;
|
||||
if ( sig == SIGFPE || sig == SIGSEGV ||
|
||||
|
Reference in New Issue
Block a user