s390: ipl/dump on panic.
Subsystems (2)
PATCH 1/1 s390: ipl/dump on panic.
From: Michael Holzheu <[email protected]>
[S390] ipl/dump on panic.
It is now possible to specify a ccw/fcp dump device which is used to automatically create a system dump in case of a kernel panic. The dump device can be configured under /sys/firmware/dump.
In addition it is now possible to specify a ccw/fcp device which is used for the next reboot of Linux. The reipl device can be configured under /sys/firmware/reipl.
Signed-off-by Michael Holzheu <[email protected]>
Signed-off-by Martin Schwidefsky <[email protected]>
---
arch/s390/kernel/Makefile | 2 arch/s390/kernel/head31.S | 3 arch/s390/kernel/head64.S | 3 arch/s390/kernel/ipl.c | 942 ++++++++++++++++++++++++++++++++++++++++++ arch/s390/kernel/reipl.S | 33 + arch/s390/kernel/reipl64.S | 34 + arch/s390/kernel/reipl_diag.c | 39 - arch/s390/kernel/setup.c | 220 --------- arch/s390/kernel/smp.c | 10 drivers/s390/cio/cio.c | 51 +- include/asm-s390/cio.h | 7 include/asm-s390/lowcore.h | 13 include/asm-s390/setup.h | 54 +- 13 files changed, 1099 insertions(+), 312 deletions(-)
arch/s390/kernel/head31.S +3 -0
@@ -38,6 +38,7 @@ startup:basr %r13,0 # get base startup_continue: basr %r13,0 # get base .LPG1: GET_IPL_DEVICE + mvi __LC_AR_MODE_ID,0 # set ESA flag (mode 0) lctl %c0,%c15,.Lctl-.LPG1(%r13) # load control registers l %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area # move IPL device to lowcore
@@ -274,6 +275,8 @@ startup_continue: .Lparmaddr: .long PARMAREA .Lsccbaddr: .long .Lsccb .org 0x12000 +.globl s390_readinfo_sccb +s390_readinfo_sccb: .Lsccb: .hword 0x1000 # length, one page .byte 0x00,0x00,0x00
arch/s390/kernel/head64.S +3 -0
@@ -41,6 +41,7 @@ startup_continue: srl %r13,1 GET_IPL_DEVICE lhi %r1,1 # mode 1 = esame + mvi __LC_AR_MODE_ID,1 # set esame flag slr %r0,%r0 # set cpuid to zero sigp %r1,%r0,0x12 # switch to esame mode sam64 # switch to 64 bit mode
@@ -269,6 +270,8 @@ startup_continue: .quad PARMAREA .org 0x12000 +.globl s390_readinfo_sccb +s390_readinfo_sccb: .Lsccb: .hword 0x1000 # length, one page .byte 0x00,0x00,0x00
arch/s390/kernel/ipl.c +942 -0
942 lines not on this page · raw message
arch/s390/kernel/Makefile +1 -1
@@ -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 reipl_diag.o + semaphore.o s390_ext.o debug.o profile.o irq.o ipl.o obj-y += $(if $(CONFIG_64BIT),entry64.o,entry.o) obj-y += $(if $(CONFIG_64BIT),reipl64.o,reipl.o)
arch/s390/kernel/reipl64.S +25 -9
@@ -8,13 +8,30 @@ */ #include <asm/lowcore.h> - .globl do_reipl -do_reipl: basr %r13,0 -.Lpg0: lpswe .Lnewpsw-.Lpg0(%r13) + .globl do_reipl_asm +do_reipl_asm: basr %r13,0 + + # do store status of all registers + +.Lpg0: stg %r1,.Lregsave-.Lpg0(%r13) + lghi %r1,0x1000 + stmg %r0,%r15,__LC_GPREGS_SAVE_AREA-0x1000(%r1) + lg %r0,.Lregsave-.Lpg0(%r13) + stg %r0,__LC_GPREGS_SAVE_AREA-0x1000+8(%r1) + stctg %c0,%c15,__LC_CREGS_SAVE_AREA-0x1000(%r1) + stam %a0,%a15,__LC_AREGS_SAVE_AREA-0x1000(%r1) + stpx __LC_PREFIX_SAVE_AREA-0x1000(%r1) + stfpc __LC_FP_CREG_SAVE_AREA-0x1000(%r1) + stckc .Lclkcmp-.Lpg0(%r13) + mvc __LC_CLOCK_COMP_SAVE_AREA-0x1000(8,%r1),.Lclkcmp-.Lpg0(%r13) + stpt __LC_CPU_TIMER_SAVE_AREA-0x1000(%r1) + stg %r13, __LC_PSW_SAVE_AREA-0x1000+8(%r1) + + lpswe .Lnewpsw-.Lpg0(%r13) .Lpg1: lctlg %c6,%c6,.Lall-.Lpg0(%r13) - stctg %c0,%c0,.Lctlsave-.Lpg0(%r13) - ni .Lctlsave+4-.Lpg0(%r13),0xef - lctlg %c0,%c0,.Lctlsave-.Lpg0(%r13) + stctg %c0,%c0,.Lregsave-.Lpg0(%r13) + ni .Lregsave+4-.Lpg0(%r13),0xef + lctlg %c0,%c0,.Lregsave-.Lpg0(%r13) lgr %r1,%r2 mvc __LC_PGM_NEW_PSW(16),.Lpcnew-.Lpg0(%r13) stsch .Lschib-.Lpg0(%r13)
@@ -50,8 +67,9 @@ do_reipl: basr %r13,0 st %r14,.Ldispsw+12-.Lpg0(%r13) lpswe .Ldispsw-.Lpg0(%r13) .align 8 +.Lclkcmp: .quad 0x0000000000000000 .Lall: .quad 0x00000000ff000000 -.Lctlsave: .quad 0x0000000000000000 +.Lregsave: .quad 0x0000000000000000 .Lnull: .long 0x0000000000000000 .align 16 /*
@@ -92,5 +110,3 @@ do_reipl: basr %r13,0 .long 0x00000000,0x00000000 .long 0x00000000,0x00000000 - -
arch/s390/kernel/reipl_diag.c +0 -39
@@ -1,39 +0,0 @@ -/* -* This file contains the implementation of the -* Linux re-IPL support -* -* (C) Copyright IBM Corp. 2005 -* -* Author(s): Volker Sameske ([email protected]) -* -*/ - -#include <linux/kernel.h> - -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 ) -{ - asmvolatile ( - " 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 CONFIG_64BIT - " .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" ); -}
arch/s390/kernel/reipl.S +26 -7
@@ -8,13 +8,30 @@ #include <asm/lowcore.h> - .globl do_reipl -do_reipl: basr %r13,0 + .globl do_reipl_asm +do_reipl_asm: basr %r13,0 .Lpg0: lpsw .Lnewpsw-.Lpg0(%r13) -.Lpg1: lctl %c6,%c6,.Lall-.Lpg0(%r13) - stctl %c0,%c0,.Lctlsave-.Lpg0(%r13) - ni .Lctlsave-.Lpg0(%r13),0xef - lctl %c0,%c0,.Lctlsave-.Lpg0(%r13) + + # switch off lowcore protection + +.Lpg1: stctl %c0,%c0,.Lctlsave1-.Lpg0(%r13) + stctl %c0,%c0,.Lctlsave2-.Lpg0(%r13) + ni .Lctlsave1-.Lpg0(%r13),0xef + lctl %c0,%c0,.Lctlsave1-.Lpg0(%r13) + + # do store status of all registers + + stm %r0,%r15,__LC_GPREGS_SAVE_AREA + stctl %c0,%c15,__LC_CREGS_SAVE_AREA + mvc __LC_CREGS_SAVE_AREA(4),.Lctlsave2-.Lpg0(%r13) + stam %a0,%a15,__LC_AREGS_SAVE_AREA + stpx __LC_PREFIX_SAVE_AREA + stckc .Lclkcmp-.Lpg0(%r13) + mvc __LC_CLOCK_COMP_SAVE_AREA(8),.Lclkcmp-.Lpg0(%r13) + stpt __LC_CPU_TIMER_SAVE_AREA + st %r13, __LC_PSW_SAVE_AREA+4 + + lctl %c6,%c6,.Lall-.Lpg0(%r13) lr %r1,%r2 mvc __LC_PGM_NEW_PSW(8),.Lpcnew-.Lpg0(%r13) stsch .Lschib-.Lpg0(%r13)
@@ -46,9 +63,11 @@ do_reipl: basr %r13,0 .Ldisab: st %r14,.Ldispsw+4-.Lpg0(%r13) lpsw .Ldispsw-.Lpg0(%r13) .align 8 +.Lclkcmp: .quad 0x0000000000000000 .Lall: .long 0xff000000 .Lnull: .long 0x00000000 -.Lctlsave: .long 0x00000000 +.Lctlsave1: .long 0x00000000 +.Lctlsave2: .long 0x00000000 .align 8 .Lnewpsw: .long 0x00080000,0x80000000+.Lpg1 .Lpcnew: .long 0x00080000,0x80000000+.Lecs
arch/s390/kernel/setup.c +1 -219
231 lines not on this page · raw message
arch/s390/kernel/smp.c +1 -9
@@ -59,9 +59,6 @@ static struct task_struct *current_set[Nextern 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 );
@@ -279,12 +276,7 @@ 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 -reipl (0x10000 | S390_lowcore.ipl_device); +do_reipl (); }void machine_restart_smp (char * __unused)
drivers/s390/cio/cio.c +40 -11
72 lines not on this page · raw message
include/asm-s390/cio.h +7 -0
@@ -270,6 +270,11 @@ struct diag210 { __u32 vrdccrft : 8; /* real device feature (output) */ } __attribute__ ((packed,aligned(4))); +struct ccw_dev_id { +u8 ssid; +u16 devno; +}; +extern int diag210 (struct diag210 *addr);extern void wait_cons_dev (void );
@@ -280,6 +285,8 @@ extern void cio_reset_channel_paths(voidextern void css_schedule_reprobe (void ); +extern void reipl_ccw_dev (struct ccw_dev_id *id); +#endif #endif
include/asm-s390/lowcore.h +12 -1
@@ -47,6 +47,7 @@#define __LC_PER_ATMID 0x096#define __LC_PER_ADDRESS 0x098#define __LC_PER_ACCESS_ID 0x0A1 +#define __LC_AR_MODE_ID 0x0A3#define __LC_SUBCHANNEL_ID 0x0B8#define __LC_SUBCHANNEL_NR 0x0BA
@@ -106,18 +107,28 @@#define __LC_INT_CLOCK 0xDE8#endif /* __s390x__ */ -#define __LC_PANIC_MAGIC 0xE00 +#define __LC_PANIC_MAGIC 0xE00#ifndef __s390x__#define __LC_PFAULT_INTPARM 0x080#define __LC_CPU_TIMER_SAVE_AREA 0x0D8 +#define __LC_CLOCK_COMP_SAVE_AREA 0x0E0 +#define __LC_PSW_SAVE_AREA 0x100 +#define __LC_PREFIX_SAVE_AREA 0x108#define __LC_AREGS_SAVE_AREA 0x120 +#define __LC_FPREGS_SAVE_AREA 0x160#define __LC_GPREGS_SAVE_AREA 0x180#define __LC_CREGS_SAVE_AREA 0x1C0#else /* __s390x__ */ #define __LC_PFAULT_INTPARM 0x11B8 +#define __LC_FPREGS_SAVE_AREA 0x1200#define __LC_GPREGS_SAVE_AREA 0x1280 +#define __LC_PSW_SAVE_AREA 0x1300 +#define __LC_PREFIX_SAVE_AREA 0x1318 +#define __LC_FP_CREG_SAVE_AREA 0x131C +#define __LC_TODREG_SAVE_AREA 0x1324#define __LC_CPU_TIMER_SAVE_AREA 0x1328 +#define __LC_CLOCK_COMP_SAVE_AREA 0x1331#define __LC_AREGS_SAVE_AREA 0x1340#define __LC_CREGS_SAVE_AREA 0x1380#endif /* __s390x__ */
include/asm-s390/setup.h +38 -16
89 lines not on this page · raw message