diff options
author | Alexander Nyberg <alexn@telia.com> | 2005-06-25 17:58:26 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-25 19:24:54 -0400 |
commit | 6e274d144302068a00794ec22e73520c0615cb6f (patch) | |
tree | f7ea59ea47d3c5676fbac8d39e8deaa1f94146ae /include | |
parent | 86b1ae38c0a62409dc862a28e3f08920f55f944b (diff) |
[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>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/kexec.h | 8 | ||||
-rw-r--r-- | include/linux/reboot.h | 3 |
2 files changed, 8 insertions, 3 deletions
diff --git a/include/linux/kexec.h b/include/linux/kexec.h index 0653a27c3d72..7383173a3a9c 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h | |||
@@ -99,7 +99,8 @@ extern asmlinkage long compat_sys_kexec_load(unsigned long entry, | |||
99 | unsigned long flags); | 99 | unsigned long flags); |
100 | #endif | 100 | #endif |
101 | extern struct page *kimage_alloc_control_pages(struct kimage *image, unsigned int order); | 101 | extern struct page *kimage_alloc_control_pages(struct kimage *image, unsigned int order); |
102 | extern void crash_kexec(void); | 102 | extern void crash_kexec(struct pt_regs *); |
103 | int kexec_should_crash(struct task_struct *); | ||
103 | extern struct kimage *kexec_image; | 104 | extern struct kimage *kexec_image; |
104 | 105 | ||
105 | #define KEXEC_ON_CRASH 0x00000001 | 106 | #define KEXEC_ON_CRASH 0x00000001 |
@@ -123,6 +124,9 @@ extern struct kimage *kexec_image; | |||
123 | extern struct resource crashk_res; | 124 | extern struct resource crashk_res; |
124 | 125 | ||
125 | #else /* !CONFIG_KEXEC */ | 126 | #else /* !CONFIG_KEXEC */ |
126 | static inline void crash_kexec(void) { } | 127 | struct pt_regs; |
128 | struct task_struct; | ||
129 | static inline void crash_kexec(struct pt_regs *regs) { } | ||
130 | static inline int kexec_should_crash(struct task_struct *p) { return 0; } | ||
127 | #endif /* CONFIG_KEXEC */ | 131 | #endif /* CONFIG_KEXEC */ |
128 | #endif /* LINUX_KEXEC_H */ | 132 | #endif /* LINUX_KEXEC_H */ |
diff --git a/include/linux/reboot.h b/include/linux/reboot.h index c5a05e16edb2..2d4dd23168dd 100644 --- a/include/linux/reboot.h +++ b/include/linux/reboot.h | |||
@@ -52,7 +52,8 @@ extern void machine_halt(void); | |||
52 | extern void machine_power_off(void); | 52 | extern void machine_power_off(void); |
53 | 53 | ||
54 | extern void machine_shutdown(void); | 54 | extern void machine_shutdown(void); |
55 | extern void machine_crash_shutdown(void); | 55 | struct pt_regs; |
56 | extern void machine_crash_shutdown(struct pt_regs *); | ||
56 | 57 | ||
57 | #endif | 58 | #endif |
58 | 59 | ||