xref: /openbmc/linux/arch/s390/kernel/text_amode31.S (revision c78d0c74)
1*c78d0c74SHeiko Carstens/* SPDX-License-Identifier: GPL-2.0 */
2*c78d0c74SHeiko Carstens/*
3*c78d0c74SHeiko Carstens * Code that needs to run below 2 GB.
4*c78d0c74SHeiko Carstens *
5*c78d0c74SHeiko Carstens * Copyright IBM Corp. 2019
6*c78d0c74SHeiko Carstens */
7*c78d0c74SHeiko Carstens
8*c78d0c74SHeiko Carstens#include <linux/linkage.h>
9*c78d0c74SHeiko Carstens#include <asm/errno.h>
10*c78d0c74SHeiko Carstens#include <asm/sigp.h>
11*c78d0c74SHeiko Carstens
12*c78d0c74SHeiko Carstens	.section .amode31.text,"ax"
13*c78d0c74SHeiko Carstens/*
14*c78d0c74SHeiko Carstens * Simplified version of expoline thunk. The normal thunks can not be used here,
15*c78d0c74SHeiko Carstens * because they might be more than 2 GB away, and not reachable by the relative
16*c78d0c74SHeiko Carstens * branch. No comdat, exrl, etc. optimizations used here, because it only
17*c78d0c74SHeiko Carstens * affects a few functions that are not performance-relevant.
18*c78d0c74SHeiko Carstens */
19*c78d0c74SHeiko Carstens	.macro BR_EX_AMODE31_r14
20*c78d0c74SHeiko Carstens	larl	%r1,0f
21*c78d0c74SHeiko Carstens	ex	0,0(%r1)
22*c78d0c74SHeiko Carstens	j	.
23*c78d0c74SHeiko Carstens0:	br	%r14
24*c78d0c74SHeiko Carstens	.endm
25*c78d0c74SHeiko Carstens
26*c78d0c74SHeiko Carstens/*
27*c78d0c74SHeiko Carstens * int _diag14_amode31(unsigned long rx, unsigned long ry1, unsigned long subcode)
28*c78d0c74SHeiko Carstens */
29*c78d0c74SHeiko CarstensENTRY(_diag14_amode31)
30*c78d0c74SHeiko Carstens	lgr	%r1,%r2
31*c78d0c74SHeiko Carstens	lgr	%r2,%r3
32*c78d0c74SHeiko Carstens	lgr	%r3,%r4
33*c78d0c74SHeiko Carstens	lhi	%r5,-EIO
34*c78d0c74SHeiko Carstens	sam31
35*c78d0c74SHeiko Carstens	diag	%r1,%r2,0x14
36*c78d0c74SHeiko Carstens.Ldiag14_ex:
37*c78d0c74SHeiko Carstens	ipm	%r5
38*c78d0c74SHeiko Carstens	srl	%r5,28
39*c78d0c74SHeiko Carstens.Ldiag14_fault:
40*c78d0c74SHeiko Carstens	sam64
41*c78d0c74SHeiko Carstens	lgfr	%r2,%r5
42*c78d0c74SHeiko Carstens	BR_EX_AMODE31_r14
43*c78d0c74SHeiko Carstens	EX_TABLE_AMODE31(.Ldiag14_ex, .Ldiag14_fault)
44*c78d0c74SHeiko CarstensENDPROC(_diag14_amode31)
45*c78d0c74SHeiko Carstens
46*c78d0c74SHeiko Carstens/*
47*c78d0c74SHeiko Carstens * int _diag210_amode31(struct diag210 *addr)
48*c78d0c74SHeiko Carstens */
49*c78d0c74SHeiko CarstensENTRY(_diag210_amode31)
50*c78d0c74SHeiko Carstens	lgr	%r1,%r2
51*c78d0c74SHeiko Carstens	lhi	%r2,-1
52*c78d0c74SHeiko Carstens	sam31
53*c78d0c74SHeiko Carstens	diag	%r1,%r0,0x210
54*c78d0c74SHeiko Carstens.Ldiag210_ex:
55*c78d0c74SHeiko Carstens	ipm	%r2
56*c78d0c74SHeiko Carstens	srl	%r2,28
57*c78d0c74SHeiko Carstens.Ldiag210_fault:
58*c78d0c74SHeiko Carstens	sam64
59*c78d0c74SHeiko Carstens	lgfr	%r2,%r2
60*c78d0c74SHeiko Carstens	BR_EX_AMODE31_r14
61*c78d0c74SHeiko Carstens	EX_TABLE_AMODE31(.Ldiag210_ex, .Ldiag210_fault)
62*c78d0c74SHeiko CarstensENDPROC(_diag210_amode31)
63*c78d0c74SHeiko Carstens
64*c78d0c74SHeiko Carstens/*
65*c78d0c74SHeiko Carstens * int _diag26c_amode31(void *req, void *resp, enum diag26c_sc subcode)
66*c78d0c74SHeiko Carstens */
67*c78d0c74SHeiko CarstensENTRY(_diag26c_amode31)
68*c78d0c74SHeiko Carstens	lghi	%r5,-EOPNOTSUPP
69*c78d0c74SHeiko Carstens	sam31
70*c78d0c74SHeiko Carstens	diag	%r2,%r4,0x26c
71*c78d0c74SHeiko Carstens.Ldiag26c_ex:
72*c78d0c74SHeiko Carstens	sam64
73*c78d0c74SHeiko Carstens	lgfr	%r2,%r5
74*c78d0c74SHeiko Carstens	BR_EX_AMODE31_r14
75*c78d0c74SHeiko Carstens	EX_TABLE_AMODE31(.Ldiag26c_ex, .Ldiag26c_ex)
76*c78d0c74SHeiko CarstensENDPROC(_diag26c_amode31)
77*c78d0c74SHeiko Carstens
78*c78d0c74SHeiko Carstens/*
79*c78d0c74SHeiko Carstens * void _diag0c_amode31(struct hypfs_diag0c_entry *entry)
80*c78d0c74SHeiko Carstens */
81*c78d0c74SHeiko CarstensENTRY(_diag0c_amode31)
82*c78d0c74SHeiko Carstens	sam31
83*c78d0c74SHeiko Carstens	diag	%r2,%r2,0x0c
84*c78d0c74SHeiko Carstens	sam64
85*c78d0c74SHeiko Carstens	BR_EX_AMODE31_r14
86*c78d0c74SHeiko CarstensENDPROC(_diag0c_amode31)
87*c78d0c74SHeiko Carstens
88*c78d0c74SHeiko Carstens/*
89*c78d0c74SHeiko Carstens * void _diag308_reset_amode31(void)
90*c78d0c74SHeiko Carstens *
91*c78d0c74SHeiko Carstens * Calls diag 308 subcode 1 and continues execution
92*c78d0c74SHeiko Carstens */
93*c78d0c74SHeiko CarstensENTRY(_diag308_reset_amode31)
94*c78d0c74SHeiko Carstens	larl	%r4,.Lctlregs		# Save control registers
95*c78d0c74SHeiko Carstens	stctg	%c0,%c15,0(%r4)
96*c78d0c74SHeiko Carstens	lg	%r2,0(%r4)		# Disable lowcore protection
97*c78d0c74SHeiko Carstens	nilh	%r2,0xefff
98*c78d0c74SHeiko Carstens	larl	%r4,.Lctlreg0
99*c78d0c74SHeiko Carstens	stg	%r2,0(%r4)
100*c78d0c74SHeiko Carstens	lctlg	%c0,%c0,0(%r4)
101*c78d0c74SHeiko Carstens	larl	%r4,.Lfpctl		# Floating point control register
102*c78d0c74SHeiko Carstens	stfpc	0(%r4)
103*c78d0c74SHeiko Carstens	larl	%r4,.Lprefix		# Save prefix register
104*c78d0c74SHeiko Carstens	stpx	0(%r4)
105*c78d0c74SHeiko Carstens	larl	%r4,.Lprefix_zero	# Set prefix register to 0
106*c78d0c74SHeiko Carstens	spx	0(%r4)
107*c78d0c74SHeiko Carstens	larl	%r4,.Lcontinue_psw	# Save PSW flags
108*c78d0c74SHeiko Carstens	epsw	%r2,%r3
109*c78d0c74SHeiko Carstens	stm	%r2,%r3,0(%r4)
110*c78d0c74SHeiko Carstens	larl	%r4,restart_part2	# Setup restart PSW at absolute 0
111*c78d0c74SHeiko Carstens	larl	%r3,.Lrestart_diag308_psw
112*c78d0c74SHeiko Carstens	og	%r4,0(%r3)		# Save PSW
113*c78d0c74SHeiko Carstens	lghi	%r3,0
114*c78d0c74SHeiko Carstens	sturg	%r4,%r3			# Use sturg, because of large pages
115*c78d0c74SHeiko Carstens	lghi	%r1,1
116*c78d0c74SHeiko Carstens	lghi	%r0,0
117*c78d0c74SHeiko Carstens	diag	%r0,%r1,0x308
118*c78d0c74SHeiko Carstensrestart_part2:
119*c78d0c74SHeiko Carstens	lhi	%r0,0			# Load r0 with zero
120*c78d0c74SHeiko Carstens	lhi	%r1,2			# Use mode 2 = ESAME (dump)
121*c78d0c74SHeiko Carstens	sigp	%r1,%r0,SIGP_SET_ARCHITECTURE	# Switch to ESAME mode
122*c78d0c74SHeiko Carstens	sam64				# Switch to 64 bit addressing mode
123*c78d0c74SHeiko Carstens	larl	%r4,.Lctlregs		# Restore control registers
124*c78d0c74SHeiko Carstens	lctlg	%c0,%c15,0(%r4)
125*c78d0c74SHeiko Carstens	larl	%r4,.Lfpctl		# Restore floating point ctl register
126*c78d0c74SHeiko Carstens	lfpc	0(%r4)
127*c78d0c74SHeiko Carstens	larl	%r4,.Lprefix		# Restore prefix register
128*c78d0c74SHeiko Carstens	spx	0(%r4)
129*c78d0c74SHeiko Carstens	larl	%r4,.Lcontinue_psw	# Restore PSW flags
130*c78d0c74SHeiko Carstens	larl	%r2,.Lcontinue
131*c78d0c74SHeiko Carstens	stg	%r2,8(%r4)
132*c78d0c74SHeiko Carstens	lpswe	0(%r4)
133*c78d0c74SHeiko Carstens.Lcontinue:
134*c78d0c74SHeiko Carstens	BR_EX_AMODE31_r14
135*c78d0c74SHeiko CarstensENDPROC(_diag308_reset_amode31)
136*c78d0c74SHeiko Carstens
137*c78d0c74SHeiko Carstens	.section .amode31.data,"aw",@progbits
138*c78d0c74SHeiko Carstens.align	8
139*c78d0c74SHeiko Carstens.Lrestart_diag308_psw:
140*c78d0c74SHeiko Carstens	.long	0x00080000,0x80000000
141*c78d0c74SHeiko Carstens
142*c78d0c74SHeiko Carstens.align 8
143*c78d0c74SHeiko Carstens.Lcontinue_psw:
144*c78d0c74SHeiko Carstens	.quad	0,0
145*c78d0c74SHeiko Carstens
146*c78d0c74SHeiko Carstens.align 8
147*c78d0c74SHeiko Carstens.Lctlreg0:
148*c78d0c74SHeiko Carstens	.quad	0
149*c78d0c74SHeiko Carstens.Lctlregs:
150*c78d0c74SHeiko Carstens	.rept	16
151*c78d0c74SHeiko Carstens	.quad	0
152*c78d0c74SHeiko Carstens	.endr
153*c78d0c74SHeiko Carstens.Lfpctl:
154*c78d0c74SHeiko Carstens	.long	0
155*c78d0c74SHeiko Carstens.Lprefix:
156*c78d0c74SHeiko Carstens	.long	0
157*c78d0c74SHeiko Carstens.Lprefix_zero:
158*c78d0c74SHeiko Carstens	.long	0
159