aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorAlexander Nyberg <alexn@telia.com>2005-06-25 17:58:26 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-06-25 19:24:54 -0400
commit6e274d144302068a00794ec22e73520c0615cb6f (patch)
treef7ea59ea47d3c5676fbac8d39e8deaa1f94146ae /include
parent86b1ae38c0a62409dc862a28e3f08920f55f944b (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.h8
-rw-r--r--include/linux/reboot.h3
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
101extern struct page *kimage_alloc_control_pages(struct kimage *image, unsigned int order); 101extern struct page *kimage_alloc_control_pages(struct kimage *image, unsigned int order);
102extern void crash_kexec(void); 102extern void crash_kexec(struct pt_regs *);
103int kexec_should_crash(struct task_struct *);
103extern struct kimage *kexec_image; 104extern 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;
123extern struct resource crashk_res; 124extern struct resource crashk_res;
124 125
125#else /* !CONFIG_KEXEC */ 126#else /* !CONFIG_KEXEC */
126static inline void crash_kexec(void) { } 127struct pt_regs;
128struct task_struct;
129static inline void crash_kexec(struct pt_regs *regs) { }
130static 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);
52extern void machine_power_off(void); 52extern void machine_power_off(void);
53 53
54extern void machine_shutdown(void); 54extern void machine_shutdown(void);
55extern void machine_crash_shutdown(void); 55struct pt_regs;
56extern void machine_crash_shutdown(struct pt_regs *);
56 57
57#endif 58#endif
58 59