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

Commit da9ed30d authored by Vasily Gorbik's avatar Vasily Gorbik
Browse files

s390/startup: add initial pgm check handler



The startup code is getting more complicated with features like kaslr and
secure boot in place. In a potential unexpected startup code crash case
the system would end up in a pgm check loop at address 0, overwriting
pgm check old psw value and just making debugging more complicated. To
avoid that introduce startup program check handler which is active
immediately after kernel start and until early_pgm_check_handler is set
in kernel/early.c. So it covers kernel relocation phase and transition
to it. This pgm check handler simply saves general/control registers and
psw in the save area which should guarantee that we still have something
to look at when standalone dumper is called without saving registers. And
it does disabled wait with a faulty address in the end.

Acked-by: default avatarIlya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
parent 40e90656
Loading
Loading
Loading
Loading
+23 −1
Original line number Diff line number Diff line
@@ -60,8 +60,10 @@ __HEAD
	.long	0x02000690,0x60000050
	.long	0x020006e0,0x20000050

	.org	0x1a0
	.org	__LC_RST_NEW_PSW		# 0x1a0
	.quad	0,iplstart
	.org	__LC_PGM_NEW_PSW		# 0x1d0
	.quad	0x0000000180000000,startup_pgm_check_handler

	.org	0x200

@@ -351,6 +353,26 @@ ENTRY(startup_kdump)

#include "head_kdump.S"

#
# This program check is active immediately after kernel start
# and until early_pgm_check_handler is set in kernel/early.c
# It simply saves general/control registers and psw in
# the save area and does disabled wait with a faulty address.
#
ENTRY(startup_pgm_check_handler)
	stmg	%r0,%r15,__LC_SAVE_AREA_SYNC
	la	%r1,4095
	stctg	%c0,%c15,__LC_CREGS_SAVE_AREA-4095(%r1)
	mvc	__LC_GPREGS_SAVE_AREA-4095(128,%r1),__LC_SAVE_AREA_SYNC
	mvc	__LC_PSW_SAVE_AREA-4095(16,%r1),__LC_PGM_OLD_PSW
	lg	%r1,__LC_SAVE_AREA_SYNC+8
	mvc	__LC_RETURN_PSW(16),__LC_PGM_OLD_PSW
	ni	__LC_RETURN_PSW,0xfc	# remove IO and EX bits
	ni	__LC_RETURN_PSW+1,0xfb	# remove MCHK bit
	oi	__LC_RETURN_PSW+1,0x2	# set wait state bit
	lpswe	__LC_RETURN_PSW		# disabled wait
ENDPROC(startup_pgm_check_handler)

#
# params at 10400 (setup.h)
# Must be keept in sync with struct parmarea in setup.h