Files
xen/unmodified_drivers/linux-2.6/platform-pci/panic-handler.c
T
Keir Fraser 5ffec49444 pv-on-hvm: Signal crash to Xen tools when HVM guest panics.
Attached patch adds a function to automatically dump core file when
guest linux on HVM domain panics, in the same way as PV domain.

I tested this patch with kernel 2.6.9 and 2.6.18 on both of x86 and
ia64 (to buid for ia64, some patches in the ia64 tree are needed) by
the following steps, and confirmed it works well:

1. Build xen-platform-pci.ko.
2. In /etc/xen/xend-config.sxp, set (enable-dump yes).
3. On guest linux, execute insmod:
   # insmod xen-platform-pci.ko
4. When guest linux panics, a core file is dumped.

Signed-off-by: Tetsu Yamamoto <yamamoto.tetsu@jp.fujitsu.com>
2008-02-13 10:42:09 +00:00

55 lines
1.3 KiB
C

#include <linux/module.h>
#include <linux/init.h>
#include <linux/notifier.h>
#include <asm/hypervisor.h>
MODULE_LICENSE("GPL");
#ifdef __ia64__
static void
xen_panic_hypercall(struct unw_frame_info *info, void *arg)
{
current->thread.ksp = (__u64)info->sw - 16;
HYPERVISOR_shutdown(SHUTDOWN_crash);
/* we're never actually going to get here... */
}
#endif
static int
xen_panic_event(struct notifier_block *this, unsigned long event, void *ptr)
{
#ifdef __ia64__
unw_init_running(xen_panic_hypercall, NULL);
#else /* !__ia64__ */
HYPERVISOR_shutdown(SHUTDOWN_crash);
#endif
/* we're never actually going to get here... */
return NOTIFY_DONE;
}
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
static struct notifier_block xen_panic_block = {
xen_panic_event, NULL, 0 /* try to go last */
};
#else
static struct notifier_block xen_panic_block = {
.notifier_call= xen_panic_event,
.next= NULL,
.priority= 0/* try to go last */
};
#endif /*LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)*/
static int __init setup_panic_event(void)
{
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
notifier_chain_register(&panic_notifier_list, &xen_panic_block);
#else
atomic_notifier_chain_register(&panic_notifier_list, &xen_panic_block);
#endif /*LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)*/
return 0;
}
int xen_panic_handler_init(void)
{
return setup_panic_event();
}