]> err.no Git - linux-2.6/blobdiff - arch/s390/kernel/machine_kexec.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 into for-linus
[linux-2.6] / arch / s390 / kernel / machine_kexec.c
index def5caf8f72f56baaed3825e742676f6ea0fe593..3c77dd36994cec6b71544a345a670d56353017d5 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/mm.h>
 #include <linux/kexec.h>
 #include <linux/delay.h>
+#include <linux/reboot.h>
 #include <asm/cio.h>
 #include <asm/setup.h>
 #include <asm/pgtable.h>
@@ -18,6 +19,7 @@
 #include <asm/system.h>
 #include <asm/smp.h>
 #include <asm/reset.h>
+#include <asm/ipl.h>
 
 typedef void (*relocate_kernel_t)(kimage_entry_t *, unsigned long);
 
@@ -28,6 +30,10 @@ int machine_kexec_prepare(struct kimage *image)
 {
        void *reboot_code_buffer;
 
+       /* Can't replace kernel image since it is read-only. */
+       if (ipl_flags & IPL_NSS_VALID)
+               return -ENOSYS;
+
        /* We don't support anything but the default image type for now. */
        if (image->type != KEXEC_TYPE_DEFAULT)
                return -EINVAL;
@@ -49,18 +55,12 @@ void machine_shutdown(void)
        printk(KERN_INFO "kexec: machine_shutdown called\n");
 }
 
-extern void pfault_fini(void);
-
 void machine_kexec(struct kimage *image)
 {
        relocate_kernel_t data_mover;
 
-       preempt_disable();
-#ifdef CONFIG_PFAULT
-       if (MACHINE_IS_VM)
-               pfault_fini();
-#endif
        smp_send_stop();
+       pfault_fini();
        s390_reset_system();
 
        data_mover = (relocate_kernel_t) page_to_phys(image->control_code_page);