Blame crypto/s390xcpuid.pl

Packit Service 084de1
#! /usr/bin/env perl
Packit Service 084de1
# Copyright 2009-2020 The OpenSSL Project Authors. All Rights Reserved.
Packit Service 084de1
#
Packit Service 084de1
# Licensed under the OpenSSL license (the "License").  You may not use
Packit Service 084de1
# this file except in compliance with the License.  You can obtain a copy
Packit Service 084de1
# in the file LICENSE in the source distribution or at
Packit Service 084de1
# https://www.openssl.org/source/license.html
Packit Service 084de1
Packit Service 084de1
$flavour = shift;
Packit Service 084de1
Packit Service 084de1
if ($flavour =~ /3[12]/) {
Packit Service 084de1
	$SIZE_T=4;
Packit Service 084de1
	$g="";
Packit Service 084de1
} else {
Packit Service 084de1
	$SIZE_T=8;
Packit Service 084de1
	$g="g";
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
Packit Service 084de1
open STDOUT,">$output";
Packit Service 084de1
Packit Service 084de1
$ra="%r14";
Packit Service 084de1
$sp="%r15";
Packit Service 084de1
$stdframe=16*$SIZE_T+4*8;
Packit Service 084de1
Packit Service 084de1
$code=<<___;
Packit Service 084de1
#include "s390x_arch.h"
Packit Service 084de1
Packit Service 084de1
.text
Packit Service 084de1
Packit Service 084de1
.globl	OPENSSL_s390x_facilities
Packit Service 084de1
.type	OPENSSL_s390x_facilities,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
OPENSSL_s390x_facilities:
Packit Service 084de1
	lghi	%r0,0
Packit Service 084de1
	larl	%r4,OPENSSL_s390xcap_P
Packit Service 084de1
Packit Service 084de1
	stg	%r0,S390X_STFLE+8(%r4)	# wipe capability vectors
Packit Service 084de1
	stg	%r0,S390X_STFLE+16(%r4)
Packit Service 084de1
	stg	%r0,S390X_STFLE+24(%r4)
Packit Service 084de1
	stg	%r0,S390X_KIMD(%r4)
Packit Service 084de1
	stg	%r0,S390X_KIMD+8(%r4)
Packit Service 084de1
	stg	%r0,S390X_KLMD(%r4)
Packit Service 084de1
	stg	%r0,S390X_KLMD+8(%r4)
Packit Service 084de1
	stg	%r0,S390X_KM(%r4)
Packit Service 084de1
	stg	%r0,S390X_KM+8(%r4)
Packit Service 084de1
	stg	%r0,S390X_KMC(%r4)
Packit Service 084de1
	stg	%r0,S390X_KMC+8(%r4)
Packit Service 084de1
	stg	%r0,S390X_KMAC(%r4)
Packit Service 084de1
	stg	%r0,S390X_KMAC+8(%r4)
Packit Service 084de1
	stg	%r0,S390X_KMCTR(%r4)
Packit Service 084de1
	stg	%r0,S390X_KMCTR+8(%r4)
Packit Service 084de1
	stg	%r0,S390X_KMO(%r4)
Packit Service 084de1
	stg	%r0,S390X_KMO+8(%r4)
Packit Service 084de1
	stg	%r0,S390X_KMF(%r4)
Packit Service 084de1
	stg	%r0,S390X_KMF+8(%r4)
Packit Service 084de1
	stg	%r0,S390X_PRNO(%r4)
Packit Service 084de1
	stg	%r0,S390X_PRNO+8(%r4)
Packit Service 084de1
	stg	%r0,S390X_KMA(%r4)
Packit Service 084de1
	stg	%r0,S390X_KMA+8(%r4)
Packit Service 084de1
	stg	%r0,S390X_PCC(%r4)
Packit Service 084de1
	stg	%r0,S390X_PCC+8(%r4)
Packit Service 084de1
	stg	%r0,S390X_KDSA(%r4)
Packit Service 084de1
	stg	%r0,S390X_KDSA+8(%r4)
Packit Service 084de1
Packit Service 084de1
	.long	0xb2b04000		# stfle	0(%r4)
Packit Service 084de1
	brc	8,.Ldone
Packit Service 084de1
	lghi	%r0,1
Packit Service 084de1
	.long	0xb2b04000		# stfle 0(%r4)
Packit Service 084de1
	brc	8,.Ldone
Packit Service 084de1
	lghi	%r0,2
Packit Service 084de1
	.long	0xb2b04000		# stfle 0(%r4)
Packit Service 084de1
.Ldone:
Packit Service 084de1
	lmg	%r2,%r3,S390X_STFLE(%r4)
Packit Service 084de1
Packit Service 084de1
	tmhl	%r2,0x4000		# check for message-security-assist
Packit Service 084de1
	jz	.Lret
Packit Service 084de1
Packit Service 084de1
	lghi	%r0,S390X_QUERY		# query kimd capabilities
Packit Service 084de1
	la	%r1,S390X_KIMD(%r4)
Packit Service 084de1
	.long	0xb93e0002		# kimd %r0,%r2
Packit Service 084de1
Packit Service 084de1
	lghi	%r0,S390X_QUERY		# query klmd capabilities
Packit Service 084de1
	la	%r1,S390X_KLMD(%r4)
Packit Service 084de1
	.long	0xb93f0002		# klmd %r0,%r2
Packit Service 084de1
Packit Service 084de1
	lghi	%r0,S390X_QUERY		# query km capability vector
Packit Service 084de1
	la	%r1,S390X_KM(%r4)
Packit Service 084de1
	.long	0xb92e0042		# km %r4,%r2
Packit Service 084de1
Packit Service 084de1
	lghi	%r0,S390X_QUERY		# query kmc capability vector
Packit Service 084de1
	la	%r1,S390X_KMC(%r4)
Packit Service 084de1
	.long	0xb92f0042		# kmc %r4,%r2
Packit Service 084de1
Packit Service 084de1
	lghi	%r0,S390X_QUERY		# query kmac capability vector
Packit Service 084de1
	la	%r1,S390X_KMAC(%r4)
Packit Service 084de1
	.long	0xb91e0042		# kmac %r4,%r2
Packit Service 084de1
Packit Service 084de1
	tmhh	%r3,0x0008		# check for message-security-assist-3
Packit Service 084de1
	jz	.Lret
Packit Service 084de1
Packit Service 084de1
	lghi	%r0,S390X_QUERY		# query pcc capability vector
Packit Service 084de1
	la	%r1,S390X_PCC(%r4)
Packit Service 084de1
	.long	0xb92c0000		# pcc
Packit Service 084de1
Packit Service 084de1
	tmhh	%r3,0x0004		# check for message-security-assist-4
Packit Service 084de1
	jz	.Lret
Packit Service 084de1
Packit Service 084de1
	lghi	%r0,S390X_QUERY		# query kmctr capability vector
Packit Service 084de1
	la	%r1,S390X_KMCTR(%r4)
Packit Service 084de1
	.long	0xb92d2042		# kmctr %r4,%r2,%r2
Packit Service 084de1
Packit Service 084de1
	lghi	%r0,S390X_QUERY		# query kmo capability vector
Packit Service 084de1
	la	%r1,S390X_KMO(%r4)
Packit Service 084de1
	.long	0xb92b0042		# kmo %r4,%r2
Packit Service 084de1
Packit Service 084de1
	lghi	%r0,S390X_QUERY		# query kmf capability vector
Packit Service 084de1
	la	%r1,S390X_KMF(%r4)
Packit Service 084de1
	.long	0xb92a0042		# kmf %r4,%r2
Packit Service 084de1
Packit Service 084de1
	tml	%r2,0x40		# check for message-security-assist-5
Packit Service 084de1
	jz	.Lret
Packit Service 084de1
Packit Service 084de1
	lghi	%r0,S390X_QUERY		# query prno capability vector
Packit Service 084de1
	la	%r1,S390X_PRNO(%r4)
Packit Service 084de1
	.long	0xb93c0042		# prno %r4,%r2
Packit Service 084de1
Packit Service 084de1
	lg	%r2,S390X_STFLE+16(%r4)
Packit Service 084de1
Packit Service 084de1
	tmhl	%r2,0x2000		# check for message-security-assist-8
Packit Service 084de1
	jz	.Lret
Packit Service 084de1
Packit Service 084de1
	lghi	%r0,S390X_QUERY		# query kma capability vector
Packit Service 084de1
	la	%r1,S390X_KMA(%r4)
Packit Service 084de1
	.long	0xb9294022		# kma %r2,%r4,%r2
Packit Service 084de1
Packit Service 084de1
	tmhl	%r2,0x0010		# check for message-security-assist-9
Packit Service 084de1
	jz	.Lret
Packit Service 084de1
Packit Service 084de1
	lghi	%r0,S390X_QUERY		# query kdsa capability vector
Packit Service 084de1
	la	%r1,S390X_KDSA(%r4)
Packit Service 084de1
	.long	0xb93a0002		# kdsa %r0,%r2
Packit Service 084de1
Packit Service 084de1
.Lret:
Packit Service 084de1
	br	$ra
Packit Service 084de1
.size	OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities
Packit Service 084de1
Packit Service 084de1
.globl	OPENSSL_rdtsc
Packit Service 084de1
.type	OPENSSL_rdtsc,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
OPENSSL_rdtsc:
Packit Service 084de1
	larl	%r4,OPENSSL_s390xcap_P
Packit Service 084de1
	tm	S390X_STFLE+3(%r4),0x40	# check for store-clock-fast facility
Packit Service 084de1
	jz	.Lstck
Packit Service 084de1
Packit Service 084de1
	.long	0xb27cf010	# stckf 16($sp)
Packit Service 084de1
	lg	%r2,16($sp)
Packit Service 084de1
	br	$ra
Packit Service 084de1
.Lstck:
Packit Service 084de1
	stck	16($sp)
Packit Service 084de1
	lg	%r2,16($sp)
Packit Service 084de1
	br	$ra
Packit Service 084de1
.size	OPENSSL_rdtsc,.-OPENSSL_rdtsc
Packit Service 084de1
Packit Service 084de1
.globl	OPENSSL_atomic_add
Packit Service 084de1
.type	OPENSSL_atomic_add,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
OPENSSL_atomic_add:
Packit Service 084de1
	l	%r1,0(%r2)
Packit Service 084de1
.Lspin:	lr	%r0,%r1
Packit Service 084de1
	ar	%r0,%r3
Packit Service 084de1
	cs	%r1,%r0,0(%r2)
Packit Service 084de1
	brc	4,.Lspin
Packit Service 084de1
	lgfr	%r2,%r0		# OpenSSL expects the new value
Packit Service 084de1
	br	$ra
Packit Service 084de1
.size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
Packit Service 084de1
Packit Service 084de1
.globl	OPENSSL_wipe_cpu
Packit Service 084de1
.type	OPENSSL_wipe_cpu,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
OPENSSL_wipe_cpu:
Packit Service 084de1
	xgr	%r0,%r0
Packit Service 084de1
	xgr	%r1,%r1
Packit Service 084de1
	lgr	%r2,$sp
Packit Service 084de1
	xgr	%r3,%r3
Packit Service 084de1
	xgr	%r4,%r4
Packit Service 084de1
	lzdr	%f0
Packit Service 084de1
	lzdr	%f1
Packit Service 084de1
	lzdr	%f2
Packit Service 084de1
	lzdr	%f3
Packit Service 084de1
	lzdr	%f4
Packit Service 084de1
	lzdr	%f5
Packit Service 084de1
	lzdr	%f6
Packit Service 084de1
	lzdr	%f7
Packit Service 084de1
	br	$ra
Packit Service 084de1
.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
Packit Service 084de1
Packit Service 084de1
.globl	OPENSSL_cleanse
Packit Service 084de1
.type	OPENSSL_cleanse,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
OPENSSL_cleanse:
Packit Service 084de1
#if !defined(__s390x__) && !defined(__s390x)
Packit Service 084de1
	llgfr	%r3,%r3
Packit Service 084de1
#endif
Packit Service 084de1
	lghi	%r4,15
Packit Service 084de1
	lghi	%r0,0
Packit Service 084de1
	clgr	%r3,%r4
Packit Service 084de1
	jh	.Lot
Packit Service 084de1
	clgr	%r3,%r0
Packit Service 084de1
	bcr	8,%r14
Packit Service 084de1
.Little:
Packit Service 084de1
	stc	%r0,0(%r2)
Packit Service 084de1
	la	%r2,1(%r2)
Packit Service 084de1
	brctg	%r3,.Little
Packit Service 084de1
	br	%r14
Packit Service 084de1
.align	4
Packit Service 084de1
.Lot:	tmll	%r2,7
Packit Service 084de1
	jz	.Laligned
Packit Service 084de1
	stc	%r0,0(%r2)
Packit Service 084de1
	la	%r2,1(%r2)
Packit Service 084de1
	brctg	%r3,.Lot
Packit Service 084de1
.Laligned:
Packit Service 084de1
	srlg	%r4,%r3,3
Packit Service 084de1
.Loop:	stg	%r0,0(%r2)
Packit Service 084de1
	la	%r2,8(%r2)
Packit Service 084de1
	brctg	%r4,.Loop
Packit Service 084de1
	lghi	%r4,7
Packit Service 084de1
	ngr	%r3,%r4
Packit Service 084de1
	jnz	.Little
Packit Service 084de1
	br	$ra
Packit Service 084de1
.size	OPENSSL_cleanse,.-OPENSSL_cleanse
Packit Service 084de1
Packit Service 084de1
.globl	CRYPTO_memcmp
Packit Service 084de1
.type	CRYPTO_memcmp,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
CRYPTO_memcmp:
Packit Service 084de1
#if !defined(__s390x__) && !defined(__s390x)
Packit Service 084de1
	llgfr	%r4,%r4
Packit Service 084de1
#endif
Packit Service 084de1
	lghi	%r5,0
Packit Service 084de1
	clgr	%r4,%r5
Packit Service 084de1
	je	.Lno_data
Packit Service 084de1
Packit Service 084de1
.Loop_cmp:
Packit Service 084de1
	llgc	%r0,0(%r2)
Packit Service 084de1
	la	%r2,1(%r2)
Packit Service 084de1
	llgc	%r1,0(%r3)
Packit Service 084de1
	la	%r3,1(%r3)
Packit Service 084de1
	xr	%r1,%r0
Packit Service 084de1
	or	%r5,%r1
Packit Service 084de1
	brctg	%r4,.Loop_cmp
Packit Service 084de1
Packit Service 084de1
	lnr	%r5,%r5
Packit Service 084de1
	srl	%r5,31
Packit Service 084de1
.Lno_data:
Packit Service 084de1
	lgr	%r2,%r5
Packit Service 084de1
	br	$ra
Packit Service 084de1
.size	CRYPTO_memcmp,.-CRYPTO_memcmp
Packit Service 084de1
Packit Service 084de1
.globl	OPENSSL_instrument_bus
Packit Service 084de1
.type	OPENSSL_instrument_bus,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
OPENSSL_instrument_bus:
Packit Service 084de1
	lghi	%r2,0
Packit Service 084de1
	br	%r14
Packit Service 084de1
.size	OPENSSL_instrument_bus,.-OPENSSL_instrument_bus
Packit Service 084de1
Packit Service 084de1
.globl	OPENSSL_instrument_bus2
Packit Service 084de1
.type	OPENSSL_instrument_bus2,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
OPENSSL_instrument_bus2:
Packit Service 084de1
	lghi	%r2,0
Packit Service 084de1
	br	$ra
Packit Service 084de1
.size	OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
Packit Service 084de1
Packit Service 084de1
.globl	OPENSSL_vx_probe
Packit Service 084de1
.type	OPENSSL_vx_probe,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
OPENSSL_vx_probe:
Packit Service 084de1
	.word	0xe700,0x0000,0x0044	# vzero %v0
Packit Service 084de1
	br	$ra
Packit Service 084de1
.size	OPENSSL_vx_probe,.-OPENSSL_vx_probe
Packit Service 084de1
___
Packit Service 084de1
Packit Service 084de1
{
Packit Service 084de1
################
Packit Service 084de1
# void s390x_kimd(const unsigned char *in, size_t len, unsigned int fc,
Packit Service 084de1
#                 void *param)
Packit Service 084de1
my ($in,$len,$fc,$param) = map("%r$_",(2..5));
Packit Service 084de1
$code.=<<___;
Packit Service 084de1
.globl	s390x_kimd
Packit Service 084de1
.type	s390x_kimd,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
s390x_kimd:
Packit Service 084de1
	llgfr	%r0,$fc
Packit Service 084de1
	lgr	%r1,$param
Packit Service 084de1
Packit Service 084de1
	.long	0xb93e0002	# kimd %r0,%r2
Packit Service 084de1
	brc	1,.-4		# pay attention to "partial completion"
Packit Service 084de1
Packit Service 084de1
	br	$ra
Packit Service 084de1
.size	s390x_kimd,.-s390x_kimd
Packit Service 084de1
___
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
{
Packit Service 084de1
################
Packit Service 084de1
# void s390x_klmd(const unsigned char *in, size_t inlen, unsigned char *out,
Packit Service 084de1
#                 size_t outlen, unsigned int fc, void *param)
Packit Service 084de1
my ($in,$inlen,$out,$outlen,$fc) = map("%r$_",(2..6));
Packit Service 084de1
$code.=<<___;
Packit Service 084de1
.globl	s390x_klmd
Packit Service 084de1
.type	s390x_klmd,\@function
Packit Service 084de1
.align	32
Packit Service 084de1
s390x_klmd:
Packit Service 084de1
	llgfr	%r0,$fc
Packit Service 084de1
	l${g}	%r1,$stdframe($sp)
Packit Service 084de1
Packit Service 084de1
	.long	0xb93f0042	# klmd %r4,%r2
Packit Service 084de1
	brc	1,.-4		# pay attention to "partial completion"
Packit Service 084de1
Packit Service 084de1
	br	$ra
Packit Service 084de1
.size	s390x_klmd,.-s390x_klmd
Packit Service 084de1
___
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
################
Packit Service 084de1
# void s390x_km(const unsigned char *in, size_t len, unsigned char *out,
Packit Service 084de1
#               unsigned int fc, void *param)
Packit Service 084de1
{
Packit Service 084de1
my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
Packit Service 084de1
$code.=<<___;
Packit Service 084de1
.globl	s390x_km
Packit Service 084de1
.type	s390x_km,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
s390x_km:
Packit Service 084de1
	lr	%r0,$fc
Packit Service 084de1
	l${g}r	%r1,$param
Packit Service 084de1
Packit Service 084de1
	.long	0xb92e0042	# km $out,$in
Packit Service 084de1
	brc	1,.-4		# pay attention to "partial completion"
Packit Service 084de1
Packit Service 084de1
	br	$ra
Packit Service 084de1
.size	s390x_km,.-s390x_km
Packit Service 084de1
___
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
################
Packit Service 084de1
# void s390x_kmac(const unsigned char *in, size_t len, unsigned int fc,
Packit Service 084de1
#                 void *param)
Packit Service 084de1
{
Packit Service 084de1
my ($in,$len,$fc,$param) = map("%r$_",(2..5));
Packit Service 084de1
$code.=<<___;
Packit Service 084de1
.globl	s390x_kmac
Packit Service 084de1
.type	s390x_kmac,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
s390x_kmac:
Packit Service 084de1
	lr	%r0,$fc
Packit Service 084de1
	l${g}r	%r1,$param
Packit Service 084de1
Packit Service 084de1
	.long	0xb91e0002	# kmac %r0,$in
Packit Service 084de1
	brc	1,.-4		# pay attention to "partial completion"
Packit Service 084de1
Packit Service 084de1
	br	$ra
Packit Service 084de1
.size	s390x_kmac,.-s390x_kmac
Packit Service 084de1
___
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
################
Packit Service 084de1
# void s390x_kmo(const unsigned char *in, size_t len, unsigned char *out,
Packit Service 084de1
#                unsigned int fc, void *param)
Packit Service 084de1
{
Packit Service 084de1
my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
Packit Service 084de1
$code.=<<___;
Packit Service 084de1
.globl	s390x_kmo
Packit Service 084de1
.type	s390x_kmo,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
s390x_kmo:
Packit Service 084de1
	lr	%r0,$fc
Packit Service 084de1
	l${g}r	%r1,$param
Packit Service 084de1
Packit Service 084de1
	.long	0xb92b0042	# kmo $out,$in
Packit Service 084de1
	brc	1,.-4		# pay attention to "partial completion"
Packit Service 084de1
Packit Service 084de1
	br	$ra
Packit Service 084de1
.size	s390x_kmo,.-s390x_kmo
Packit Service 084de1
___
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
################
Packit Service 084de1
# void s390x_kmf(const unsigned char *in, size_t len, unsigned char *out,
Packit Service 084de1
#                unsigned int fc, void *param)
Packit Service 084de1
{
Packit Service 084de1
my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
Packit Service 084de1
$code.=<<___;
Packit Service 084de1
.globl	s390x_kmf
Packit Service 084de1
.type	s390x_kmf,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
s390x_kmf:
Packit Service 084de1
	lr	%r0,$fc
Packit Service 084de1
	l${g}r	%r1,$param
Packit Service 084de1
Packit Service 084de1
	.long	0xb92a0042	# kmf $out,$in
Packit Service 084de1
	brc	1,.-4		# pay attention to "partial completion"
Packit Service 084de1
Packit Service 084de1
	br	$ra
Packit Service 084de1
.size	s390x_kmf,.-s390x_kmf
Packit Service 084de1
___
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
################
Packit Service 084de1
# void s390x_kma(const unsigned char *aad, size_t alen,
Packit Service 084de1
#                const unsigned char *in, size_t len,
Packit Service 084de1
#                unsigned char *out, unsigned int fc, void *param)
Packit Service 084de1
{
Packit Service 084de1
my ($aad,$alen,$in,$len,$out) = map("%r$_",(2..6));
Packit Service 084de1
$code.=<<___;
Packit Service 084de1
.globl	s390x_kma
Packit Service 084de1
.type	s390x_kma,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
s390x_kma:
Packit Service 084de1
	st${g}	$out,6*$SIZE_T($sp)
Packit Service 084de1
	lm${g}	%r0,%r1,$stdframe($sp)
Packit Service 084de1
Packit Service 084de1
	.long	0xb9292064	# kma $out,$aad,$in
Packit Service 084de1
	brc	1,.-4		# pay attention to "partial completion"
Packit Service 084de1
Packit Service 084de1
	l${g}	$out,6*$SIZE_T($sp)
Packit Service 084de1
	br	$ra
Packit Service 084de1
.size	s390x_kma,.-s390x_kma
Packit Service 084de1
___
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
################
Packit Service 084de1
# int s390x_pcc(unsigned int fc, void *param)
Packit Service 084de1
{
Packit Service 084de1
my ($fc,$param) = map("%r$_",(2..3));
Packit Service 084de1
$code.=<<___;
Packit Service 084de1
.globl	s390x_pcc
Packit Service 084de1
.type	s390x_pcc,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
s390x_pcc:
Packit Service 084de1
	lr	%r0,$fc
Packit Service 084de1
	l${g}r	%r1,$param
Packit Service 084de1
	lhi	%r2,0
Packit Service 084de1
Packit Service 084de1
	.long	0xb92c0000	# pcc
Packit Service 084de1
	brc	1,.-4		# pay attention to "partial completion"
Packit Service 084de1
	brc	7,.Lpcc_err	# if CC==0 return 0, else return 1
Packit Service 084de1
.Lpcc_out:
Packit Service 084de1
	br	$ra
Packit Service 084de1
.Lpcc_err:
Packit Service 084de1
	lhi	%r2,1
Packit Service 084de1
	j	.Lpcc_out
Packit Service 084de1
.size	s390x_pcc,.-s390x_pcc
Packit Service 084de1
___
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
################
Packit Service 084de1
# int s390x_kdsa(unsigned int fc, void *param,
Packit Service 084de1
#                const unsigned char *in, size_t len)
Packit Service 084de1
{
Packit Service 084de1
my ($fc,$param,$in,$len) = map("%r$_",(2..5));
Packit Service 084de1
$code.=<<___;
Packit Service 084de1
.globl	s390x_kdsa
Packit Service 084de1
.type	s390x_kdsa,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
s390x_kdsa:
Packit Service 084de1
	lr	%r0,$fc
Packit Service 084de1
	l${g}r	%r1,$param
Packit Service 084de1
	lhi	%r2,0
Packit Service 084de1
Packit Service 084de1
	.long	0xb93a0004	# kdsa %r0,$in
Packit Service 084de1
	brc	1,.-4		# pay attention to "partial completion"
Packit Service 084de1
	brc	7,.Lkdsa_err	# if CC==0 return 0, else return 1
Packit Service 084de1
.Lkdsa_out:
Packit Service 084de1
	br	$ra
Packit Service 084de1
.Lkdsa_err:
Packit Service 084de1
	lhi	%r2,1
Packit Service 084de1
	j	.Lkdsa_out
Packit Service 084de1
.size	s390x_kdsa,.-s390x_kdsa
Packit Service 084de1
___
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
################
Packit Service 084de1
# void s390x_flip_endian32(unsigned char dst[32], const unsigned char src[32])
Packit Service 084de1
{
Packit Service 084de1
my ($dst,$src) = map("%r$_",(2..3));
Packit Service 084de1
$code.=<<___;
Packit Service 084de1
.globl	s390x_flip_endian32
Packit Service 084de1
.type	s390x_flip_endian32,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
s390x_flip_endian32:
Packit Service 084de1
	lrvg	%r0,0(%r0,$src)
Packit Service 084de1
	lrvg	%r1,8(%r0,$src)
Packit Service 084de1
	lrvg	%r4,16(%r0,$src)
Packit Service 084de1
	lrvg	%r5,24(%r0,$src)
Packit Service 084de1
	stg	%r0,24(%r0,$dst)
Packit Service 084de1
	stg	%r1,16(%r0,$dst)
Packit Service 084de1
	stg	%r4,8(%r0,$dst)
Packit Service 084de1
	stg	%r5,0(%r0,$dst)
Packit Service 084de1
	br	$ra
Packit Service 084de1
.size	s390x_flip_endian32,.-s390x_flip_endian32
Packit Service 084de1
___
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
################
Packit Service 084de1
# void s390x_flip_endian64(unsigned char dst[64], const unsigned char src[64])
Packit Service 084de1
{
Packit Service 084de1
my ($dst,$src) = map("%r$_",(2..3));
Packit Service 084de1
$code.=<<___;
Packit Service 084de1
.globl	s390x_flip_endian64
Packit Service 084de1
.type	s390x_flip_endian64,\@function
Packit Service 084de1
.align	16
Packit Service 084de1
s390x_flip_endian64:
Packit Service 084de1
	stmg	%r6,%r9,6*$SIZE_T($sp)
Packit Service 084de1
Packit Service 084de1
	lrvg	%r0,0(%r0,$src)
Packit Service 084de1
	lrvg	%r1,8(%r0,$src)
Packit Service 084de1
	lrvg	%r4,16(%r0,$src)
Packit Service 084de1
	lrvg	%r5,24(%r0,$src)
Packit Service 084de1
	lrvg	%r6,32(%r0,$src)
Packit Service 084de1
	lrvg	%r7,40(%r0,$src)
Packit Service 084de1
	lrvg	%r8,48(%r0,$src)
Packit Service 084de1
	lrvg	%r9,56(%r0,$src)
Packit Service 084de1
	stg	%r0,56(%r0,$dst)
Packit Service 084de1
	stg	%r1,48(%r0,$dst)
Packit Service 084de1
	stg	%r4,40(%r0,$dst)
Packit Service 084de1
	stg	%r5,32(%r0,$dst)
Packit Service 084de1
	stg	%r6,24(%r0,$dst)
Packit Service 084de1
	stg	%r7,16(%r0,$dst)
Packit Service 084de1
	stg	%r8,8(%r0,$dst)
Packit Service 084de1
	stg	%r9,0(%r0,$dst)
Packit Service 084de1
Packit Service 084de1
	lmg	%r6,%r9,6*$SIZE_T($sp)
Packit Service 084de1
	br	$ra
Packit Service 084de1
.size	s390x_flip_endian64,.-s390x_flip_endian64
Packit Service 084de1
___
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
$code.=<<___;
Packit Service 084de1
.section	.init
Packit Service 084de1
	brasl	$ra,OPENSSL_cpuid_setup
Packit Service 084de1
___
Packit Service 084de1
Packit Service 084de1
$code =~ s/\`([^\`]*)\`/eval $1/gem;
Packit Service 084de1
print $code;
Packit Service 084de1
close STDOUT or die "error closing STDOUT: $!";	# force flush