/* * Reset system and call either kdump or normal kexec */ static void __machine_kexec(void *data) { struct kimage *image = data; pfault_fini(); if (image->type == KEXEC_TYPE_CRASH) s390_reset_system(__do_machine_kdump, data); else s390_reset_system(__do_machine_kexec, data); disabled_wait((unsigned long) __builtin_return_address(0)); }
/* * Reset system and call either kdump or normal kexec */ void machine_kexec(struct kimage *image) { if (image->type == KEXEC_TYPE_CRASH && !kdump_csum_valid(image)) return; smp_send_stop(); pfault_fini(); if (image->type == KEXEC_TYPE_CRASH) s390_reset_system(__do_machine_kdump, image); else s390_reset_system(__do_machine_kexec, image); disabled_wait((unsigned long) __builtin_return_address(0)); }
static void __machine_kexec(void *data) { struct kimage *image = data; pfault_fini(); tracing_off(); debug_locks_off(); if (image->type == KEXEC_TYPE_CRASH) { lgr_info_log(); s390_reset_system(__do_machine_kdump, data); } else { s390_reset_system(__do_machine_kexec, data); } disabled_wait((unsigned long) __builtin_return_address(0)); }
/* * Reset system and call either kdump or normal kexec */ static void __machine_kexec(void *data) { __arch_local_irq_stosm(0x04); /* enable DAT */ pfault_fini(); tracing_off(); debug_locks_off(); #ifdef CONFIG_CRASH_DUMP if (((struct kimage *) data)->type == KEXEC_TYPE_CRASH) { lgr_info_log(); s390_reset_system(setup_regs, __do_machine_kdump, data); } else #endif s390_reset_system(NULL, __do_machine_kexec, data); disabled_wait((unsigned long) __builtin_return_address(0)); }
/* * Reset the system, copy boot CPU registers to absolute zero, * and jump to the kdump image */ static void __do_machine_kdump(void *image) { int (*start_kdump)(int); unsigned long prefix; /* store_status() saved the prefix register to lowcore */ prefix = (unsigned long) S390_lowcore.prefixreg_save_area; /* Now do the reset */ s390_reset_system(); /* * Copy dump CPU store status info to absolute zero. * This need to be done *after* s390_reset_system set the * prefix register of this CPU to zero */ memcpy((void *) __LC_FPREGS_SAVE_AREA, (void *)(prefix + __LC_FPREGS_SAVE_AREA), 512); __load_psw_mask(PSW_MASK_BASE | PSW_DEFAULT_KEY | PSW_MASK_EA | PSW_MASK_BA); start_kdump = (void *)((struct kimage *) image)->start; start_kdump(1); /* Die if start_kdump returns */ disabled_wait((unsigned long) __builtin_return_address(0)); }
/* * Reset system and call either kdump or normal kexec */ void machine_kexec(struct kimage *image) { if (image->type == KEXEC_TYPE_CRASH && !kdump_csum_valid(image)) return; smp_send_stop(); pfault_fini(); tracing_off(); debug_locks_off(); if (image->type == KEXEC_TYPE_CRASH) { lgr_info_log(); s390_reset_system(__do_machine_kdump, image); } else { s390_reset_system(__do_machine_kexec, image); } disabled_wait((unsigned long) __builtin_return_address(0)); }
/* Make sure all subchannels are quiet before we re-ipl an lpar. */ void reipl_ccw_dev(struct ccw_dev_id *devid) { struct subchannel_id uninitialized_var(schid); s390_reset_system(); if (reipl_find_schid(devid, &schid) != 0) panic("IPL Device not found\n"); do_reipl_asm(*((__u32*)&schid)); }
static void __machine_kexec(void *data) { relocate_kernel_t data_mover; struct kimage *image = data; pfault_fini(); s390_reset_system(); data_mover = (relocate_kernel_t) page_to_phys(image->control_code_page); /* Call the moving routine */ (*data_mover)(&image->head, image->start); for (;;); }
/* * Do normal kexec */ static void __do_machine_kexec(void *data) { relocate_kernel_t data_mover; struct kimage *image = data; s390_reset_system(); data_mover = (relocate_kernel_t) page_to_phys(image->control_code_page); /* Call the moving routine */ (*data_mover)(&image->head, image->start); /* Die if kexec returns */ disabled_wait((unsigned long) __builtin_return_address(0)); }