Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 411ed322 authored by Michael Holzheu's avatar Michael Holzheu Committed by Martin Schwidefsky
Browse files

[S390] zfcpdump support.



s390 machines provide hardware support for creating Linux dumps on SCSI
disks. For creating a dump a special purpose dump Linux is used. The first
32 MB of memory are saved by the hardware before the dump Linux is
booted. Via an SCLP interface, the saved memory can be accessed from
Linux. This patch exports memory and registers of the crashed Linux to
userspace via a debugfs file. For more information refer to
Documentation/s390/zfcpdump.txt, which is included in this patch.

Signed-off-by: default avatarMichael Holzheu <holzheu@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
parent 7039d3a1
Loading
Loading
Loading
Loading
+87 −0
Original line number Original line Diff line number Diff line
s390 SCSI dump tool (zfcpdump)

System z machines (z900 or higher) provide hardware support for creating system
dumps on SCSI disks. The dump process is initiated by booting a dump tool, which
has to create a dump of the current (probably crashed) Linux image. In order to
not overwrite memory of the crashed Linux with data of the dump tool, the
hardware saves some memory plus the register sets of the boot cpu before the
dump tool is loaded. There exists an SCLP hardware interface to obtain the saved
memory afterwards. Currently 32 MB are saved.

This zfcpdump implementation consists of a Linux dump kernel together with
a userspace dump tool, which are loaded together into the saved memory region
below 32 MB. zfcpdump is installed on a SCSI disk using zipl (as contained in
the s390-tools package) to make the device bootable. The operator of a Linux
system can then trigger a SCSI dump by booting the SCSI disk, where zfcpdump
resides on.

The kernel part of zfcpdump is implemented as a debugfs file under "zcore/mem",
which exports memory and registers of the crashed Linux in an s390
standalone dump format. It can be used in the same way as e.g. /dev/mem. The
dump format defines a 4K header followed by plain uncompressed memory. The
register sets are stored in the prefix pages of the respective cpus. To build a
dump enabled kernel with the zcore driver, the kernel config option
CONFIG_ZFCPDUMP has to be set. When reading from "zcore/mem", the part of
memory, which has been saved by hardware is read by the driver via the SCLP
hardware interface. The second part is just copied from the non overwritten real
memory.

The userspace application of zfcpdump can reside e.g. in an intitramfs or an
initrd. It reads from zcore/mem and writes the system dump to a file on a
SCSI disk.

To build a zfcpdump kernel use the following settings in your kernel
configuration:
 * CONFIG_ZFCPDUMP=y
 * Enable ZFCP driver
 * Enable SCSI driver
 * Enable ext2 and ext3 filesystems
 * Disable as many features as possible to keep the kernel small.
   E.g. network support is not needed at all.

To use the zfcpdump userspace application in an initramfs you have to do the
following:

 * Copy the zfcpdump executable somewhere into your Linux tree.
   E.g. to "arch/s390/boot/zfcpdump. If you do not want to include
   shared libraries, compile the tool with the "-static" gcc option.
 * If you want to include e2fsck, add it to your source tree, too. The zfcpdump
   application attempts to start /sbin/e2fsck from the ramdisk.
 * Use an initramfs config file like the following:

   dir /dev 755 0 0
   nod /dev/console 644 0 0 c 5 1
   nod /dev/null 644 0 0 c 1 3
   nod /dev/sda1 644 0 0 b 8 1
   nod /dev/sda2 644 0 0 b 8 2
   nod /dev/sda3 644 0 0 b 8 3
   nod /dev/sda4 644 0 0 b 8 4
   nod /dev/sda5 644 0 0 b 8 5
   nod /dev/sda6 644 0 0 b 8 6
   nod /dev/sda7 644 0 0 b 8 7
   nod /dev/sda8 644 0 0 b 8 8
   nod /dev/sda9 644 0 0 b 8 9
   nod /dev/sda10 644 0 0 b 8 10
   nod /dev/sda11 644 0 0 b 8 11
   nod /dev/sda12 644 0 0 b 8 12
   nod /dev/sda13 644 0 0 b 8 13
   nod /dev/sda14 644 0 0 b 8 14
   nod /dev/sda15 644 0 0 b 8 15
   file /init arch/s390/boot/zfcpdump 755 0 0
   file /sbin/e2fsck arch/s390/boot/e2fsck 755 0 0
   dir /proc 755 0 0
   dir /sys 755 0 0
   dir /mnt 755 0 0
   dir /sbin 755 0 0

 * Issue "make image" to build the zfcpdump image with initramfs.

In a Linux distribution the zfcpdump enabled kernel image must be copied to
/usr/share/zfcpdump/zfcpdump.image, where the s390 zipl tool is looking for the
dump kernel when preparing a SCSI dump disk.

If you use a ramdisk copy it to "/usr/share/zfcpdump/zfcpdump.rd".

For more information on how to use zfcpdump refer to the s390 'Using the Dump
Tools book', which is available from
http://www.ibm.com/developerworks/linux/linux390.
+8 −0
Original line number Original line Diff line number Diff line
@@ -519,6 +519,14 @@ config KEXEC
	  current kernel, and to start another kernel.  It is like a reboot
	  current kernel, and to start another kernel.  It is like a reboot
	  but is independent of hardware/microcode support.
	  but is independent of hardware/microcode support.


