diff -Naurp 2616-rc2.orig/include/linux/kexec.h 2616-rc2/include/linux/kexec.h --- 2616-rc2.orig/include/linux/kexec.h 2006-02-06 19:08:01.000000000 -0800 +++ 2616-rc2/include/linux/kexec.h 2006-02-06 19:06:37.000000000 -0800 @@ -6,6 +6,7 @@ #include #include #include +#include #include /* Verify architecture specific macros are defined */ diff -Naurp 2616-rc2.orig/init/initramfs.c 2616-rc2/init/initramfs.c --- 2616-rc2.orig/init/initramfs.c 2006-02-06 19:04:42.000000000 -0800 +++ 2616-rc2/init/initramfs.c 2006-02-06 19:04:59.000000000 -0800 @@ -466,10 +466,32 @@ static char * __init unpack_to_rootfs(ch extern char __initramfs_start[], __initramfs_end[]; #ifdef CONFIG_BLK_DEV_INITRD #include +#include static void __init free_initrd(void) { - free_initrd_mem(initrd_start, initrd_end); +#ifdef CONFIG_KEXEC + unsigned long crashk_start = (unsigned long)__va(crashk_res.start); + unsigned long crashk_end = (unsigned long)__va(crashk_res.end); + + /* + * If the initrd region is overlapped with crashkernel reserved region, + * free only memory that is not part of crashkernel region. + */ + if (initrd_start < crashk_end && initrd_end > crashk_start) { + /* + * Initialize initrd memory region since the kexec boot does + * not do. + */ + memset((void *)initrd_start, 0, initrd_end - initrd_start); + if (initrd_start < crashk_start) + free_initrd_mem(initrd_start, crashk_start); + if (initrd_end > crashk_end) + free_initrd_mem(crashk_end, initrd_end); + } else +#endif + free_initrd_mem(initrd_start, initrd_end); + initrd_start = 0; initrd_end = 0; }