[PATCH] kdump: Use real pt_regs from exception
Makes kexec_crashdump() take a pt_regs * as an argument. This allows to get exact register state at the point of the crash. If we come from direct panic assertion NULL will be passed and the current registers saved before crashdump. This hooks into two places: die(): check the conditions under which we will panic when calling do_exit and go there directly with the pt_regs that caused the fatal fault. die_nmi(): If we receive an NMI lockup while in the kernel use the pt_regs and go directly to crash_kexec(). We're probably nested up badly at this point so this might be the only chance to escape with proper information. Signed-off-by: Alexander Nyberg <alexn@telia.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
86b1ae38c0
commit
6e274d1443
@@ -18,6 +18,8 @@
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/syscalls.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/hardirq.h>
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/io.h>
|
||||
@@ -32,6 +34,13 @@ struct resource crashk_res = {
|
||||
.flags = IORESOURCE_BUSY | IORESOURCE_MEM
|
||||
};
|
||||
|
||||
int kexec_should_crash(struct task_struct *p)
|
||||
{
|
||||
if (in_interrupt() || !p->pid || p->pid == 1 || panic_on_oops)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* When kexec transitions to the new kernel there is a one-to-one
|
||||
* mapping between physical and virtual addresses. On processors
|
||||
@@ -1010,7 +1019,7 @@ asmlinkage long compat_sys_kexec_load(unsigned long entry,
|
||||
}
|
||||
#endif
|
||||
|
||||
void crash_kexec(void)
|
||||
void crash_kexec(struct pt_regs *regs)
|
||||
{
|
||||
struct kimage *image;
|
||||
int locked;
|
||||
@@ -1028,7 +1037,7 @@ void crash_kexec(void)
|
||||
if (!locked) {
|
||||
image = xchg(&kexec_crash_image, NULL);
|
||||
if (image) {
|
||||
machine_crash_shutdown();
|
||||
machine_crash_shutdown(regs);
|
||||
machine_kexec(image);
|
||||
}
|
||||
xchg(&kexec_lock, 0);
|
||||
|
Reference in New Issue
Block a user