1e1051a39Sopenharmony_ci#! /usr/bin/env perl
2e1051a39Sopenharmony_ci# Copyright 2009-2020 The OpenSSL Project Authors. All Rights Reserved.
3e1051a39Sopenharmony_ci#
4e1051a39Sopenharmony_ci# Licensed under the Apache License 2.0 (the "License").  You may not use
5e1051a39Sopenharmony_ci# this file except in compliance with the License.  You can obtain a copy
6e1051a39Sopenharmony_ci# in the file LICENSE in the source distribution or at
7e1051a39Sopenharmony_ci# https://www.openssl.org/source/license.html
8e1051a39Sopenharmony_ci
9e1051a39Sopenharmony_ci# $output is the last argument if it looks like a file (it has an extension)
10e1051a39Sopenharmony_ci# $flavour is the first argument if it doesn't look like a file
11e1051a39Sopenharmony_ci$output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef;
12e1051a39Sopenharmony_ci$flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef;
13e1051a39Sopenharmony_ci
14e1051a39Sopenharmony_ciif ($flavour =~ /3[12]/) {
15e1051a39Sopenharmony_ci	$SIZE_T=4;
16e1051a39Sopenharmony_ci	$g="";
17e1051a39Sopenharmony_ci} else {
18e1051a39Sopenharmony_ci	$SIZE_T=8;
19e1051a39Sopenharmony_ci	$g="g";
20e1051a39Sopenharmony_ci}
21e1051a39Sopenharmony_ci
22e1051a39Sopenharmony_ci$output and open STDOUT,">$output";
23e1051a39Sopenharmony_ci
24e1051a39Sopenharmony_ci$ra="%r14";
25e1051a39Sopenharmony_ci$sp="%r15";
26e1051a39Sopenharmony_ci$stdframe=16*$SIZE_T+4*8;
27e1051a39Sopenharmony_ci
28e1051a39Sopenharmony_ci$code=<<___;
29e1051a39Sopenharmony_ci#include "s390x_arch.h"
30e1051a39Sopenharmony_ci
31e1051a39Sopenharmony_ci.text
32e1051a39Sopenharmony_ci
33e1051a39Sopenharmony_ci.globl	OPENSSL_s390x_facilities
34e1051a39Sopenharmony_ci.type	OPENSSL_s390x_facilities,\@function
35e1051a39Sopenharmony_ci.align	16
36e1051a39Sopenharmony_ciOPENSSL_s390x_facilities:
37e1051a39Sopenharmony_ci	lghi	%r0,0
38e1051a39Sopenharmony_ci	larl	%r4,OPENSSL_s390xcap_P
39e1051a39Sopenharmony_ci
40e1051a39Sopenharmony_ci	stg	%r0,S390X_STFLE+8(%r4)	# wipe capability vectors
41e1051a39Sopenharmony_ci	stg	%r0,S390X_STFLE+16(%r4)
42e1051a39Sopenharmony_ci	stg	%r0,S390X_STFLE+24(%r4)
43e1051a39Sopenharmony_ci
44e1051a39Sopenharmony_ci	.long	0xb2b04000		# stfle	0(%r4)
45e1051a39Sopenharmony_ci	brc	8,.Ldone
46e1051a39Sopenharmony_ci	lghi	%r0,1
47e1051a39Sopenharmony_ci	.long	0xb2b04000		# stfle 0(%r4)
48e1051a39Sopenharmony_ci	brc	8,.Ldone
49e1051a39Sopenharmony_ci	lghi	%r0,2
50e1051a39Sopenharmony_ci	.long	0xb2b04000		# stfle 0(%r4)
51e1051a39Sopenharmony_ci.Ldone:
52e1051a39Sopenharmony_ci	br	$ra
53e1051a39Sopenharmony_ci.size	OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities
54e1051a39Sopenharmony_ci
55e1051a39Sopenharmony_ci.globl	OPENSSL_s390x_functions
56e1051a39Sopenharmony_ci.type	OPENSSL_s390x_functions,\@function
57e1051a39Sopenharmony_ci.align	16
58e1051a39Sopenharmony_ciOPENSSL_s390x_functions:
59e1051a39Sopenharmony_ci	lghi	%r0,0
60e1051a39Sopenharmony_ci	larl	%r4,OPENSSL_s390xcap_P
61e1051a39Sopenharmony_ci
62e1051a39Sopenharmony_ci	stg	%r0,S390X_KIMD(%r4)	# wipe capability vectors
63e1051a39Sopenharmony_ci	stg	%r0,S390X_KIMD+8(%r4)
64e1051a39Sopenharmony_ci	stg	%r0,S390X_KLMD(%r4)
65e1051a39Sopenharmony_ci	stg	%r0,S390X_KLMD+8(%r4)
66e1051a39Sopenharmony_ci	stg	%r0,S390X_KM(%r4)
67e1051a39Sopenharmony_ci	stg	%r0,S390X_KM+8(%r4)
68e1051a39Sopenharmony_ci	stg	%r0,S390X_KMC(%r4)
69e1051a39Sopenharmony_ci	stg	%r0,S390X_KMC+8(%r4)
70e1051a39Sopenharmony_ci	stg	%r0,S390X_KMAC(%r4)
71e1051a39Sopenharmony_ci	stg	%r0,S390X_KMAC+8(%r4)
72e1051a39Sopenharmony_ci	stg	%r0,S390X_KMCTR(%r4)
73e1051a39Sopenharmony_ci	stg	%r0,S390X_KMCTR+8(%r4)
74e1051a39Sopenharmony_ci	stg	%r0,S390X_KMO(%r4)
75e1051a39Sopenharmony_ci	stg	%r0,S390X_KMO+8(%r4)
76e1051a39Sopenharmony_ci	stg	%r0,S390X_KMF(%r4)
77e1051a39Sopenharmony_ci	stg	%r0,S390X_KMF+8(%r4)
78e1051a39Sopenharmony_ci	stg	%r0,S390X_PRNO(%r4)
79e1051a39Sopenharmony_ci	stg	%r0,S390X_PRNO+8(%r4)
80e1051a39Sopenharmony_ci	stg	%r0,S390X_KMA(%r4)
81e1051a39Sopenharmony_ci	stg	%r0,S390X_KMA+8(%r4)
82e1051a39Sopenharmony_ci	stg	%r0,S390X_PCC(%r4)
83e1051a39Sopenharmony_ci	stg	%r0,S390X_PCC+8(%r4)
84e1051a39Sopenharmony_ci	stg	%r0,S390X_KDSA(%r4)
85e1051a39Sopenharmony_ci	stg	%r0,S390X_KDSA+8(%r4)
86e1051a39Sopenharmony_ci
87e1051a39Sopenharmony_ci	lmg	%r2,%r3,S390X_STFLE(%r4)
88e1051a39Sopenharmony_ci
89e1051a39Sopenharmony_ci	tmhl	%r2,0x4000		# check for message-security-assist
90e1051a39Sopenharmony_ci	jz	.Lret
91e1051a39Sopenharmony_ci
92e1051a39Sopenharmony_ci	lghi	%r0,S390X_QUERY		# query kimd capabilities
93e1051a39Sopenharmony_ci	la	%r1,S390X_KIMD(%r4)
94e1051a39Sopenharmony_ci	.long	0xb93e0002		# kimd %r0,%r2
95e1051a39Sopenharmony_ci
96e1051a39Sopenharmony_ci	lghi	%r0,S390X_QUERY		# query klmd capabilities
97e1051a39Sopenharmony_ci	la	%r1,S390X_KLMD(%r4)
98e1051a39Sopenharmony_ci	.long	0xb93f0002		# klmd %r0,%r2
99e1051a39Sopenharmony_ci
100e1051a39Sopenharmony_ci	lghi	%r0,S390X_QUERY		# query km capability vector
101e1051a39Sopenharmony_ci	la	%r1,S390X_KM(%r4)
102e1051a39Sopenharmony_ci	.long	0xb92e0042		# km %r4,%r2
103e1051a39Sopenharmony_ci
104e1051a39Sopenharmony_ci	lghi	%r0,S390X_QUERY		# query kmc capability vector
105e1051a39Sopenharmony_ci	la	%r1,S390X_KMC(%r4)
106e1051a39Sopenharmony_ci	.long	0xb92f0042		# kmc %r4,%r2
107e1051a39Sopenharmony_ci
108e1051a39Sopenharmony_ci	lghi	%r0,S390X_QUERY		# query kmac capability vector
109e1051a39Sopenharmony_ci	la	%r1,S390X_KMAC(%r4)
110e1051a39Sopenharmony_ci	.long	0xb91e0042		# kmac %r4,%r2
111e1051a39Sopenharmony_ci
112e1051a39Sopenharmony_ci	tmhh	%r3,0x0008		# check for message-security-assist-3
113e1051a39Sopenharmony_ci	jz	.Lret
114e1051a39Sopenharmony_ci
115e1051a39Sopenharmony_ci	lghi	%r0,S390X_QUERY		# query pcc capability vector
116e1051a39Sopenharmony_ci	la	%r1,S390X_PCC(%r4)
117e1051a39Sopenharmony_ci	.long	0xb92c0000		# pcc
118e1051a39Sopenharmony_ci
119e1051a39Sopenharmony_ci	tmhh	%r3,0x0004		# check for message-security-assist-4
120e1051a39Sopenharmony_ci	jz	.Lret
121e1051a39Sopenharmony_ci
122e1051a39Sopenharmony_ci	lghi	%r0,S390X_QUERY		# query kmctr capability vector
123e1051a39Sopenharmony_ci	la	%r1,S390X_KMCTR(%r4)
124e1051a39Sopenharmony_ci	.long	0xb92d2042		# kmctr %r4,%r2,%r2
125e1051a39Sopenharmony_ci
126e1051a39Sopenharmony_ci	lghi	%r0,S390X_QUERY		# query kmo capability vector
127e1051a39Sopenharmony_ci	la	%r1,S390X_KMO(%r4)
128e1051a39Sopenharmony_ci	.long	0xb92b0042		# kmo %r4,%r2
129e1051a39Sopenharmony_ci
130e1051a39Sopenharmony_ci	lghi	%r0,S390X_QUERY		# query kmf capability vector
131e1051a39Sopenharmony_ci	la	%r1,S390X_KMF(%r4)
132e1051a39Sopenharmony_ci	.long	0xb92a0042		# kmf %r4,%r2
133e1051a39Sopenharmony_ci
134e1051a39Sopenharmony_ci	tml	%r2,0x40		# check for message-security-assist-5
135e1051a39Sopenharmony_ci	jz	.Lret
136e1051a39Sopenharmony_ci
137e1051a39Sopenharmony_ci	lghi	%r0,S390X_QUERY		# query prno capability vector
138e1051a39Sopenharmony_ci	la	%r1,S390X_PRNO(%r4)
139e1051a39Sopenharmony_ci	.long	0xb93c0042		# prno %r4,%r2
140e1051a39Sopenharmony_ci
141e1051a39Sopenharmony_ci	lg	%r2,S390X_STFLE+16(%r4)
142e1051a39Sopenharmony_ci
143e1051a39Sopenharmony_ci	tmhl	%r2,0x2000		# check for message-security-assist-8
144e1051a39Sopenharmony_ci	jz	.Lret
145e1051a39Sopenharmony_ci
146e1051a39Sopenharmony_ci	lghi	%r0,S390X_QUERY		# query kma capability vector
147e1051a39Sopenharmony_ci	la	%r1,S390X_KMA(%r4)
148e1051a39Sopenharmony_ci	.long	0xb9294022		# kma %r2,%r4,%r2
149e1051a39Sopenharmony_ci
150e1051a39Sopenharmony_ci	tmhl	%r2,0x0010		# check for message-security-assist-9
151e1051a39Sopenharmony_ci	jz	.Lret
152e1051a39Sopenharmony_ci
153e1051a39Sopenharmony_ci	lghi	%r0,S390X_QUERY		# query kdsa capability vector
154e1051a39Sopenharmony_ci	la	%r1,S390X_KDSA(%r4)
155e1051a39Sopenharmony_ci	.long	0xb93a0002		# kdsa %r0,%r2
156e1051a39Sopenharmony_ci
157e1051a39Sopenharmony_ci.Lret:
158e1051a39Sopenharmony_ci	br	$ra
159e1051a39Sopenharmony_ci.size	OPENSSL_s390x_functions,.-OPENSSL_s390x_functions
160e1051a39Sopenharmony_ci
161e1051a39Sopenharmony_ci.globl	OPENSSL_rdtsc
162e1051a39Sopenharmony_ci.type	OPENSSL_rdtsc,\@function
163e1051a39Sopenharmony_ci.align	16
164e1051a39Sopenharmony_ciOPENSSL_rdtsc:
165e1051a39Sopenharmony_ci	larl	%r4,OPENSSL_s390xcap_P
166e1051a39Sopenharmony_ci	tm	S390X_STFLE+3(%r4),0x40	# check for store-clock-fast facility
167e1051a39Sopenharmony_ci	jz	.Lstck
168e1051a39Sopenharmony_ci
169e1051a39Sopenharmony_ci	.long	0xb27cf010	# stckf 16($sp)
170e1051a39Sopenharmony_ci	lg	%r2,16($sp)
171e1051a39Sopenharmony_ci	br	$ra
172e1051a39Sopenharmony_ci.Lstck:
173e1051a39Sopenharmony_ci	stck	16($sp)
174e1051a39Sopenharmony_ci	lg	%r2,16($sp)
175e1051a39Sopenharmony_ci	br	$ra
176e1051a39Sopenharmony_ci.size	OPENSSL_rdtsc,.-OPENSSL_rdtsc
177e1051a39Sopenharmony_ci
178e1051a39Sopenharmony_ci.globl	OPENSSL_atomic_add
179e1051a39Sopenharmony_ci.type	OPENSSL_atomic_add,\@function
180e1051a39Sopenharmony_ci.align	16
181e1051a39Sopenharmony_ciOPENSSL_atomic_add:
182e1051a39Sopenharmony_ci	l	%r1,0(%r2)
183e1051a39Sopenharmony_ci.Lspin:	lr	%r0,%r1
184e1051a39Sopenharmony_ci	ar	%r0,%r3
185e1051a39Sopenharmony_ci	cs	%r1,%r0,0(%r2)
186e1051a39Sopenharmony_ci	brc	4,.Lspin
187e1051a39Sopenharmony_ci	lgfr	%r2,%r0		# OpenSSL expects the new value
188e1051a39Sopenharmony_ci	br	$ra
189e1051a39Sopenharmony_ci.size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
190e1051a39Sopenharmony_ci
191e1051a39Sopenharmony_ci.globl	OPENSSL_wipe_cpu
192e1051a39Sopenharmony_ci.type	OPENSSL_wipe_cpu,\@function
193e1051a39Sopenharmony_ci.align	16
194e1051a39Sopenharmony_ciOPENSSL_wipe_cpu:
195e1051a39Sopenharmony_ci	xgr	%r0,%r0
196e1051a39Sopenharmony_ci	xgr	%r1,%r1
197e1051a39Sopenharmony_ci	lgr	%r2,$sp
198e1051a39Sopenharmony_ci	xgr	%r3,%r3
199e1051a39Sopenharmony_ci	xgr	%r4,%r4
200e1051a39Sopenharmony_ci	lzdr	%f0
201e1051a39Sopenharmony_ci	lzdr	%f1
202e1051a39Sopenharmony_ci	lzdr	%f2
203e1051a39Sopenharmony_ci	lzdr	%f3
204e1051a39Sopenharmony_ci	lzdr	%f4
205e1051a39Sopenharmony_ci	lzdr	%f5
206e1051a39Sopenharmony_ci	lzdr	%f6
207e1051a39Sopenharmony_ci	lzdr	%f7
208e1051a39Sopenharmony_ci	br	$ra
209e1051a39Sopenharmony_ci.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
210e1051a39Sopenharmony_ci
211e1051a39Sopenharmony_ci.globl	OPENSSL_cleanse
212e1051a39Sopenharmony_ci.type	OPENSSL_cleanse,\@function
213e1051a39Sopenharmony_ci.align	16
214e1051a39Sopenharmony_ciOPENSSL_cleanse:
215e1051a39Sopenharmony_ci#if !defined(__s390x__) && !defined(__s390x)
216e1051a39Sopenharmony_ci	llgfr	%r3,%r3
217e1051a39Sopenharmony_ci#endif
218e1051a39Sopenharmony_ci	lghi	%r4,15
219e1051a39Sopenharmony_ci	lghi	%r0,0
220e1051a39Sopenharmony_ci	clgr	%r3,%r4
221e1051a39Sopenharmony_ci	jh	.Lot
222e1051a39Sopenharmony_ci	clgr	%r3,%r0
223e1051a39Sopenharmony_ci	bcr	8,%r14
224e1051a39Sopenharmony_ci.Little:
225e1051a39Sopenharmony_ci	stc	%r0,0(%r2)
226e1051a39Sopenharmony_ci	la	%r2,1(%r2)
227e1051a39Sopenharmony_ci	brctg	%r3,.Little
228e1051a39Sopenharmony_ci	br	%r14
229e1051a39Sopenharmony_ci.align	4
230e1051a39Sopenharmony_ci.Lot:	tmll	%r2,7
231e1051a39Sopenharmony_ci	jz	.Laligned
232e1051a39Sopenharmony_ci	stc	%r0,0(%r2)
233e1051a39Sopenharmony_ci	la	%r2,1(%r2)
234e1051a39Sopenharmony_ci	brctg	%r3,.Lot
235e1051a39Sopenharmony_ci.Laligned:
236e1051a39Sopenharmony_ci	srlg	%r4,%r3,3
237e1051a39Sopenharmony_ci.Loop:	stg	%r0,0(%r2)
238e1051a39Sopenharmony_ci	la	%r2,8(%r2)
239e1051a39Sopenharmony_ci	brctg	%r4,.Loop
240e1051a39Sopenharmony_ci	lghi	%r4,7
241e1051a39Sopenharmony_ci	ngr	%r3,%r4
242e1051a39Sopenharmony_ci	jnz	.Little
243e1051a39Sopenharmony_ci	br	$ra
244e1051a39Sopenharmony_ci.size	OPENSSL_cleanse,.-OPENSSL_cleanse
245e1051a39Sopenharmony_ci
246e1051a39Sopenharmony_ci.globl	CRYPTO_memcmp
247e1051a39Sopenharmony_ci.type	CRYPTO_memcmp,\@function
248e1051a39Sopenharmony_ci.align	16
249e1051a39Sopenharmony_ciCRYPTO_memcmp:
250e1051a39Sopenharmony_ci#if !defined(__s390x__) && !defined(__s390x)
251e1051a39Sopenharmony_ci	llgfr	%r4,%r4
252e1051a39Sopenharmony_ci#endif
253e1051a39Sopenharmony_ci	lghi	%r5,0
254e1051a39Sopenharmony_ci	clgr	%r4,%r5
255e1051a39Sopenharmony_ci	je	.Lno_data
256e1051a39Sopenharmony_ci
257e1051a39Sopenharmony_ci.Loop_cmp:
258e1051a39Sopenharmony_ci	llgc	%r0,0(%r2)
259e1051a39Sopenharmony_ci	la	%r2,1(%r2)
260e1051a39Sopenharmony_ci	llgc	%r1,0(%r3)
261e1051a39Sopenharmony_ci	la	%r3,1(%r3)
262e1051a39Sopenharmony_ci	xr	%r1,%r0
263e1051a39Sopenharmony_ci	or	%r5,%r1
264e1051a39Sopenharmony_ci	brctg	%r4,.Loop_cmp
265e1051a39Sopenharmony_ci
266e1051a39Sopenharmony_ci	lnr	%r5,%r5
267e1051a39Sopenharmony_ci	srl	%r5,31
268e1051a39Sopenharmony_ci.Lno_data:
269e1051a39Sopenharmony_ci	lgr	%r2,%r5
270e1051a39Sopenharmony_ci	br	$ra
271e1051a39Sopenharmony_ci.size	CRYPTO_memcmp,.-CRYPTO_memcmp
272e1051a39Sopenharmony_ci
273e1051a39Sopenharmony_ci.globl	OPENSSL_instrument_bus
274e1051a39Sopenharmony_ci.type	OPENSSL_instrument_bus,\@function
275e1051a39Sopenharmony_ci.align	16
276e1051a39Sopenharmony_ciOPENSSL_instrument_bus:
277e1051a39Sopenharmony_ci	lghi	%r2,0
278e1051a39Sopenharmony_ci	br	%r14
279e1051a39Sopenharmony_ci.size	OPENSSL_instrument_bus,.-OPENSSL_instrument_bus
280e1051a39Sopenharmony_ci
281e1051a39Sopenharmony_ci.globl	OPENSSL_instrument_bus2
282e1051a39Sopenharmony_ci.type	OPENSSL_instrument_bus2,\@function
283e1051a39Sopenharmony_ci.align	16
284e1051a39Sopenharmony_ciOPENSSL_instrument_bus2:
285e1051a39Sopenharmony_ci	lghi	%r2,0
286e1051a39Sopenharmony_ci	br	$ra
287e1051a39Sopenharmony_ci.size	OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
288e1051a39Sopenharmony_ci
289e1051a39Sopenharmony_ci.globl	OPENSSL_vx_probe
290e1051a39Sopenharmony_ci.type	OPENSSL_vx_probe,\@function
291e1051a39Sopenharmony_ci.align	16
292e1051a39Sopenharmony_ciOPENSSL_vx_probe:
293e1051a39Sopenharmony_ci	.word	0xe700,0x0000,0x0044	# vzero %v0
294e1051a39Sopenharmony_ci	br	$ra
295e1051a39Sopenharmony_ci.size	OPENSSL_vx_probe,.-OPENSSL_vx_probe
296e1051a39Sopenharmony_ci___
297e1051a39Sopenharmony_ci
298e1051a39Sopenharmony_ci{
299e1051a39Sopenharmony_ci################
300e1051a39Sopenharmony_ci# void s390x_kimd(const unsigned char *in, size_t len, unsigned int fc,
301e1051a39Sopenharmony_ci#                 void *param)
302e1051a39Sopenharmony_cimy ($in,$len,$fc,$param) = map("%r$_",(2..5));
303e1051a39Sopenharmony_ci$code.=<<___;
304e1051a39Sopenharmony_ci.globl	s390x_kimd
305e1051a39Sopenharmony_ci.type	s390x_kimd,\@function
306e1051a39Sopenharmony_ci.align	16
307e1051a39Sopenharmony_cis390x_kimd:
308e1051a39Sopenharmony_ci	llgfr	%r0,$fc
309e1051a39Sopenharmony_ci	lgr	%r1,$param
310e1051a39Sopenharmony_ci
311e1051a39Sopenharmony_ci	.long	0xb93e0002	# kimd %r0,%r2
312e1051a39Sopenharmony_ci	brc	1,.-4		# pay attention to "partial completion"
313e1051a39Sopenharmony_ci
314e1051a39Sopenharmony_ci	br	$ra
315e1051a39Sopenharmony_ci.size	s390x_kimd,.-s390x_kimd
316e1051a39Sopenharmony_ci___
317e1051a39Sopenharmony_ci}
318e1051a39Sopenharmony_ci
319e1051a39Sopenharmony_ci{
320e1051a39Sopenharmony_ci################
321e1051a39Sopenharmony_ci# void s390x_klmd(const unsigned char *in, size_t inlen, unsigned char *out,
322e1051a39Sopenharmony_ci#                 size_t outlen, unsigned int fc, void *param)
323e1051a39Sopenharmony_cimy ($in,$inlen,$out,$outlen,$fc) = map("%r$_",(2..6));
324e1051a39Sopenharmony_ci$code.=<<___;
325e1051a39Sopenharmony_ci.globl	s390x_klmd
326e1051a39Sopenharmony_ci.type	s390x_klmd,\@function
327e1051a39Sopenharmony_ci.align	32
328e1051a39Sopenharmony_cis390x_klmd:
329e1051a39Sopenharmony_ci	llgfr	%r0,$fc
330e1051a39Sopenharmony_ci	l${g}	%r1,$stdframe($sp)
331e1051a39Sopenharmony_ci
332e1051a39Sopenharmony_ci	.long	0xb93f0042	# klmd %r4,%r2
333e1051a39Sopenharmony_ci	brc	1,.-4		# pay attention to "partial completion"
334e1051a39Sopenharmony_ci
335e1051a39Sopenharmony_ci	br	$ra
336e1051a39Sopenharmony_ci.size	s390x_klmd,.-s390x_klmd
337e1051a39Sopenharmony_ci___
338e1051a39Sopenharmony_ci}
339e1051a39Sopenharmony_ci
340e1051a39Sopenharmony_ci################
341e1051a39Sopenharmony_ci# void s390x_km(const unsigned char *in, size_t len, unsigned char *out,
342e1051a39Sopenharmony_ci#               unsigned int fc, void *param)
343e1051a39Sopenharmony_ci{
344e1051a39Sopenharmony_cimy ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
345e1051a39Sopenharmony_ci$code.=<<___;
346e1051a39Sopenharmony_ci.globl	s390x_km
347e1051a39Sopenharmony_ci.type	s390x_km,\@function
348e1051a39Sopenharmony_ci.align	16
349e1051a39Sopenharmony_cis390x_km:
350e1051a39Sopenharmony_ci	lr	%r0,$fc
351e1051a39Sopenharmony_ci	l${g}r	%r1,$param
352e1051a39Sopenharmony_ci
353e1051a39Sopenharmony_ci	.long	0xb92e0042	# km $out,$in
354e1051a39Sopenharmony_ci	brc	1,.-4		# pay attention to "partial completion"
355e1051a39Sopenharmony_ci
356e1051a39Sopenharmony_ci	br	$ra
357e1051a39Sopenharmony_ci.size	s390x_km,.-s390x_km
358e1051a39Sopenharmony_ci___
359e1051a39Sopenharmony_ci}
360e1051a39Sopenharmony_ci
361e1051a39Sopenharmony_ci################
362e1051a39Sopenharmony_ci# void s390x_kmac(const unsigned char *in, size_t len, unsigned int fc,
363e1051a39Sopenharmony_ci#                 void *param)
364e1051a39Sopenharmony_ci{
365e1051a39Sopenharmony_cimy ($in,$len,$fc,$param) = map("%r$_",(2..5));
366e1051a39Sopenharmony_ci$code.=<<___;
367e1051a39Sopenharmony_ci.globl	s390x_kmac
368e1051a39Sopenharmony_ci.type	s390x_kmac,\@function
369e1051a39Sopenharmony_ci.align	16
370e1051a39Sopenharmony_cis390x_kmac:
371e1051a39Sopenharmony_ci	lr	%r0,$fc
372e1051a39Sopenharmony_ci	l${g}r	%r1,$param
373e1051a39Sopenharmony_ci
374e1051a39Sopenharmony_ci	.long	0xb91e0002	# kmac %r0,$in
375e1051a39Sopenharmony_ci	brc	1,.-4		# pay attention to "partial completion"
376e1051a39Sopenharmony_ci
377e1051a39Sopenharmony_ci	br	$ra
378e1051a39Sopenharmony_ci.size	s390x_kmac,.-s390x_kmac
379e1051a39Sopenharmony_ci___
380e1051a39Sopenharmony_ci}
381e1051a39Sopenharmony_ci
382e1051a39Sopenharmony_ci################
383e1051a39Sopenharmony_ci# void s390x_kmo(const unsigned char *in, size_t len, unsigned char *out,
384e1051a39Sopenharmony_ci#                unsigned int fc, void *param)
385e1051a39Sopenharmony_ci{
386e1051a39Sopenharmony_cimy ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
387e1051a39Sopenharmony_ci$code.=<<___;
388e1051a39Sopenharmony_ci.globl	s390x_kmo
389e1051a39Sopenharmony_ci.type	s390x_kmo,\@function
390e1051a39Sopenharmony_ci.align	16
391e1051a39Sopenharmony_cis390x_kmo:
392e1051a39Sopenharmony_ci	lr	%r0,$fc
393e1051a39Sopenharmony_ci	l${g}r	%r1,$param
394e1051a39Sopenharmony_ci
395e1051a39Sopenharmony_ci	.long	0xb92b0042	# kmo $out,$in
396e1051a39Sopenharmony_ci	brc	1,.-4		# pay attention to "partial completion"
397e1051a39Sopenharmony_ci
398e1051a39Sopenharmony_ci	br	$ra
399e1051a39Sopenharmony_ci.size	s390x_kmo,.-s390x_kmo
400e1051a39Sopenharmony_ci___
401e1051a39Sopenharmony_ci}
402e1051a39Sopenharmony_ci
403e1051a39Sopenharmony_ci################
404e1051a39Sopenharmony_ci# void s390x_kmf(const unsigned char *in, size_t len, unsigned char *out,
405e1051a39Sopenharmony_ci#                unsigned int fc, void *param)
406e1051a39Sopenharmony_ci{
407e1051a39Sopenharmony_cimy ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
408e1051a39Sopenharmony_ci$code.=<<___;
409e1051a39Sopenharmony_ci.globl	s390x_kmf
410e1051a39Sopenharmony_ci.type	s390x_kmf,\@function
411e1051a39Sopenharmony_ci.align	16
412e1051a39Sopenharmony_cis390x_kmf:
413e1051a39Sopenharmony_ci	lr	%r0,$fc
414e1051a39Sopenharmony_ci	l${g}r	%r1,$param
415e1051a39Sopenharmony_ci
416e1051a39Sopenharmony_ci	.long	0xb92a0042	# kmf $out,$in
417e1051a39Sopenharmony_ci	brc	1,.-4		# pay attention to "partial completion"
418e1051a39Sopenharmony_ci
419e1051a39Sopenharmony_ci	br	$ra
420e1051a39Sopenharmony_ci.size	s390x_kmf,.-s390x_kmf
421e1051a39Sopenharmony_ci___
422e1051a39Sopenharmony_ci}
423e1051a39Sopenharmony_ci
424e1051a39Sopenharmony_ci################
425e1051a39Sopenharmony_ci# void s390x_kma(const unsigned char *aad, size_t alen,
426e1051a39Sopenharmony_ci#                const unsigned char *in, size_t len,
427e1051a39Sopenharmony_ci#                unsigned char *out, unsigned int fc, void *param)
428e1051a39Sopenharmony_ci{
429e1051a39Sopenharmony_cimy ($aad,$alen,$in,$len,$out) = map("%r$_",(2..6));
430e1051a39Sopenharmony_ci$code.=<<___;
431e1051a39Sopenharmony_ci.globl	s390x_kma
432e1051a39Sopenharmony_ci.type	s390x_kma,\@function
433e1051a39Sopenharmony_ci.align	16
434e1051a39Sopenharmony_cis390x_kma:
435e1051a39Sopenharmony_ci	st${g}	$out,6*$SIZE_T($sp)
436e1051a39Sopenharmony_ci	lm${g}	%r0,%r1,$stdframe($sp)
437e1051a39Sopenharmony_ci
438e1051a39Sopenharmony_ci	.long	0xb9292064	# kma $out,$aad,$in
439e1051a39Sopenharmony_ci	brc	1,.-4		# pay attention to "partial completion"
440e1051a39Sopenharmony_ci
441e1051a39Sopenharmony_ci	l${g}	$out,6*$SIZE_T($sp)
442e1051a39Sopenharmony_ci	br	$ra
443e1051a39Sopenharmony_ci.size	s390x_kma,.-s390x_kma
444e1051a39Sopenharmony_ci___
445e1051a39Sopenharmony_ci}
446e1051a39Sopenharmony_ci
447e1051a39Sopenharmony_ci################
448e1051a39Sopenharmony_ci# int s390x_pcc(unsigned int fc, void *param)
449e1051a39Sopenharmony_ci{
450e1051a39Sopenharmony_cimy ($fc,$param) = map("%r$_",(2..3));
451e1051a39Sopenharmony_ci$code.=<<___;
452e1051a39Sopenharmony_ci.globl	s390x_pcc
453e1051a39Sopenharmony_ci.type	s390x_pcc,\@function
454e1051a39Sopenharmony_ci.align	16
455e1051a39Sopenharmony_cis390x_pcc:
456e1051a39Sopenharmony_ci	lr	%r0,$fc
457e1051a39Sopenharmony_ci	l${g}r	%r1,$param
458e1051a39Sopenharmony_ci	lhi	%r2,0
459e1051a39Sopenharmony_ci
460e1051a39Sopenharmony_ci	.long	0xb92c0000	# pcc
461e1051a39Sopenharmony_ci	brc	1,.-4		# pay attention to "partial completion"
462e1051a39Sopenharmony_ci	brc	7,.Lpcc_err	# if CC==0 return 0, else return 1
463e1051a39Sopenharmony_ci.Lpcc_out:
464e1051a39Sopenharmony_ci	br	$ra
465e1051a39Sopenharmony_ci.Lpcc_err:
466e1051a39Sopenharmony_ci	lhi	%r2,1
467e1051a39Sopenharmony_ci	j	.Lpcc_out
468e1051a39Sopenharmony_ci.size	s390x_pcc,.-s390x_pcc
469e1051a39Sopenharmony_ci___
470e1051a39Sopenharmony_ci}
471e1051a39Sopenharmony_ci
472e1051a39Sopenharmony_ci################
473e1051a39Sopenharmony_ci# int s390x_kdsa(unsigned int fc, void *param,
474e1051a39Sopenharmony_ci#                const unsigned char *in, size_t len)
475e1051a39Sopenharmony_ci{
476e1051a39Sopenharmony_cimy ($fc,$param,$in,$len) = map("%r$_",(2..5));
477e1051a39Sopenharmony_ci$code.=<<___;
478e1051a39Sopenharmony_ci.globl	s390x_kdsa
479e1051a39Sopenharmony_ci.type	s390x_kdsa,\@function
480e1051a39Sopenharmony_ci.align	16
481e1051a39Sopenharmony_cis390x_kdsa:
482e1051a39Sopenharmony_ci	lr	%r0,$fc
483e1051a39Sopenharmony_ci	l${g}r	%r1,$param
484e1051a39Sopenharmony_ci	lhi	%r2,0
485e1051a39Sopenharmony_ci
486e1051a39Sopenharmony_ci	.long	0xb93a0004	# kdsa %r0,$in
487e1051a39Sopenharmony_ci	brc	1,.-4		# pay attention to "partial completion"
488e1051a39Sopenharmony_ci	brc	7,.Lkdsa_err	# if CC==0 return 0, else return 1
489e1051a39Sopenharmony_ci.Lkdsa_out:
490e1051a39Sopenharmony_ci	br	$ra
491e1051a39Sopenharmony_ci.Lkdsa_err:
492e1051a39Sopenharmony_ci	lhi	%r2,1
493e1051a39Sopenharmony_ci	j	.Lkdsa_out
494e1051a39Sopenharmony_ci.size	s390x_kdsa,.-s390x_kdsa
495e1051a39Sopenharmony_ci___
496e1051a39Sopenharmony_ci}
497e1051a39Sopenharmony_ci
498e1051a39Sopenharmony_ci################
499e1051a39Sopenharmony_ci# void s390x_flip_endian32(unsigned char dst[32], const unsigned char src[32])
500e1051a39Sopenharmony_ci{
501e1051a39Sopenharmony_cimy ($dst,$src) = map("%r$_",(2..3));
502e1051a39Sopenharmony_ci$code.=<<___;
503e1051a39Sopenharmony_ci.globl	s390x_flip_endian32
504e1051a39Sopenharmony_ci.type	s390x_flip_endian32,\@function
505e1051a39Sopenharmony_ci.align	16
506e1051a39Sopenharmony_cis390x_flip_endian32:
507e1051a39Sopenharmony_ci	lrvg	%r0,0($src)
508e1051a39Sopenharmony_ci	lrvg	%r1,8($src)
509e1051a39Sopenharmony_ci	lrvg	%r4,16($src)
510e1051a39Sopenharmony_ci	lrvg	%r5,24($src)
511e1051a39Sopenharmony_ci	stg	%r0,24($dst)
512e1051a39Sopenharmony_ci	stg	%r1,16($dst)
513e1051a39Sopenharmony_ci	stg	%r4,8($dst)
514e1051a39Sopenharmony_ci	stg	%r5,0($dst)
515e1051a39Sopenharmony_ci	br	$ra
516e1051a39Sopenharmony_ci.size	s390x_flip_endian32,.-s390x_flip_endian32
517e1051a39Sopenharmony_ci___
518e1051a39Sopenharmony_ci}
519e1051a39Sopenharmony_ci
520e1051a39Sopenharmony_ci################
521e1051a39Sopenharmony_ci# void s390x_flip_endian64(unsigned char dst[64], const unsigned char src[64])
522e1051a39Sopenharmony_ci{
523e1051a39Sopenharmony_cimy ($dst,$src) = map("%r$_",(2..3));
524e1051a39Sopenharmony_ci$code.=<<___;
525e1051a39Sopenharmony_ci.globl	s390x_flip_endian64
526e1051a39Sopenharmony_ci.type	s390x_flip_endian64,\@function
527e1051a39Sopenharmony_ci.align	16
528e1051a39Sopenharmony_cis390x_flip_endian64:
529e1051a39Sopenharmony_ci	stmg	%r6,%r9,6*$SIZE_T($sp)
530e1051a39Sopenharmony_ci
531e1051a39Sopenharmony_ci	lrvg	%r0,0($src)
532e1051a39Sopenharmony_ci	lrvg	%r1,8($src)
533e1051a39Sopenharmony_ci	lrvg	%r4,16($src)
534e1051a39Sopenharmony_ci	lrvg	%r5,24($src)
535e1051a39Sopenharmony_ci	lrvg	%r6,32($src)
536e1051a39Sopenharmony_ci	lrvg	%r7,40($src)
537e1051a39Sopenharmony_ci	lrvg	%r8,48($src)
538e1051a39Sopenharmony_ci	lrvg	%r9,56($src)
539e1051a39Sopenharmony_ci	stg	%r0,56($dst)
540e1051a39Sopenharmony_ci	stg	%r1,48($dst)
541e1051a39Sopenharmony_ci	stg	%r4,40($dst)
542e1051a39Sopenharmony_ci	stg	%r5,32($dst)
543e1051a39Sopenharmony_ci	stg	%r6,24($dst)
544e1051a39Sopenharmony_ci	stg	%r7,16($dst)
545e1051a39Sopenharmony_ci	stg	%r8,8($dst)
546e1051a39Sopenharmony_ci	stg	%r9,0($dst)
547e1051a39Sopenharmony_ci
548e1051a39Sopenharmony_ci	lmg	%r6,%r9,6*$SIZE_T($sp)
549e1051a39Sopenharmony_ci	br	$ra
550e1051a39Sopenharmony_ci.size	s390x_flip_endian64,.-s390x_flip_endian64
551e1051a39Sopenharmony_ci___
552e1051a39Sopenharmony_ci}
553e1051a39Sopenharmony_ci
554e1051a39Sopenharmony_ci$code.=<<___;
555e1051a39Sopenharmony_ci.section	.init
556e1051a39Sopenharmony_ci	brasl	$ra,OPENSSL_cpuid_setup
557e1051a39Sopenharmony_ci___
558e1051a39Sopenharmony_ci
559e1051a39Sopenharmony_ci$code =~ s/\`([^\`]*)\`/eval $1/gem;
560e1051a39Sopenharmony_ciprint $code;
561e1051a39Sopenharmony_ciclose STDOUT or die "error closing STDOUT: $!";	# force flush
562