From: Volker Sameske Add code to support the re-IPL method using diagnose 0x308. Signed-off-by: Martin Schwidefsky Signed-off-by: Andrew Morton --- arch/s390/kernel/Makefile | 2 +- arch/s390/kernel/reipl_diag.c | 39 +++++++++++++++++++++++++++++++++++++++ arch/s390/kernel/setup.c | 3 +++ arch/s390/kernel/smp.c | 3 +++ 4 files changed, 46 insertions(+), 1 deletion(-) diff -puN arch/s390/kernel/Makefile~s390-diag-0x308-reipl arch/s390/kernel/Makefile --- devel/arch/s390/kernel/Makefile~s390-diag-0x308-reipl 2005-09-14 22:13:46.000000000 -0700 +++ devel-akpm/arch/s390/kernel/Makefile 2005-09-14 22:13:46.000000000 -0700 @@ -6,7 +6,7 @@ EXTRA_AFLAGS := -traditional obj-y := bitmap.o traps.o time.o process.o \ setup.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \ - semaphore.o s390_ext.o debug.o profile.o irq.o + semaphore.o s390_ext.o debug.o profile.o irq.o reipl_diag.o extra-$(CONFIG_ARCH_S390_31) += head.o extra-$(CONFIG_ARCH_S390X) += head64.o diff -puN /dev/null arch/s390/kernel/reipl_diag.c --- /dev/null 2003-09-15 06:40:47.000000000 -0700 +++ devel-akpm/arch/s390/kernel/reipl_diag.c 2005-09-14 22:13:46.000000000 -0700 @@ -0,0 +1,39 @@ +/* + * This file contains the implementation of the + * Linux re-IPL support + * + * (C) Copyright IBM Corp. 2005 + * + * Author(s): Volker Sameske (sameske@de.ibm.com) + * + */ + +#include + +static unsigned int reipl_diag_rc1; +static unsigned int reipl_diag_rc2; + +/* + * re-IPL the system using the last used IPL parameters + */ +void reipl_diag(void) +{ + asm volatile ( + " la %%r4,0\n" + " la %%r5,0\n" + " diag %%r4,%2,0x308\n" + "0:\n" + " st %%r4,%0\n" + " st %%r5,%1\n" + ".section __ex_table,\"a\"\n" +#ifdef __s390x__ + " .align 8\n" + " .quad 0b, 0b\n" +#else + " .align 4\n" + " .long 0b, 0b\n" +#endif + ".previous\n" + : "=m" (reipl_diag_rc1), "=m" (reipl_diag_rc2) + : "d" (3) : "cc", "4", "5" ); +} diff -puN arch/s390/kernel/setup.c~s390-diag-0x308-reipl arch/s390/kernel/setup.c --- devel/arch/s390/kernel/setup.c~s390-diag-0x308-reipl 2005-09-14 22:13:46.000000000 -0700 +++ devel-akpm/arch/s390/kernel/setup.c 2005-09-14 22:13:46.000000000 -0700 @@ -261,8 +261,11 @@ void (*_machine_power_off)(void) = machi * Reboot, halt and power_off routines for non SMP. */ extern void reipl(unsigned long devno); +extern void reipl_diag(void); static void do_machine_restart_nonsmp(char * __unused) { + reipl_diag(); + if (MACHINE_IS_VM) cpcmd ("IPL", NULL, 0); else diff -puN arch/s390/kernel/smp.c~s390-diag-0x308-reipl arch/s390/kernel/smp.c --- devel/arch/s390/kernel/smp.c~s390-diag-0x308-reipl 2005-09-14 22:13:46.000000000 -0700 +++ devel-akpm/arch/s390/kernel/smp.c 2005-09-14 22:13:46.000000000 -0700 @@ -65,6 +65,7 @@ extern char vmhalt_cmd[]; extern char vmpoff_cmd[]; extern void reipl(unsigned long devno); +extern void reipl_diag(void); static void smp_ext_bitcall(int, ec_bit_sig); static void smp_ext_bitcall_others(ec_bit_sig); @@ -283,6 +284,8 @@ static void do_machine_restart(void * __ * interrupted by an external interrupt and s390irq * locks are always held disabled). */ + reipl_diag(); + if (MACHINE_IS_VM) cpcmd ("IPL", NULL, 0, NULL); else _