config ZFCPDUMP
	tristate "zfcpdump support"
	select SMP
	default n
	help
	  Select this option if you want to build an zfcpdump enabled kernel.
	  Refer to "Documentation/s390/zfcpdump.txt" for more details on this.

endmenu
endmenu


source "net/Kconfig"
source "net/Kconfig"
+3 −0
Original line number Original line Diff line number Diff line
@@ -105,6 +105,9 @@ install: vmlinux
image: vmlinux
image: vmlinux
	$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
	$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@


zfcpdump:
	$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@

archclean:
archclean:
	$(Q)$(MAKE) $(clean)=$(boot)
	$(Q)$(MAKE) $(clean)=$(boot)


+1 −0
Original line number Original line Diff line number Diff line
@@ -167,6 +167,7 @@ CONFIG_NO_IDLE_HZ=y
CONFIG_NO_IDLE_HZ_INIT=y
CONFIG_NO_IDLE_HZ_INIT=y
CONFIG_S390_HYPFS_FS=y
CONFIG_S390_HYPFS_FS=y
CONFIG_KEXEC=y
CONFIG_KEXEC=y
# CONFIG_ZFCPDUMP is not set


#
#
# Networking
# Networking
+71 −1
Original line number Original line Diff line number Diff line
@@ -39,7 +39,69 @@ startup_continue:
	basr	%r13,0			# get base
	basr	%r13,0			# get base
.LPG1:	sll	%r13,1			# remove high order bit
.LPG1:	sll	%r13,1			# remove high order bit
	srl	%r13,1
	srl	%r13,1
	lhi	%r1,1			# mode 1 = esame

#ifdef CONFIG_ZFCPDUMP

	# check if we have been ipled using zfcp dump:

	tm	0xb9,0x01		# test if subchannel is enabled
	jno	.nodump			# subchannel disabled
	l	%r1,0xb8
	la	%r5,.Lipl_schib-.LPG1(%r13)
	stsch	0(%r5)			# get schib of subchannel
	jne	.nodump			# schib not available
	tm	5(%r5),0x01		# devno valid?
	jno	.nodump
	tm	4(%r5),0x80		# qdio capable device?
	jno	.nodump
	l	%r2,20(%r0)		# address of ipl parameter block
	lhi	%r3,0
	ic	%r3,0x148(%r2)		# get opt field
	chi	%r3,0x20		# load with dump?
	jne	.nodump

	# store all prefix registers in case of load with dump:

	la	%r7,0			# base register for 0 page
	la	%r8,0			# first cpu
	l	%r11,.Lpref_arr_ptr-.LPG1(%r13)	# address of prefix array
	ahi	%r11,4			# skip boot cpu
	lr	%r12,%r11
	ahi	%r12,(CONFIG_NR_CPUS*4)	# end of prefix array
	stap	.Lcurrent_cpu+2-.LPG1(%r13)	# store current cpu addr
1:
	cl	%r8,.Lcurrent_cpu-.LPG1(%r13)	# is ipl cpu ?
	je	4f				# if yes get next cpu
2:
	lr	%r9,%r7
	sigp	%r9,%r8,0x9		# stop & store status of cpu
	brc	8,3f			# accepted
	brc	4,4f			# status stored: next cpu
	brc	2,2b			# busy: 	 try again
	brc	1,4f			# not op:	 next cpu
3:
	mvc	0(4,%r11),264(%r7)	# copy prefix register to prefix array
	ahi	%r11,4			# next element in prefix array
	clr	%r11,%r12
	je	5f			# no more space in prefix array
4:
	ahi	%r8,1				# next cpu (r8 += 1)
	cl	%r8,.Llast_cpu-.LPG1(%r13)	# is last possible cpu ?
	jl	1b				# jump if not last cpu
5:
	lhi	%r1,2			# mode 2 = esame (dump)
	j	6f
	.align 4
.Lipl_schib:
	.rept 13
	.long 0
	.endr
.nodump:
	lhi	%r1,1			# mode 1 = esame (normal ipl)
6:
#else
	lhi	%r1,1			# mode 1 = esame (normal ipl)
#endif /* CONFIG_ZFCPDUMP */
	mvi	__LC_AR_MODE_ID,1	# set esame flag
	mvi	__LC_AR_MODE_ID,1	# set esame flag
	slr	%r0,%r0 		# set cpuid to zero
	slr	%r0,%r0 		# set cpuid to zero
	sigp	%r1,%r0,0x12		# switch to esame mode
	sigp	%r1,%r0,0x12		# switch to esame mode
@@ -149,6 +211,14 @@ startup_continue:
.L4malign:.quad 0xffffffffffc00000
.L4malign:.quad 0xffffffffffc00000
.Lscan2g:.quad	0x80000000 + 0x20000 - 8	# 2GB + 128K - 8
.Lscan2g:.quad	0x80000000 + 0x20000 - 8	# 2GB + 128K - 8
.Lnop:	.long	0x07000700
.Lnop:	.long	0x07000700
#ifdef CONFIG_ZFCPDUMP
.Lcurrent_cpu:
	.long 0x0
.Llast_cpu:
	.long 0x0000ffff
.Lpref_arr_ptr:
	.long zfcpdump_prefix_array
#endif /* CONFIG_ZFCPDUMP */
.Lparmaddr:
.Lparmaddr:
	.quad	PARMAREA
	.quad	PARMAREA
	.align	64
	.align	64
Loading