162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright IBM Corp. 1999, 2010
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *    Author(s): Hartmut Penner <hp@de.ibm.com>
662306a36Sopenharmony_ci *		 Martin Schwidefsky <schwidefsky@de.ibm.com>
762306a36Sopenharmony_ci *		 Rob van der Heij <rvdhei@iae.nl>
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * There are 5 different IPL methods
1062306a36Sopenharmony_ci *  1) load the image directly into ram at address 0 and do an PSW restart
1162306a36Sopenharmony_ci *  2) linload will load the image from address 0x10000 to memory 0x10000
1262306a36Sopenharmony_ci *     and start the code thru LPSW 0x0008000080010000 (VM only, deprecated)
1362306a36Sopenharmony_ci *  3) generate the tape ipl header, store the generated image on a tape
1462306a36Sopenharmony_ci *     and ipl from it
1562306a36Sopenharmony_ci *     In case of SL tape you need to IPL 5 times to get past VOL1 etc
1662306a36Sopenharmony_ci *  4) generate the vm reader ipl header, move the generated image to the
1762306a36Sopenharmony_ci *     VM reader (use option NOH!) and do a ipl from reader (VM only)
1862306a36Sopenharmony_ci *  5) direct call of start by the SALIPL loader
1962306a36Sopenharmony_ci *  We use the cpuid to distinguish between VM and native ipl
2062306a36Sopenharmony_ci *  params for kernel are pushed to 0x10400 (see setup.h)
2162306a36Sopenharmony_ci *
2262306a36Sopenharmony_ci */
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#include <linux/init.h>
2562306a36Sopenharmony_ci#include <linux/linkage.h>
2662306a36Sopenharmony_ci#include <asm/asm-offsets.h>
2762306a36Sopenharmony_ci#include <asm/page.h>
2862306a36Sopenharmony_ci#include <asm/ptrace.h>
2962306a36Sopenharmony_ci#include <asm/sclp.h>
3062306a36Sopenharmony_ci#include "boot.h"
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#define EP_OFFSET	0x10008
3362306a36Sopenharmony_ci#define EP_STRING	"S390EP"
3462306a36Sopenharmony_ci#define IPL_BS		0x730
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci__HEAD
3762306a36Sopenharmony_ciipl_start:
3862306a36Sopenharmony_ci	mvi	__LC_AR_MODE_ID,1	# set esame flag
3962306a36Sopenharmony_ci	slr	%r0,%r0			# set cpuid to zero
4062306a36Sopenharmony_ci	lhi	%r1,2			# mode 2 = esame (dump)
4162306a36Sopenharmony_ci	sigp	%r1,%r0,0x12		# switch to esame mode
4262306a36Sopenharmony_ci	sam64				# switch to 64 bit addressing mode
4362306a36Sopenharmony_ci	lgh	%r1,__LC_SUBCHANNEL_ID	# test if subchannel number
4462306a36Sopenharmony_ci	brctg	%r1,.Lnoload		#  is valid
4562306a36Sopenharmony_ci	llgf	%r1,__LC_SUBCHANNEL_ID	# load ipl subchannel number
4662306a36Sopenharmony_ci	lghi	%r2,IPL_BS		# load start address
4762306a36Sopenharmony_ci	bras	%r14,.Lloader		# load rest of ipl image
4862306a36Sopenharmony_ci	larl	%r12,parmarea		# pointer to parameter area
4962306a36Sopenharmony_ci	stg	%r1,IPL_DEVICE-PARMAREA(%r12) # save ipl device number
5062306a36Sopenharmony_ci#
5162306a36Sopenharmony_ci# load parameter file from ipl device
5262306a36Sopenharmony_ci#
5362306a36Sopenharmony_ci.Lagain1:
5462306a36Sopenharmony_ci	larl	%r2,_end		# ramdisk loc. is temp
5562306a36Sopenharmony_ci	bras	%r14,.Lloader		# load parameter file
5662306a36Sopenharmony_ci	ltgr	%r2,%r2			# got anything ?
5762306a36Sopenharmony_ci	jz	.Lnopf
5862306a36Sopenharmony_ci	lg	%r3,MAX_COMMAND_LINE_SIZE-PARMAREA(%r12)
5962306a36Sopenharmony_ci	aghi	%r3,-1
6062306a36Sopenharmony_ci	clgr	%r2,%r3
6162306a36Sopenharmony_ci	jl	.Lnotrunc
6262306a36Sopenharmony_ci	lgr	%r2,%r3
6362306a36Sopenharmony_ci.Lnotrunc:
6462306a36Sopenharmony_ci	larl	%r4,_end
6562306a36Sopenharmony_ci	larl	%r13,.L_hdr
6662306a36Sopenharmony_ci	clc	0(3,%r4),0(%r13)	# if it is HDRx
6762306a36Sopenharmony_ci	jz	.Lagain1		# skip dataset header
6862306a36Sopenharmony_ci	larl	%r13,.L_eof
6962306a36Sopenharmony_ci	clc	0(3,%r4),0(%r13)	# if it is EOFx
7062306a36Sopenharmony_ci	jz	.Lagain1		# skip data set trailer
7162306a36Sopenharmony_ci	lgr	%r5,%r2
7262306a36Sopenharmony_ci	la	%r6,COMMAND_LINE-PARMAREA(%r12)
7362306a36Sopenharmony_ci	lgr	%r7,%r2
7462306a36Sopenharmony_ci	aghi	%r7,1
7562306a36Sopenharmony_ci	mvcl	%r6,%r4
7662306a36Sopenharmony_ci.Lnopf:
7762306a36Sopenharmony_ci#
7862306a36Sopenharmony_ci# load ramdisk from ipl device
7962306a36Sopenharmony_ci#
8062306a36Sopenharmony_ci.Lagain2:
8162306a36Sopenharmony_ci	larl	%r2,_end		# addr of ramdisk
8262306a36Sopenharmony_ci	stg	%r2,INITRD_START-PARMAREA(%r12)
8362306a36Sopenharmony_ci	bras	%r14,.Lloader		# load ramdisk
8462306a36Sopenharmony_ci	stg	%r2,INITRD_SIZE-PARMAREA(%r12) # store size of rd
8562306a36Sopenharmony_ci	ltgr	%r2,%r2
8662306a36Sopenharmony_ci	jnz	.Lrdcont
8762306a36Sopenharmony_ci	stg	%r2,INITRD_START-PARMAREA(%r12) # no ramdisk found
8862306a36Sopenharmony_ci.Lrdcont:
8962306a36Sopenharmony_ci	larl	%r2,_end
9062306a36Sopenharmony_ci	larl	%r13,.L_hdr		# skip HDRx and EOFx
9162306a36Sopenharmony_ci	clc	0(3,%r2),0(%r13)
9262306a36Sopenharmony_ci	jz	.Lagain2
9362306a36Sopenharmony_ci	larl	%r13,.L_eof
9462306a36Sopenharmony_ci	clc	0(3,%r2),0(%r13)
9562306a36Sopenharmony_ci	jz	.Lagain2
9662306a36Sopenharmony_ci#
9762306a36Sopenharmony_ci# reset files in VM reader
9862306a36Sopenharmony_ci#
9962306a36Sopenharmony_ci	larl	%r13,.Lcpuid
10062306a36Sopenharmony_ci	stidp	0(%r13)			# store cpuid
10162306a36Sopenharmony_ci	tm	0(%r13),0xff		# running VM ?
10262306a36Sopenharmony_ci	jno	.Lnoreset
10362306a36Sopenharmony_ci	larl	%r2,.Lreset
10462306a36Sopenharmony_ci	lghi	%r3,26
10562306a36Sopenharmony_ci	diag	%r2,%r3,8
10662306a36Sopenharmony_ci	larl	%r5,.Lirb
10762306a36Sopenharmony_ci	stsch	0(%r5)			# check if irq is pending
10862306a36Sopenharmony_ci	tm	30(%r5),0x0f		# by verifying if any of the
10962306a36Sopenharmony_ci	jnz	.Lwaitforirq		# activity or status control
11062306a36Sopenharmony_ci	tm	31(%r5),0xff		# bits is set in the schib
11162306a36Sopenharmony_ci	jz	.Lnoreset
11262306a36Sopenharmony_ci.Lwaitforirq:
11362306a36Sopenharmony_ci	bras	%r14,.Lirqwait		# wait for IO interrupt
11462306a36Sopenharmony_ci	c	%r1,__LC_SUBCHANNEL_ID	# compare subchannel number
11562306a36Sopenharmony_ci	jne	.Lwaitforirq
11662306a36Sopenharmony_ci	larl	%r5,.Lirb
11762306a36Sopenharmony_ci	tsch	0(%r5)
11862306a36Sopenharmony_ci.Lnoreset:
11962306a36Sopenharmony_ci	j	.Lnoload
12062306a36Sopenharmony_ci#
12162306a36Sopenharmony_ci# everything loaded, go for it
12262306a36Sopenharmony_ci#
12362306a36Sopenharmony_ci.Lnoload:
12462306a36Sopenharmony_ci	jg	startup
12562306a36Sopenharmony_ci#
12662306a36Sopenharmony_ci# subroutine to wait for end I/O
12762306a36Sopenharmony_ci#
12862306a36Sopenharmony_ci.Lirqwait:
12962306a36Sopenharmony_ci	larl	%r13,.Lnewpswmask	# set up IO interrupt psw
13062306a36Sopenharmony_ci	mvc	__LC_IO_NEW_PSW(8),0(%r13)
13162306a36Sopenharmony_ci	stg	%r14,__LC_IO_NEW_PSW+8
13262306a36Sopenharmony_ci	larl	%r13,.Lwaitpsw
13362306a36Sopenharmony_ci	lpswe	0(%r13)
13462306a36Sopenharmony_ci.Lioint:
13562306a36Sopenharmony_ci#
13662306a36Sopenharmony_ci# subroutine for loading cards from the reader
13762306a36Sopenharmony_ci#
13862306a36Sopenharmony_ci.Lloader:
13962306a36Sopenharmony_ci	lgr	%r4,%r14
14062306a36Sopenharmony_ci	larl	%r3,.Lorb		# r2 = address of orb into r2
14162306a36Sopenharmony_ci	larl	%r5,.Lirb		# r4 = address of irb
14262306a36Sopenharmony_ci	larl	%r6,.Lccws
14362306a36Sopenharmony_ci	lghi	%r7,20
14462306a36Sopenharmony_ci.Linit:
14562306a36Sopenharmony_ci	st	%r2,4(%r6)		# initialize CCW data addresses
14662306a36Sopenharmony_ci	la	%r2,0x50(%r2)
14762306a36Sopenharmony_ci	la	%r6,8(%r6)
14862306a36Sopenharmony_ci	brctg	%r7,.Linit
14962306a36Sopenharmony_ci	larl	%r13,.Lcr6
15062306a36Sopenharmony_ci	lctlg	%c6,%c6,0(%r13)
15162306a36Sopenharmony_ci	xgr	%r2,%r2
15262306a36Sopenharmony_ci.Lldlp:
15362306a36Sopenharmony_ci	ssch	0(%r3)			# load chunk of 1600 bytes
15462306a36Sopenharmony_ci	jnz	.Llderr
15562306a36Sopenharmony_ci.Lwait4irq:
15662306a36Sopenharmony_ci	bras	%r14,.Lirqwait
15762306a36Sopenharmony_ci	c	%r1,__LC_SUBCHANNEL_ID	# compare subchannel number
15862306a36Sopenharmony_ci	jne	.Lwait4irq
15962306a36Sopenharmony_ci	tsch	0(%r5)
16062306a36Sopenharmony_ci	xgr	%r0,%r0
16162306a36Sopenharmony_ci	ic	%r0,8(%r5)		# get device status
16262306a36Sopenharmony_ci	cghi	%r0,8			# channel end ?
16362306a36Sopenharmony_ci	je	.Lcont
16462306a36Sopenharmony_ci	cghi	%r0,12			# channel end + device end ?
16562306a36Sopenharmony_ci	je	.Lcont
16662306a36Sopenharmony_ci	llgf	%r0,4(%r5)
16762306a36Sopenharmony_ci	sgf	%r0,8(%r3)		# r0/8 = number of ccws executed
16862306a36Sopenharmony_ci	mghi	%r0,10			# *10 = number of bytes in ccws
16962306a36Sopenharmony_ci	llgh	%r3,10(%r5)		# get residual count
17062306a36Sopenharmony_ci	sgr	%r0,%r3			# #ccws*80-residual=#bytes read
17162306a36Sopenharmony_ci	agr	%r2,%r0
17262306a36Sopenharmony_ci	br	%r4			# r2 contains the total size
17362306a36Sopenharmony_ci.Lcont:
17462306a36Sopenharmony_ci	aghi	%r2,0x640		# add 0x640 to total size
17562306a36Sopenharmony_ci	larl	%r6,.Lccws
17662306a36Sopenharmony_ci	lghi	%r7,20
17762306a36Sopenharmony_ci.Lincr:
17862306a36Sopenharmony_ci	l	%r0,4(%r6)		# update CCW data addresses
17962306a36Sopenharmony_ci	aghi	%r0,0x640
18062306a36Sopenharmony_ci	st	%r0,4(%r6)
18162306a36Sopenharmony_ci	aghi	%r6,8
18262306a36Sopenharmony_ci	brctg	%r7,.Lincr
18362306a36Sopenharmony_ci	j	.Lldlp
18462306a36Sopenharmony_ci.Llderr:
18562306a36Sopenharmony_ci	larl	%r13,.Lcrash
18662306a36Sopenharmony_ci	lpsw	0(%r13)
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_ci	.balign	8
18962306a36Sopenharmony_ci.Lwaitpsw:
19062306a36Sopenharmony_ci	.quad	0x0202000180000000,.Lioint
19162306a36Sopenharmony_ci.Lnewpswmask:
19262306a36Sopenharmony_ci	.quad	0x0000000180000000
19362306a36Sopenharmony_ci	.balign	8
19462306a36Sopenharmony_ci.Lorb:	.long	0x00000000,0x0080ff00,.Lccws
19562306a36Sopenharmony_ci.Lirb:	.long	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
19662306a36Sopenharmony_ci	.balign	8
19762306a36Sopenharmony_ci.Lcr6:	.quad	0x00000000ff000000
19862306a36Sopenharmony_ci	.balign	8
19962306a36Sopenharmony_ci.Lcrash:.long	0x000a0000,0x00000000
20062306a36Sopenharmony_ci	.balign	8
20162306a36Sopenharmony_ci.Lccws: .rept	19
20262306a36Sopenharmony_ci	.long	0x02600050,0x00000000
20362306a36Sopenharmony_ci	.endr
20462306a36Sopenharmony_ci	.long	0x02200050,0x00000000
20562306a36Sopenharmony_ci.Lreset:.byte	0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40
20662306a36Sopenharmony_ci	.byte	0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6
20762306a36Sopenharmony_ci	.byte	0xc8,0xd6,0xd3,0xc4	# "change rdr all keep nohold"
20862306a36Sopenharmony_ci.L_eof: .long	0xc5d6c600	 /* C'EOF' */
20962306a36Sopenharmony_ci.L_hdr: .long	0xc8c4d900	 /* C'HDR' */
21062306a36Sopenharmony_ci	.balign	8
21162306a36Sopenharmony_ci.Lcpuid:.fill	8,1,0
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci#
21462306a36Sopenharmony_ci# normal startup-code, running in absolute addressing mode
21562306a36Sopenharmony_ci# this is called either by the ipl loader or directly by PSW restart
21662306a36Sopenharmony_ci# or linload or SALIPL
21762306a36Sopenharmony_ci#
21862306a36Sopenharmony_ci	.org	STARTUP_NORMAL_OFFSET - IPL_START
21962306a36Sopenharmony_ciSYM_CODE_START(startup)
22062306a36Sopenharmony_ci	j	startup_normal
22162306a36Sopenharmony_ci	.org	EP_OFFSET - IPL_START
22262306a36Sopenharmony_ci#
22362306a36Sopenharmony_ci# This is a list of s390 kernel entry points. At address 0x1000f the number of
22462306a36Sopenharmony_ci# valid entry points is stored.
22562306a36Sopenharmony_ci#
22662306a36Sopenharmony_ci# IMPORTANT: Do not change this table, it is s390 kernel ABI!
22762306a36Sopenharmony_ci#
22862306a36Sopenharmony_ci	.ascii	EP_STRING
22962306a36Sopenharmony_ci	.byte	0x00,0x01
23062306a36Sopenharmony_ci#
23162306a36Sopenharmony_ci# kdump startup-code, running in 64 bit absolute addressing mode
23262306a36Sopenharmony_ci#
23362306a36Sopenharmony_ci	.org	STARTUP_KDUMP_OFFSET - IPL_START
23462306a36Sopenharmony_ci	j	startup_kdump
23562306a36Sopenharmony_ciSYM_CODE_END(startup)
23662306a36Sopenharmony_ciSYM_CODE_START_LOCAL(startup_normal)
23762306a36Sopenharmony_ci	mvi	__LC_AR_MODE_ID,1	# set esame flag
23862306a36Sopenharmony_ci	slr	%r0,%r0 		# set cpuid to zero
23962306a36Sopenharmony_ci	lhi	%r1,2			# mode 2 = esame (dump)
24062306a36Sopenharmony_ci	sigp	%r1,%r0,0x12		# switch to esame mode
24162306a36Sopenharmony_ci	bras	%r13,0f
24262306a36Sopenharmony_ci	.fill	16,4,0x0
24362306a36Sopenharmony_ci0:	lmh	%r0,%r15,0(%r13)	# clear high-order half of gprs
24462306a36Sopenharmony_ci	sam64				# switch to 64 bit addressing mode
24562306a36Sopenharmony_ci	larl	%r13,.Lext_new_psw
24662306a36Sopenharmony_ci	mvc	__LC_EXT_NEW_PSW(16),0(%r13)
24762306a36Sopenharmony_ci	larl	%r13,.Lpgm_new_psw
24862306a36Sopenharmony_ci	mvc	__LC_PGM_NEW_PSW(16),0(%r13)
24962306a36Sopenharmony_ci	larl	%r13,.Lio_new_psw
25062306a36Sopenharmony_ci	mvc	__LC_IO_NEW_PSW(16),0(%r13)
25162306a36Sopenharmony_ci	xc	0x200(256),0x200	# partially clear lowcore
25262306a36Sopenharmony_ci	xc	0x300(256),0x300
25362306a36Sopenharmony_ci	xc	0xe00(256),0xe00
25462306a36Sopenharmony_ci	xc	0xf00(256),0xf00
25562306a36Sopenharmony_ci	larl	%r13,.Lctl
25662306a36Sopenharmony_ci	lctlg	%c0,%c15,0(%r13)	# load control registers
25762306a36Sopenharmony_ci	stcke	__LC_BOOT_CLOCK
25862306a36Sopenharmony_ci	mvc	__LC_LAST_UPDATE_CLOCK(8),__LC_BOOT_CLOCK+1
25962306a36Sopenharmony_ci	larl	%r13,6f
26062306a36Sopenharmony_ci	spt	0(%r13)
26162306a36Sopenharmony_ci	mvc	__LC_LAST_UPDATE_TIMER(8),0(%r13)
26262306a36Sopenharmony_ci	larl	%r15,_stack_end-STACK_FRAME_OVERHEAD
26362306a36Sopenharmony_ci	brasl	%r14,sclp_early_setup_buffer
26462306a36Sopenharmony_ci	brasl	%r14,verify_facilities
26562306a36Sopenharmony_ci	brasl	%r14,startup_kernel
26662306a36Sopenharmony_ciSYM_CODE_END(startup_normal)
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci	.balign	8
26962306a36Sopenharmony_ci6:	.long	0x7fffffff,0xffffffff
27062306a36Sopenharmony_ci.Lext_new_psw:
27162306a36Sopenharmony_ci	.quad	0x0002000180000000,0x1b0	# disabled wait
27262306a36Sopenharmony_ci.Lpgm_new_psw:
27362306a36Sopenharmony_ci	.quad	0x0000000180000000,startup_pgm_check_handler
27462306a36Sopenharmony_ci.Lio_new_psw:
27562306a36Sopenharmony_ci	.quad	0x0002000180000000,0x1f0	# disabled wait
27662306a36Sopenharmony_ci.Lctl:	.quad	0x04040000		# cr0: AFP registers & secondary space
27762306a36Sopenharmony_ci	.quad	0			# cr1: primary space segment table
27862306a36Sopenharmony_ci	.quad	0			# cr2: dispatchable unit control table
27962306a36Sopenharmony_ci	.quad	0			# cr3: instruction authorization
28062306a36Sopenharmony_ci	.quad	0xffff			# cr4: instruction authorization
28162306a36Sopenharmony_ci	.quad	0			# cr5: primary-aste origin
28262306a36Sopenharmony_ci	.quad	0			# cr6:	I/O interrupts
28362306a36Sopenharmony_ci	.quad	0			# cr7:	secondary space segment table
28462306a36Sopenharmony_ci	.quad	0x0000000000008000	# cr8:	access registers translation
28562306a36Sopenharmony_ci	.quad	0			# cr9:	tracing off
28662306a36Sopenharmony_ci	.quad	0			# cr10: tracing off
28762306a36Sopenharmony_ci	.quad	0			# cr11: tracing off
28862306a36Sopenharmony_ci	.quad	0			# cr12: tracing off
28962306a36Sopenharmony_ci	.quad	0			# cr13: home space segment table
29062306a36Sopenharmony_ci	.quad	0xc0000000		# cr14: machine check handling off
29162306a36Sopenharmony_ci	.quad	0			# cr15: linkage stack operations
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_ci#include "head_kdump.S"
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci#
29662306a36Sopenharmony_ci# This program check is active immediately after kernel start
29762306a36Sopenharmony_ci# and until early_pgm_check_handler is set in kernel/early.c
29862306a36Sopenharmony_ci# It simply saves general/control registers and psw in
29962306a36Sopenharmony_ci# the save area and does disabled wait with a faulty address.
30062306a36Sopenharmony_ci#
30162306a36Sopenharmony_ciSYM_CODE_START_LOCAL(startup_pgm_check_handler)
30262306a36Sopenharmony_ci	stmg	%r8,%r15,__LC_SAVE_AREA_SYNC
30362306a36Sopenharmony_ci	la	%r8,4095
30462306a36Sopenharmony_ci	stctg	%c0,%c15,__LC_CREGS_SAVE_AREA-4095(%r8)
30562306a36Sopenharmony_ci	stmg	%r0,%r7,__LC_GPREGS_SAVE_AREA-4095(%r8)
30662306a36Sopenharmony_ci	mvc	__LC_GPREGS_SAVE_AREA-4095+64(64,%r8),__LC_SAVE_AREA_SYNC
30762306a36Sopenharmony_ci	mvc	__LC_PSW_SAVE_AREA-4095(16,%r8),__LC_PGM_OLD_PSW
30862306a36Sopenharmony_ci	mvc	__LC_RETURN_PSW(16),__LC_PGM_OLD_PSW
30962306a36Sopenharmony_ci	ni	__LC_RETURN_PSW,0xfc	# remove IO and EX bits
31062306a36Sopenharmony_ci	ni	__LC_RETURN_PSW+1,0xfb	# remove MCHK bit
31162306a36Sopenharmony_ci	oi	__LC_RETURN_PSW+1,0x2	# set wait state bit
31262306a36Sopenharmony_ci	larl	%r9,.Lold_psw_disabled_wait
31362306a36Sopenharmony_ci	stg	%r9,__LC_PGM_NEW_PSW+8
31462306a36Sopenharmony_ci	larl	%r15,_dump_info_stack_end-STACK_FRAME_OVERHEAD
31562306a36Sopenharmony_ci	brasl	%r14,print_pgm_check_info
31662306a36Sopenharmony_ci.Lold_psw_disabled_wait:
31762306a36Sopenharmony_ci	la	%r8,4095
31862306a36Sopenharmony_ci	lmg	%r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r8)
31962306a36Sopenharmony_ci	lpswe	__LC_RETURN_PSW		# disabled wait
32062306a36Sopenharmony_ciSYM_CODE_END(startup_pgm_check_handler)
321