xref: /openbmc/linux/arch/s390/boot/head.S (revision e9953b72)
18282cd64SVasily Gorbik/* SPDX-License-Identifier: GPL-2.0 */
28282cd64SVasily Gorbik/*
38282cd64SVasily Gorbik * Copyright IBM Corp. 1999, 2010
48282cd64SVasily Gorbik *
58282cd64SVasily Gorbik *    Author(s): Hartmut Penner <hp@de.ibm.com>
68282cd64SVasily Gorbik *		 Martin Schwidefsky <schwidefsky@de.ibm.com>
78282cd64SVasily Gorbik *		 Rob van der Heij <rvdhei@iae.nl>
88282cd64SVasily Gorbik *
98282cd64SVasily Gorbik * There are 5 different IPL methods
108282cd64SVasily Gorbik *  1) load the image directly into ram at address 0 and do an PSW restart
118282cd64SVasily Gorbik *  2) linload will load the image from address 0x10000 to memory 0x10000
128282cd64SVasily Gorbik *     and start the code thru LPSW 0x0008000080010000 (VM only, deprecated)
138282cd64SVasily Gorbik *  3) generate the tape ipl header, store the generated image on a tape
148282cd64SVasily Gorbik *     and ipl from it
158282cd64SVasily Gorbik *     In case of SL tape you need to IPL 5 times to get past VOL1 etc
168282cd64SVasily Gorbik *  4) generate the vm reader ipl header, move the generated image to the
178282cd64SVasily Gorbik *     VM reader (use option NOH!) and do a ipl from reader (VM only)
188282cd64SVasily Gorbik *  5) direct call of start by the SALIPL loader
198282cd64SVasily Gorbik *  We use the cpuid to distinguish between VM and native ipl
208282cd64SVasily Gorbik *  params for kernel are pushed to 0x10400 (see setup.h)
218282cd64SVasily Gorbik *
228282cd64SVasily Gorbik */
238282cd64SVasily Gorbik
248282cd64SVasily Gorbik#include <linux/init.h>
258282cd64SVasily Gorbik#include <linux/linkage.h>
268282cd64SVasily Gorbik#include <asm/asm-offsets.h>
278282cd64SVasily Gorbik#include <asm/page.h>
288282cd64SVasily Gorbik#include <asm/ptrace.h>
290029b4d1SAlexander Egorenkov#include <asm/sclp.h>
30834979c2SHeiko Carstens#include "boot.h"
318282cd64SVasily Gorbik
328282cd64SVasily Gorbik#define ARCH_OFFSET	4
338282cd64SVasily Gorbik
346a24d466SAlexander Egorenkov#define EP_OFFSET	0x10008
356a24d466SAlexander Egorenkov#define EP_STRING	"S390EP"
36834979c2SHeiko Carstens#define IPL_BS		0x730
3773475797SHeiko Carstens
388282cd64SVasily Gorbik__HEAD
3973475797SHeiko Carstensipl_start:
4073475797SHeiko Carstens	j	.Liplcont
418282cd64SVasily Gorbik#
428282cd64SVasily Gorbik# subroutine to wait for end I/O
438282cd64SVasily Gorbik#
448282cd64SVasily Gorbik.Lirqwait:
45*e9953b72SHeiko Carstens	larl	%r13,.Lnewpsw		# set up IO interrupt psw
46*e9953b72SHeiko Carstens	mvc	__LC_IO_NEW_PSW(16),0(%r13)
478282cd64SVasily Gorbik	lpsw	.Lwaitpsw
488282cd64SVasily Gorbik.Lioint:
498282cd64SVasily Gorbik	br	%r14
508282cd64SVasily Gorbik	.align	8
518282cd64SVasily Gorbik.Lnewpsw:
528282cd64SVasily Gorbik	.quad	0x0000000080000000,.Lioint
538282cd64SVasily Gorbik.Lwaitpsw:
548282cd64SVasily Gorbik	.long	0x020a0000,0x80000000+.Lioint
558282cd64SVasily Gorbik
568282cd64SVasily Gorbik#
578282cd64SVasily Gorbik# subroutine for loading cards from the reader
588282cd64SVasily Gorbik#
598282cd64SVasily Gorbik.Lloader:
608282cd64SVasily Gorbik	la	%r4,0(%r14)
618282cd64SVasily Gorbik	la	%r3,.Lorb		# r2 = address of orb into r2
628282cd64SVasily Gorbik	la	%r5,.Lirb		# r4 = address of irb
638282cd64SVasily Gorbik	la	%r6,.Lccws
648282cd64SVasily Gorbik	la	%r7,20
658282cd64SVasily Gorbik.Linit:
668282cd64SVasily Gorbik	st	%r2,4(%r6)		# initialize CCW data addresses
678282cd64SVasily Gorbik	la	%r2,0x50(%r2)
688282cd64SVasily Gorbik	la	%r6,8(%r6)
698282cd64SVasily Gorbik	bct	7,.Linit
708282cd64SVasily Gorbik
718282cd64SVasily Gorbik	lctl	%c6,%c6,.Lcr6		# set IO subclass mask
728282cd64SVasily Gorbik	slr	%r2,%r2
738282cd64SVasily Gorbik.Lldlp:
748282cd64SVasily Gorbik	ssch	0(%r3)			# load chunk of 1600 bytes
758282cd64SVasily Gorbik	bnz	.Llderr
768282cd64SVasily Gorbik.Lwait4irq:
778282cd64SVasily Gorbik	bas	%r14,.Lirqwait
788282cd64SVasily Gorbik	c	%r1,__LC_SUBCHANNEL_ID	# compare subchannel number
798282cd64SVasily Gorbik	bne	.Lwait4irq
808282cd64SVasily Gorbik	tsch	0(%r5)
818282cd64SVasily Gorbik
828282cd64SVasily Gorbik	slr	%r0,%r0
838282cd64SVasily Gorbik	ic	%r0,8(%r5)		# get device status
848282cd64SVasily Gorbik	chi	%r0,8			# channel end ?
858282cd64SVasily Gorbik	be	.Lcont
868282cd64SVasily Gorbik	chi	%r0,12			# channel end + device end ?
878282cd64SVasily Gorbik	be	.Lcont
888282cd64SVasily Gorbik
898282cd64SVasily Gorbik	l	%r0,4(%r5)
908282cd64SVasily Gorbik	s	%r0,8(%r3)		# r0/8 = number of ccws executed
918282cd64SVasily Gorbik	mhi	%r0,10			# *10 = number of bytes in ccws
928282cd64SVasily Gorbik	lh	%r3,10(%r5)		# get residual count
938282cd64SVasily Gorbik	sr	%r0,%r3 		# #ccws*80-residual=#bytes read
948282cd64SVasily Gorbik	ar	%r2,%r0
958282cd64SVasily Gorbik
968282cd64SVasily Gorbik	br	%r4			# r2 contains the total size
978282cd64SVasily Gorbik
988282cd64SVasily Gorbik.Lcont:
998282cd64SVasily Gorbik	ahi	%r2,0x640		# add 0x640 to total size
1008282cd64SVasily Gorbik	la	%r6,.Lccws
1018282cd64SVasily Gorbik	la	%r7,20
1028282cd64SVasily Gorbik.Lincr:
1038282cd64SVasily Gorbik	l	%r0,4(%r6)		# update CCW data addresses
1048282cd64SVasily Gorbik	ahi	%r0,0x640
1058282cd64SVasily Gorbik	st	%r0,4(%r6)
1068282cd64SVasily Gorbik	ahi	%r6,8
1078282cd64SVasily Gorbik	bct	7,.Lincr
1088282cd64SVasily Gorbik
1098282cd64SVasily Gorbik	b	.Lldlp
1108282cd64SVasily Gorbik.Llderr:
1118282cd64SVasily Gorbik	lpsw	.Lcrash
1128282cd64SVasily Gorbik
1138282cd64SVasily Gorbik	.align	8
1148282cd64SVasily Gorbik.Lorb:	.long	0x00000000,0x0080ff00,.Lccws
1158282cd64SVasily Gorbik.Lirb:	.long	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1168282cd64SVasily Gorbik.Lcr6:	.long	0xff000000
1178282cd64SVasily Gorbik.Lloadp:.long	0,0
1188282cd64SVasily Gorbik	.align	8
1198282cd64SVasily Gorbik.Lcrash:.long	0x000a0000,0x00000000
1208282cd64SVasily Gorbik
1218282cd64SVasily Gorbik	.align	8
1228282cd64SVasily Gorbik.Lccws: .rept	19
1238282cd64SVasily Gorbik	.long	0x02600050,0x00000000
1248282cd64SVasily Gorbik	.endr
1258282cd64SVasily Gorbik	.long	0x02200050,0x00000000
1268282cd64SVasily Gorbik
12773475797SHeiko Carstens.Liplcont:
1288282cd64SVasily Gorbik	mvi	__LC_AR_MODE_ID,1	# set esame flag
1298282cd64SVasily Gorbik	slr	%r0,%r0			# set cpuid to zero
1308282cd64SVasily Gorbik	lhi	%r1,2			# mode 2 = esame (dump)
1318282cd64SVasily Gorbik	sigp	%r1,%r0,0x12		# switch to esame mode
1328282cd64SVasily Gorbik	bras	%r13,0f
1338282cd64SVasily Gorbik	.fill	16,4,0x0
1348282cd64SVasily Gorbik0:	lmh	%r0,%r15,0(%r13)	# clear high-order half of gprs
1358282cd64SVasily Gorbik	sam31				# switch to 31 bit addressing mode
1368282cd64SVasily Gorbik	lh	%r1,__LC_SUBCHANNEL_ID	# test if subchannel number
1378282cd64SVasily Gorbik	bct	%r1,.Lnoload		#  is valid
1388282cd64SVasily Gorbik	l	%r1,__LC_SUBCHANNEL_ID	# load ipl subchannel number
1398282cd64SVasily Gorbik	la	%r2,IPL_BS		# load start address
1408282cd64SVasily Gorbik	bas	%r14,.Lloader		# load rest of ipl image
1418282cd64SVasily Gorbik	l	%r12,.Lparm		# pointer to parameter area
1428282cd64SVasily Gorbik	st	%r1,IPL_DEVICE+ARCH_OFFSET-PARMAREA(%r12) # save ipl device number
1438282cd64SVasily Gorbik
1448282cd64SVasily Gorbik#
1458282cd64SVasily Gorbik# load parameter file from ipl device
1468282cd64SVasily Gorbik#
1478282cd64SVasily Gorbik.Lagain1:
1488282cd64SVasily Gorbik	l	%r2,.Linitrd		# ramdisk loc. is temp
1498282cd64SVasily Gorbik	bas	%r14,.Lloader		# load parameter file
1508282cd64SVasily Gorbik	ltr	%r2,%r2 		# got anything ?
1518282cd64SVasily Gorbik	bz	.Lnopf
1525ecb2da6SSven Schnelle	l	%r3,MAX_COMMAND_LINE_SIZE+ARCH_OFFSET-PARMAREA(%r12)
1535ecb2da6SSven Schnelle	ahi	%r3,-1
1545ecb2da6SSven Schnelle	clr	%r2,%r3
1555ecb2da6SSven Schnelle	bl	.Lnotrunc
1565ecb2da6SSven Schnelle	lr	%r2,%r3
1578282cd64SVasily Gorbik.Lnotrunc:
1588282cd64SVasily Gorbik	l	%r4,.Linitrd
159*e9953b72SHeiko Carstens	larl	%r13,.L_hdr
160*e9953b72SHeiko Carstens	clc	0(3,%r4),0(%r13)	# if it is HDRx
1618282cd64SVasily Gorbik	bz	.Lagain1		# skip dataset header
162*e9953b72SHeiko Carstens	larl	%r13,.L_eof
163*e9953b72SHeiko Carstens	clc	0(3,%r4),0(%r13)	# if it is EOFx
1648282cd64SVasily Gorbik	bz	.Lagain1		# skip dateset trailer
1655ecb2da6SSven Schnelle
1665ecb2da6SSven Schnelle	lr	%r5,%r2
1675ecb2da6SSven Schnelle	la	%r6,COMMAND_LINE-PARMAREA(%r12)
1685ecb2da6SSven Schnelle	lr	%r7,%r2
1695ecb2da6SSven Schnelle	ahi	%r7,1
1705ecb2da6SSven Schnelle	mvcl	%r6,%r4
1718282cd64SVasily Gorbik.Lnopf:
1728282cd64SVasily Gorbik
1738282cd64SVasily Gorbik#
1748282cd64SVasily Gorbik# load ramdisk from ipl device
1758282cd64SVasily Gorbik#
1768282cd64SVasily Gorbik.Lagain2:
1778282cd64SVasily Gorbik	l	%r2,.Linitrd		# addr of ramdisk
1788282cd64SVasily Gorbik	st	%r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)
1798282cd64SVasily Gorbik	bas	%r14,.Lloader		# load ramdisk
1808282cd64SVasily Gorbik	st	%r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12) # store size of rd
1818282cd64SVasily Gorbik	ltr	%r2,%r2
1828282cd64SVasily Gorbik	bnz	.Lrdcont
1838282cd64SVasily Gorbik	st	%r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found
1848282cd64SVasily Gorbik.Lrdcont:
1858282cd64SVasily Gorbik	l	%r2,.Linitrd
1868282cd64SVasily Gorbik
187*e9953b72SHeiko Carstens	larl	%r13,.L_hdr		# skip HDRx and EOFx
188*e9953b72SHeiko Carstens	clc	0(3,%r2),0(%r13)
1898282cd64SVasily Gorbik	bz	.Lagain2
190*e9953b72SHeiko Carstens	larl	%r13,.L_eof
191*e9953b72SHeiko Carstens	clc	0(3,%r2),0(%r13)
1928282cd64SVasily Gorbik	bz	.Lagain2
1938282cd64SVasily Gorbik
1948282cd64SVasily Gorbik#
1958282cd64SVasily Gorbik# reset files in VM reader
1968282cd64SVasily Gorbik#
1978282cd64SVasily Gorbik	stidp	.Lcpuid			# store cpuid
1988282cd64SVasily Gorbik	tm	.Lcpuid,0xff		# running VM ?
1998282cd64SVasily Gorbik	bno	.Lnoreset
2008282cd64SVasily Gorbik	la	%r2,.Lreset
2018282cd64SVasily Gorbik	lhi	%r3,26
2028282cd64SVasily Gorbik	diag	%r2,%r3,8
2038282cd64SVasily Gorbik	la	%r5,.Lirb
2048282cd64SVasily Gorbik	stsch	0(%r5)			# check if irq is pending
2058282cd64SVasily Gorbik	tm	30(%r5),0x0f		# by verifying if any of the
2068282cd64SVasily Gorbik	bnz	.Lwaitforirq		# activity or status control
2078282cd64SVasily Gorbik	tm	31(%r5),0xff		# bits is set in the schib
2088282cd64SVasily Gorbik	bz	.Lnoreset
2098282cd64SVasily Gorbik.Lwaitforirq:
2108282cd64SVasily Gorbik	bas	%r14,.Lirqwait		# wait for IO interrupt
2118282cd64SVasily Gorbik	c	%r1,__LC_SUBCHANNEL_ID	# compare subchannel number
2128282cd64SVasily Gorbik	bne	.Lwaitforirq
2138282cd64SVasily Gorbik	la	%r5,.Lirb
2148282cd64SVasily Gorbik	tsch	0(%r5)
2158282cd64SVasily Gorbik.Lnoreset:
2168282cd64SVasily Gorbik	b	.Lnoload
2178282cd64SVasily Gorbik
2188282cd64SVasily Gorbik#
2198282cd64SVasily Gorbik# everything loaded, go for it
2208282cd64SVasily Gorbik#
2218282cd64SVasily Gorbik.Lnoload:
2228282cd64SVasily Gorbik	l	%r1,.Lstartup
2238282cd64SVasily Gorbik	br	%r1
2248282cd64SVasily Gorbik
2258282cd64SVasily Gorbik.Linitrd:.long _end			# default address of initrd
2268282cd64SVasily Gorbik.Lparm:	.long  PARMAREA
2278282cd64SVasily Gorbik.Lstartup: .long startup
2288282cd64SVasily Gorbik.Lreset:.byte	0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40
2298282cd64SVasily Gorbik	.byte	0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6
2308282cd64SVasily Gorbik	.byte	0xc8,0xd6,0xd3,0xc4	# "change rdr all keep nohold"
2318282cd64SVasily Gorbik.L_eof: .long	0xc5d6c600	 /* C'EOF' */
2328282cd64SVasily Gorbik.L_hdr: .long	0xc8c4d900	 /* C'HDR' */
2338282cd64SVasily Gorbik	.align	8
2348282cd64SVasily Gorbik.Lcpuid:.fill	8,1,0
2358282cd64SVasily Gorbik
2368282cd64SVasily Gorbik#
2378b6bd6f2SAlexander Egorenkov# normal startup-code, running in absolute addressing mode
2388282cd64SVasily Gorbik# this is called either by the ipl loader or directly by PSW restart
2398282cd64SVasily Gorbik# or linload or SALIPL
2408282cd64SVasily Gorbik#
241834979c2SHeiko Carstens	.org	STARTUP_NORMAL_OFFSET - IPL_START
242ec55d1e1SVasily GorbikSYM_CODE_START(startup)
243ec55d1e1SVasily Gorbik	j	startup_normal
244834979c2SHeiko Carstens	.org	EP_OFFSET - IPL_START
2458282cd64SVasily Gorbik#
2468282cd64SVasily Gorbik# This is a list of s390 kernel entry points. At address 0x1000f the number of
2478282cd64SVasily Gorbik# valid entry points is stored.
2488282cd64SVasily Gorbik#
2498282cd64SVasily Gorbik# IMPORTANT: Do not change this table, it is s390 kernel ABI!
2508282cd64SVasily Gorbik#
251627c9b62SVasily Gorbik	.ascii	EP_STRING
2528282cd64SVasily Gorbik	.byte	0x00,0x01
2538282cd64SVasily Gorbik#
2548b6bd6f2SAlexander Egorenkov# kdump startup-code, running in 64 bit absolute addressing mode
2558282cd64SVasily Gorbik#
256834979c2SHeiko Carstens	.org	STARTUP_KDUMP_OFFSET - IPL_START
257ec55d1e1SVasily Gorbik	j	startup_kdump
258ec55d1e1SVasily GorbikSYM_CODE_END(startup)
259ec55d1e1SVasily GorbikSYM_CODE_START_LOCAL(startup_normal)
2608282cd64SVasily Gorbik	mvi	__LC_AR_MODE_ID,1	# set esame flag
2618282cd64SVasily Gorbik	slr	%r0,%r0 		# set cpuid to zero
2628282cd64SVasily Gorbik	lhi	%r1,2			# mode 2 = esame (dump)
2638282cd64SVasily Gorbik	sigp	%r1,%r0,0x12		# switch to esame mode
2648282cd64SVasily Gorbik	bras	%r13,0f
2658282cd64SVasily Gorbik	.fill	16,4,0x0
2668282cd64SVasily Gorbik0:	lmh	%r0,%r15,0(%r13)	# clear high-order half of gprs
2678282cd64SVasily Gorbik	sam64				# switch to 64 bit addressing mode
268*e9953b72SHeiko Carstens	larl	%r13,.Lext_new_psw
269*e9953b72SHeiko Carstens	mvc	__LC_EXT_NEW_PSW(16),0(%r13)
270*e9953b72SHeiko Carstens	larl	%r13,.Lpgm_new_psw
271*e9953b72SHeiko Carstens	mvc	__LC_PGM_NEW_PSW(16),0(%r13)
272*e9953b72SHeiko Carstens	larl	%r13,.Lio_new_psw
273*e9953b72SHeiko Carstens	mvc	__LC_IO_NEW_PSW(16),0(%r13)
2748282cd64SVasily Gorbik	xc	0x200(256),0x200	# partially clear lowcore
2758282cd64SVasily Gorbik	xc	0x300(256),0x300
2768282cd64SVasily Gorbik	xc	0xe00(256),0xe00
2778282cd64SVasily Gorbik	xc	0xf00(256),0xf00
278*e9953b72SHeiko Carstens	larl	%r13,.Lctl
279*e9953b72SHeiko Carstens	lctlg	%c0,%c15,0(%r13)	# load control registers
2808282cd64SVasily Gorbik	stcke	__LC_BOOT_CLOCK
2818282cd64SVasily Gorbik	mvc	__LC_LAST_UPDATE_CLOCK(8),__LC_BOOT_CLOCK+1
282*e9953b72SHeiko Carstens	larl	%r13,6f
283*e9953b72SHeiko Carstens	spt	0(%r13)
284*e9953b72SHeiko Carstens	mvc	__LC_LAST_UPDATE_TIMER(8),0(%r13)
285256d78d0SAlexander Egorenkov	larl	%r15,_stack_end-STACK_FRAME_OVERHEAD
286f1d3c532SAlexander Egorenkov	brasl	%r14,sclp_early_setup_buffer
2878282cd64SVasily Gorbik	brasl	%r14,verify_facilities
2888f75582aSVasily Gorbik	brasl	%r14,startup_kernel
289ec55d1e1SVasily GorbikSYM_CODE_END(startup_normal)
2908282cd64SVasily Gorbik
2918282cd64SVasily Gorbik	.align	8
2928282cd64SVasily Gorbik6:	.long	0x7fffffff,0xffffffff
29313b5bd8aSVasily Gorbik.Lext_new_psw:
29413b5bd8aSVasily Gorbik	.quad	0x0002000180000000,0x1b0	# disabled wait
29513b5bd8aSVasily Gorbik.Lpgm_new_psw:
29613b5bd8aSVasily Gorbik	.quad	0x0000000180000000,startup_pgm_check_handler
29713b5bd8aSVasily Gorbik.Lio_new_psw:
29813b5bd8aSVasily Gorbik	.quad	0x0002000180000000,0x1f0	# disabled wait
299584315edSAlexander Gordeev.Lctl:	.quad	0x04040000		# cr0: AFP registers & secondary space
300584315edSAlexander Gordeev	.quad	0			# cr1: primary space segment table
301584315edSAlexander Gordeev	.quad	0			# cr2: dispatchable unit control table
302584315edSAlexander Gordeev	.quad	0			# cr3: instruction authorization
303584315edSAlexander Gordeev	.quad	0xffff			# cr4: instruction authorization
304584315edSAlexander Gordeev	.quad	0			# cr5: primary-aste origin
305584315edSAlexander Gordeev	.quad	0			# cr6:	I/O interrupts
306584315edSAlexander Gordeev	.quad	0			# cr7:	secondary space segment table
307584315edSAlexander Gordeev	.quad	0x0000000000008000	# cr8:	access registers translation
308584315edSAlexander Gordeev	.quad	0			# cr9:	tracing off
309584315edSAlexander Gordeev	.quad	0			# cr10: tracing off
310584315edSAlexander Gordeev	.quad	0			# cr11: tracing off
311584315edSAlexander Gordeev	.quad	0			# cr12: tracing off
312584315edSAlexander Gordeev	.quad	0			# cr13: home space segment table
313584315edSAlexander Gordeev	.quad	0xc0000000		# cr14: machine check handling off
314584315edSAlexander Gordeev	.quad	0			# cr15: linkage stack operations
315a80313ffSGerald Schaefer
3168282cd64SVasily Gorbik#include "head_kdump.S"
3178282cd64SVasily Gorbik
3188282cd64SVasily Gorbik#
319da9ed30dSVasily Gorbik# This program check is active immediately after kernel start
320da9ed30dSVasily Gorbik# and until early_pgm_check_handler is set in kernel/early.c
321da9ed30dSVasily Gorbik# It simply saves general/control registers and psw in
322da9ed30dSVasily Gorbik# the save area and does disabled wait with a faulty address.
323da9ed30dSVasily Gorbik#
324ec55d1e1SVasily GorbikSYM_CODE_START_LOCAL(startup_pgm_check_handler)
3252835c2eaSVasily Gorbik	stmg	%r8,%r15,__LC_SAVE_AREA_SYNC
3262835c2eaSVasily Gorbik	la	%r8,4095
3272835c2eaSVasily Gorbik	stctg	%c0,%c15,__LC_CREGS_SAVE_AREA-4095(%r8)
3282835c2eaSVasily Gorbik	stmg	%r0,%r7,__LC_GPREGS_SAVE_AREA-4095(%r8)
3292835c2eaSVasily Gorbik	mvc	__LC_GPREGS_SAVE_AREA-4095+64(64,%r8),__LC_SAVE_AREA_SYNC
3302835c2eaSVasily Gorbik	mvc	__LC_PSW_SAVE_AREA-4095(16,%r8),__LC_PGM_OLD_PSW
331da9ed30dSVasily Gorbik	mvc	__LC_RETURN_PSW(16),__LC_PGM_OLD_PSW
332da9ed30dSVasily Gorbik	ni	__LC_RETURN_PSW,0xfc	# remove IO and EX bits
333da9ed30dSVasily Gorbik	ni	__LC_RETURN_PSW+1,0xfb	# remove MCHK bit
334da9ed30dSVasily Gorbik	oi	__LC_RETURN_PSW+1,0x2	# set wait state bit
3352835c2eaSVasily Gorbik	larl	%r9,.Lold_psw_disabled_wait
3362835c2eaSVasily Gorbik	stg	%r9,__LC_PGM_NEW_PSW+8
337256d78d0SAlexander Egorenkov	larl	%r15,_dump_info_stack_end-STACK_FRAME_OVERHEAD
338724dc336SVasily Gorbik	brasl	%r14,print_pgm_check_info
339724dc336SVasily Gorbik.Lold_psw_disabled_wait:
3402835c2eaSVasily Gorbik	la	%r8,4095
3412835c2eaSVasily Gorbik	lmg	%r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r8)
342da9ed30dSVasily Gorbik	lpswe	__LC_RETURN_PSW		# disabled wait
343ec55d1e1SVasily GorbikSYM_CODE_END(startup_pgm_check_handler)
344