2017-10-02 21:53:00 +08:00
|
|
|
#! /usr/bin/env perl
|
2020-04-23 20:55:52 +08:00
|
|
|
# Copyright 2009-2020 The OpenSSL Project Authors. All Rights Reserved.
|
2017-10-02 21:53:00 +08:00
|
|
|
#
|
2018-12-06 21:03:01 +08:00
|
|
|
# Licensed under the Apache License 2.0 (the "License"). You may not use
|
2017-10-02 21:53:00 +08:00
|
|
|
# this file except in compliance with the License. You can obtain a copy
|
|
|
|
# in the file LICENSE in the source distribution or at
|
|
|
|
# https://www.openssl.org/source/license.html
|
|
|
|
|
Unify all assembler file generators
They now generally conform to the following argument sequence:
script.pl "$(PERLASM_SCHEME)" [ C preprocessor arguments ... ] \
$(PROCESSOR) <output file>
However, in the spirit of being able to use these scripts manually,
they also allow for no argument, or for only the flavour, or for only
the output file. This is done by only using the last argument as
output file if it's a file (it has an extension), and only using the
first argument as flavour if it isn't a file (it doesn't have an
extension).
While we're at it, we make all $xlate calls the same, i.e. the $output
argument is always quoted, and we always die on error when trying to
start $xlate.
There's a perl lesson in this, regarding operator priority...
This will always succeed, even when it fails:
open FOO, "something" || die "ERR: $!";
The reason is that '||' has higher priority than list operators (a
function is essentially a list operator and gobbles up everything
following it that isn't lower priority), and since a non-empty string
is always true, so that ends up being exactly the same as:
open FOO, "something";
This, however, will fail if "something" can't be opened:
open FOO, "something" or die "ERR: $!";
The reason is that 'or' has lower priority that list operators,
i.e. it's performed after the 'open' call.
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/9884)
2019-09-13 06:06:46 +08:00
|
|
|
# $output is the last argument if it looks like a file (it has an extension)
|
|
|
|
# $flavour is the first argument if it doesn't look like a file
|
|
|
|
$output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef;
|
|
|
|
$flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef;
|
2017-10-02 21:53:00 +08:00
|
|
|
|
|
|
|
if ($flavour =~ /3[12]/) {
|
|
|
|
$SIZE_T=4;
|
|
|
|
$g="";
|
|
|
|
} else {
|
|
|
|
$SIZE_T=8;
|
|
|
|
$g="g";
|
|
|
|
}
|
2009-02-09 23:42:04 +08:00
|
|
|
|
Unify all assembler file generators
They now generally conform to the following argument sequence:
script.pl "$(PERLASM_SCHEME)" [ C preprocessor arguments ... ] \
$(PROCESSOR) <output file>
However, in the spirit of being able to use these scripts manually,
they also allow for no argument, or for only the flavour, or for only
the output file. This is done by only using the last argument as
output file if it's a file (it has an extension), and only using the
first argument as flavour if it isn't a file (it doesn't have an
extension).
While we're at it, we make all $xlate calls the same, i.e. the $output
argument is always quoted, and we always die on error when trying to
start $xlate.
There's a perl lesson in this, regarding operator priority...
This will always succeed, even when it fails:
open FOO, "something" || die "ERR: $!";
The reason is that '||' has higher priority than list operators (a
function is essentially a list operator and gobbles up everything
following it that isn't lower priority), and since a non-empty string
is always true, so that ends up being exactly the same as:
open FOO, "something";
This, however, will fail if "something" can't be opened:
open FOO, "something" or die "ERR: $!";
The reason is that 'or' has lower priority that list operators,
i.e. it's performed after the 'open' call.
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/9884)
2019-09-13 06:06:46 +08:00
|
|
|
$output and open STDOUT,">$output";
|
2017-10-02 21:53:00 +08:00
|
|
|
|
|
|
|
$ra="%r14";
|
|
|
|
$sp="%r15";
|
|
|
|
$stdframe=16*$SIZE_T+4*8;
|
|
|
|
|
|
|
|
$code=<<___;
|
2017-10-02 17:24:02 +08:00
|
|
|
#include "s390x_arch.h"
|
|
|
|
|
2017-10-02 21:53:00 +08:00
|
|
|
.text
|
|
|
|
|
2009-02-09 23:42:04 +08:00
|
|
|
.globl OPENSSL_s390x_facilities
|
2017-10-02 21:53:00 +08:00
|
|
|
.type OPENSSL_s390x_facilities,\@function
|
2009-02-09 23:42:04 +08:00
|
|
|
.align 16
|
|
|
|
OPENSSL_s390x_facilities:
|
|
|
|
lghi %r0,0
|
2016-04-15 22:39:22 +08:00
|
|
|
larl %r4,OPENSSL_s390xcap_P
|
2017-10-02 17:24:02 +08:00
|
|
|
|
|
|
|
stg %r0,S390X_STFLE+8(%r4) # wipe capability vectors
|
|
|
|
stg %r0,S390X_STFLE+16(%r4)
|
|
|
|
stg %r0,S390X_STFLE+24(%r4)
|
2017-01-31 00:37:54 +08:00
|
|
|
|
|
|
|
.long 0xb2b04000 # stfle 0(%r4)
|
|
|
|
brc 8,.Ldone
|
|
|
|
lghi %r0,1
|
|
|
|
.long 0xb2b04000 # stfle 0(%r4)
|
|
|
|
brc 8,.Ldone
|
|
|
|
lghi %r0,2
|
|
|
|
.long 0xb2b04000 # stfle 0(%r4)
|
|
|
|
.Ldone:
|
|
|
|
br $ra
|
|
|
|
.size OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities
|
|
|
|
|
|
|
|
.globl OPENSSL_s390x_functions
|
|
|
|
.type OPENSSL_s390x_functions,\@function
|
|
|
|
.align 16
|
|
|
|
OPENSSL_s390x_functions:
|
|
|
|
lghi %r0,0
|
|
|
|
larl %r4,OPENSSL_s390xcap_P
|
|
|
|
|
|
|
|
stg %r0,S390X_KIMD(%r4) # wipe capability vectors
|
2017-10-02 17:24:02 +08:00
|
|
|
stg %r0,S390X_KIMD+8(%r4)
|
|
|
|
stg %r0,S390X_KLMD(%r4)
|
|
|
|
stg %r0,S390X_KLMD+8(%r4)
|
|
|
|
stg %r0,S390X_KM(%r4)
|
|
|
|
stg %r0,S390X_KM+8(%r4)
|
|
|
|
stg %r0,S390X_KMC(%r4)
|
|
|
|
stg %r0,S390X_KMC+8(%r4)
|
|
|
|
stg %r0,S390X_KMAC(%r4)
|
|
|
|
stg %r0,S390X_KMAC+8(%r4)
|
|
|
|
stg %r0,S390X_KMCTR(%r4)
|
|
|
|
stg %r0,S390X_KMCTR+8(%r4)
|
|
|
|
stg %r0,S390X_KMO(%r4)
|
|
|
|
stg %r0,S390X_KMO+8(%r4)
|
|
|
|
stg %r0,S390X_KMF(%r4)
|
|
|
|
stg %r0,S390X_KMF+8(%r4)
|
|
|
|
stg %r0,S390X_PRNO(%r4)
|
|
|
|
stg %r0,S390X_PRNO+8(%r4)
|
|
|
|
stg %r0,S390X_KMA(%r4)
|
|
|
|
stg %r0,S390X_KMA+8(%r4)
|
2019-06-27 07:07:54 +08:00
|
|
|
stg %r0,S390X_PCC(%r4)
|
|
|
|
stg %r0,S390X_PCC+8(%r4)
|
|
|
|
stg %r0,S390X_KDSA(%r4)
|
|
|
|
stg %r0,S390X_KDSA+8(%r4)
|
2017-10-02 17:24:02 +08:00
|
|
|
|
|
|
|
lmg %r2,%r3,S390X_STFLE(%r4)
|
2019-06-27 07:07:54 +08:00
|
|
|
|
2017-10-02 17:24:02 +08:00
|
|
|
tmhl %r2,0x4000 # check for message-security-assist
|
2016-04-15 22:39:22 +08:00
|
|
|
jz .Lret
|
|
|
|
|
2017-10-02 17:24:02 +08:00
|
|
|
lghi %r0,S390X_QUERY # query kimd capabilities
|
|
|
|
la %r1,S390X_KIMD(%r4)
|
|
|
|
.long 0xb93e0002 # kimd %r0,%r2
|
|
|
|
|
|
|
|
lghi %r0,S390X_QUERY # query klmd capabilities
|
|
|
|
la %r1,S390X_KLMD(%r4)
|
|
|
|
.long 0xb93f0002 # klmd %r0,%r2
|
|
|
|
|
|
|
|
lghi %r0,S390X_QUERY # query km capability vector
|
|
|
|
la %r1,S390X_KM(%r4)
|
|
|
|
.long 0xb92e0042 # km %r4,%r2
|
2016-04-15 22:39:22 +08:00
|
|
|
|
2017-10-02 17:24:02 +08:00
|
|
|
lghi %r0,S390X_QUERY # query kmc capability vector
|
|
|
|
la %r1,S390X_KMC(%r4)
|
|
|
|
.long 0xb92f0042 # kmc %r4,%r2
|
2016-04-15 22:39:22 +08:00
|
|
|
|
2017-10-02 17:24:02 +08:00
|
|
|
lghi %r0,S390X_QUERY # query kmac capability vector
|
|
|
|
la %r1,S390X_KMAC(%r4)
|
|
|
|
.long 0xb91e0042 # kmac %r4,%r2
|
2016-04-15 22:39:22 +08:00
|
|
|
|
2019-09-25 05:03:19 +08:00
|
|
|
tmhh %r3,0x0008 # check for message-security-assist-3
|
2019-06-27 07:07:54 +08:00
|
|
|
jz .Lret
|
|
|
|
|
|
|
|
lghi %r0,S390X_QUERY # query pcc capability vector
|
|
|
|
la %r1,S390X_PCC(%r4)
|
|
|
|
.long 0xb92c0000 # pcc
|
|
|
|
|
2017-10-02 17:24:02 +08:00
|
|
|
tmhh %r3,0x0004 # check for message-security-assist-4
|
2016-04-15 22:39:22 +08:00
|
|
|
jz .Lret
|
|
|
|
|
2017-10-02 17:24:02 +08:00
|
|
|
lghi %r0,S390X_QUERY # query kmctr capability vector
|
|
|
|
la %r1,S390X_KMCTR(%r4)
|
|
|
|
.long 0xb92d2042 # kmctr %r4,%r2,%r2
|
|
|
|
|
|
|
|
lghi %r0,S390X_QUERY # query kmo capability vector
|
|
|
|
la %r1,S390X_KMO(%r4)
|
|
|
|
.long 0xb92b0042 # kmo %r4,%r2
|
|
|
|
|
|
|
|
lghi %r0,S390X_QUERY # query kmf capability vector
|
|
|
|
la %r1,S390X_KMF(%r4)
|
|
|
|
.long 0xb92a0042 # kmf %r4,%r2
|
|
|
|
|
|
|
|
tml %r2,0x40 # check for message-security-assist-5
|
|
|
|
jz .Lret
|
|
|
|
|
|
|
|
lghi %r0,S390X_QUERY # query prno capability vector
|
|
|
|
la %r1,S390X_PRNO(%r4)
|
|
|
|
.long 0xb93c0042 # prno %r4,%r2
|
|
|
|
|
|
|
|
lg %r2,S390X_STFLE+16(%r4)
|
2019-06-27 07:07:54 +08:00
|
|
|
|
2017-10-02 17:24:02 +08:00
|
|
|
tmhl %r2,0x2000 # check for message-security-assist-8
|
|
|
|
jz .Lret
|
|
|
|
|
|
|
|
lghi %r0,S390X_QUERY # query kma capability vector
|
|
|
|
la %r1,S390X_KMA(%r4)
|
|
|
|
.long 0xb9294022 # kma %r2,%r4,%r2
|
2016-04-15 22:39:22 +08:00
|
|
|
|
2019-06-27 07:07:54 +08:00
|
|
|
tmhl %r2,0x0010 # check for message-security-assist-9
|
|
|
|
jz .Lret
|
|
|
|
|
|
|
|
lghi %r0,S390X_QUERY # query kdsa capability vector
|
|
|
|
la %r1,S390X_KDSA(%r4)
|
|
|
|
.long 0xb93a0002 # kdsa %r0,%r2
|
|
|
|
|
2016-04-15 22:39:22 +08:00
|
|
|
.Lret:
|
2017-10-02 21:53:00 +08:00
|
|
|
br $ra
|
2017-01-31 00:37:54 +08:00
|
|
|
.size OPENSSL_s390x_functions,.-OPENSSL_s390x_functions
|
2009-02-09 23:42:04 +08:00
|
|
|
|
|
|
|
.globl OPENSSL_rdtsc
|
2017-10-02 21:53:00 +08:00
|
|
|
.type OPENSSL_rdtsc,\@function
|
2009-02-09 23:42:04 +08:00
|
|
|
.align 16
|
|
|
|
OPENSSL_rdtsc:
|
2018-02-08 01:49:29 +08:00
|
|
|
larl %r4,OPENSSL_s390xcap_P
|
|
|
|
tm S390X_STFLE+3(%r4),0x40 # check for store-clock-fast facility
|
|
|
|
jz .Lstck
|
|
|
|
|
|
|
|
.long 0xb27cf010 # stckf 16($sp)
|
|
|
|
lg %r2,16($sp)
|
|
|
|
br $ra
|
|
|
|
.Lstck:
|
2017-10-02 21:53:00 +08:00
|
|
|
stck 16($sp)
|
|
|
|
lg %r2,16($sp)
|
|
|
|
br $ra
|
2009-02-09 23:42:04 +08:00
|
|
|
.size OPENSSL_rdtsc,.-OPENSSL_rdtsc
|
|
|
|
|
|
|
|
.globl OPENSSL_atomic_add
|
2017-10-02 21:53:00 +08:00
|
|
|
.type OPENSSL_atomic_add,\@function
|
2009-02-09 23:42:04 +08:00
|
|
|
.align 16
|
|
|
|
OPENSSL_atomic_add:
|
|
|
|
l %r1,0(%r2)
|
|
|
|
.Lspin: lr %r0,%r1
|
|
|
|
ar %r0,%r3
|
|
|
|
cs %r1,%r0,0(%r2)
|
|
|
|
brc 4,.Lspin
|
|
|
|
lgfr %r2,%r0 # OpenSSL expects the new value
|
2017-10-02 21:53:00 +08:00
|
|
|
br $ra
|
2009-02-09 23:42:04 +08:00
|
|
|
.size OPENSSL_atomic_add,.-OPENSSL_atomic_add
|
|
|
|
|
|
|
|
.globl OPENSSL_wipe_cpu
|
2017-10-02 21:53:00 +08:00
|
|
|
.type OPENSSL_wipe_cpu,\@function
|
2009-02-09 23:42:04 +08:00
|
|
|
.align 16
|
|
|
|
OPENSSL_wipe_cpu:
|
|
|
|
xgr %r0,%r0
|
|
|
|
xgr %r1,%r1
|
2017-10-02 21:53:00 +08:00
|
|
|
lgr %r2,$sp
|
2009-02-09 23:42:04 +08:00
|
|
|
xgr %r3,%r3
|
|
|
|
xgr %r4,%r4
|
|
|
|
lzdr %f0
|
|
|
|
lzdr %f1
|
|
|
|
lzdr %f2
|
|
|
|
lzdr %f3
|
|
|
|
lzdr %f4
|
|
|
|
lzdr %f5
|
|
|
|
lzdr %f6
|
|
|
|
lzdr %f7
|
2017-10-02 21:53:00 +08:00
|
|
|
br $ra
|
2009-02-09 23:42:04 +08:00
|
|
|
.size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
|
|
|
|
|
|
|
|
.globl OPENSSL_cleanse
|
2017-10-02 21:53:00 +08:00
|
|
|
.type OPENSSL_cleanse,\@function
|
2009-02-09 23:42:04 +08:00
|
|
|
.align 16
|
|
|
|
OPENSSL_cleanse:
|
2010-11-30 04:52:43 +08:00
|
|
|
#if !defined(__s390x__) && !defined(__s390x)
|
|
|
|
llgfr %r3,%r3
|
|
|
|
#endif
|
2009-02-09 23:42:04 +08:00
|
|
|
lghi %r4,15
|
|
|
|
lghi %r0,0
|
|
|
|
clgr %r3,%r4
|
|
|
|
jh .Lot
|
2010-01-24 22:54:24 +08:00
|
|
|
clgr %r3,%r0
|
|
|
|
bcr 8,%r14
|
2009-02-09 23:42:04 +08:00
|
|
|
.Little:
|
|
|
|
stc %r0,0(%r2)
|
|
|
|
la %r2,1(%r2)
|
|
|
|
brctg %r3,.Little
|
|
|
|
br %r14
|
|
|
|
.align 4
|
|
|
|
.Lot: tmll %r2,7
|
|
|
|
jz .Laligned
|
|
|
|
stc %r0,0(%r2)
|
|
|
|
la %r2,1(%r2)
|
|
|
|
brctg %r3,.Lot
|
|
|
|
.Laligned:
|
|
|
|
srlg %r4,%r3,3
|
|
|
|
.Loop: stg %r0,0(%r2)
|
|
|
|
la %r2,8(%r2)
|
|
|
|
brctg %r4,.Loop
|
|
|
|
lghi %r4,7
|
|
|
|
ngr %r3,%r4
|
|
|
|
jnz .Little
|
2017-10-02 21:53:00 +08:00
|
|
|
br $ra
|
2009-02-09 23:42:04 +08:00
|
|
|
.size OPENSSL_cleanse,.-OPENSSL_cleanse
|
2010-01-19 20:24:59 +08:00
|
|
|
|
2016-05-15 23:01:15 +08:00
|
|
|
.globl CRYPTO_memcmp
|
2017-10-02 21:53:00 +08:00
|
|
|
.type CRYPTO_memcmp,\@function
|
2016-05-15 23:01:15 +08:00
|
|
|
.align 16
|
|
|
|
CRYPTO_memcmp:
|
|
|
|
#if !defined(__s390x__) && !defined(__s390x)
|
|
|
|
llgfr %r4,%r4
|
|
|
|
#endif
|
|
|
|
lghi %r5,0
|
|
|
|
clgr %r4,%r5
|
|
|
|
je .Lno_data
|
|
|
|
|
|
|
|
.Loop_cmp:
|
2016-05-31 04:16:31 +08:00
|
|
|
llgc %r0,0(%r2)
|
2016-05-15 23:01:15 +08:00
|
|
|
la %r2,1(%r2)
|
2016-05-31 04:16:31 +08:00
|
|
|
llgc %r1,0(%r3)
|
2016-05-15 23:01:15 +08:00
|
|
|
la %r3,1(%r3)
|
|
|
|
xr %r1,%r0
|
|
|
|
or %r5,%r1
|
|
|
|
brctg %r4,.Loop_cmp
|
|
|
|
|
|
|
|
lnr %r5,%r5
|
|
|
|
srl %r5,31
|
|
|
|
.Lno_data:
|
|
|
|
lgr %r2,%r5
|
2017-10-02 21:53:00 +08:00
|
|
|
br $ra
|
2016-05-15 23:01:15 +08:00
|
|
|
.size CRYPTO_memcmp,.-CRYPTO_memcmp
|
|
|
|
|
2011-04-17 20:46:00 +08:00
|
|
|
.globl OPENSSL_instrument_bus
|
2017-10-02 21:53:00 +08:00
|
|
|
.type OPENSSL_instrument_bus,\@function
|
2011-04-17 20:46:00 +08:00
|
|
|
.align 16
|
|
|
|
OPENSSL_instrument_bus:
|
|
|
|
lghi %r2,0
|
|
|
|
br %r14
|
|
|
|
.size OPENSSL_instrument_bus,.-OPENSSL_instrument_bus
|
|
|
|
|
|
|
|
.globl OPENSSL_instrument_bus2
|
2017-10-02 21:53:00 +08:00
|
|
|
.type OPENSSL_instrument_bus2,\@function
|
2011-04-17 20:46:00 +08:00
|
|
|
.align 16
|
|
|
|
OPENSSL_instrument_bus2:
|
|
|
|
lghi %r2,0
|
2017-10-02 21:53:00 +08:00
|
|
|
br $ra
|
2011-04-17 20:46:00 +08:00
|
|
|
.size OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
|
|
|
|
|
2017-10-02 17:24:02 +08:00
|
|
|
.globl OPENSSL_vx_probe
|
2017-10-02 21:53:00 +08:00
|
|
|
.type OPENSSL_vx_probe,\@function
|
2017-10-02 17:24:02 +08:00
|
|
|
.align 16
|
|
|
|
OPENSSL_vx_probe:
|
|
|
|
.word 0xe700,0x0000,0x0044 # vzero %v0
|
2017-10-02 21:53:00 +08:00
|
|
|
br $ra
|
2017-10-02 17:24:02 +08:00
|
|
|
.size OPENSSL_vx_probe,.-OPENSSL_vx_probe
|
2017-10-02 21:53:00 +08:00
|
|
|
___
|
|
|
|
|
2018-04-04 01:24:18 +08:00
|
|
|
{
|
|
|
|
################
|
|
|
|
# void s390x_kimd(const unsigned char *in, size_t len, unsigned int fc,
|
|
|
|
# void *param)
|
|
|
|
my ($in,$len,$fc,$param) = map("%r$_",(2..5));
|
|
|
|
$code.=<<___;
|
|
|
|
.globl s390x_kimd
|
|
|
|
.type s390x_kimd,\@function
|
|
|
|
.align 16
|
|
|
|
s390x_kimd:
|
|
|
|
llgfr %r0,$fc
|
|
|
|
lgr %r1,$param
|
|
|
|
|
|
|
|
.long 0xb93e0002 # kimd %r0,%r2
|
|
|
|
brc 1,.-4 # pay attention to "partial completion"
|
|
|
|
|
|
|
|
br $ra
|
|
|
|
.size s390x_kimd,.-s390x_kimd
|
|
|
|
___
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
################
|
|
|
|
# void s390x_klmd(const unsigned char *in, size_t inlen, unsigned char *out,
|
|
|
|
# size_t outlen, unsigned int fc, void *param)
|
|
|
|
my ($in,$inlen,$out,$outlen,$fc) = map("%r$_",(2..6));
|
|
|
|
$code.=<<___;
|
|
|
|
.globl s390x_klmd
|
|
|
|
.type s390x_klmd,\@function
|
|
|
|
.align 32
|
|
|
|
s390x_klmd:
|
|
|
|
llgfr %r0,$fc
|
|
|
|
l${g} %r1,$stdframe($sp)
|
|
|
|
|
|
|
|
.long 0xb93f0042 # klmd %r4,%r2
|
|
|
|
brc 1,.-4 # pay attention to "partial completion"
|
|
|
|
|
|
|
|
br $ra
|
|
|
|
.size s390x_klmd,.-s390x_klmd
|
|
|
|
___
|
|
|
|
}
|
|
|
|
|
2017-10-02 21:53:00 +08:00
|
|
|
################
|
|
|
|
# void s390x_km(const unsigned char *in, size_t len, unsigned char *out,
|
|
|
|
# unsigned int fc, void *param)
|
|
|
|
{
|
|
|
|
my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
|
|
|
|
$code.=<<___;
|
|
|
|
.globl s390x_km
|
|
|
|
.type s390x_km,\@function
|
|
|
|
.align 16
|
|
|
|
s390x_km:
|
|
|
|
lr %r0,$fc
|
|
|
|
l${g}r %r1,$param
|
|
|
|
|
|
|
|
.long 0xb92e0042 # km $out,$in
|
|
|
|
brc 1,.-4 # pay attention to "partial completion"
|
2017-10-02 17:24:02 +08:00
|
|
|
|
2017-10-02 21:53:00 +08:00
|
|
|
br $ra
|
|
|
|
.size s390x_km,.-s390x_km
|
|
|
|
___
|
|
|
|
}
|
|
|
|
|
2018-01-18 17:14:30 +08:00
|
|
|
################
|
|
|
|
# void s390x_kmac(const unsigned char *in, size_t len, unsigned int fc,
|
|
|
|
# void *param)
|
|
|
|
{
|
|
|
|
my ($in,$len,$fc,$param) = map("%r$_",(2..5));
|
|
|
|
$code.=<<___;
|
|
|
|
.globl s390x_kmac
|
|
|
|
.type s390x_kmac,\@function
|
|
|
|
.align 16
|
|
|
|
s390x_kmac:
|
|
|
|
lr %r0,$fc
|
|
|
|
l${g}r %r1,$param
|
|
|
|
|
|
|
|
.long 0xb91e0002 # kmac %r0,$in
|
|
|
|
brc 1,.-4 # pay attention to "partial completion"
|
|
|
|
|
|
|
|
br $ra
|
|
|
|
.size s390x_kmac,.-s390x_kmac
|
|
|
|
___
|
|
|
|
}
|
|
|
|
|
2018-03-28 19:54:50 +08:00
|
|
|
################
|
|
|
|
# void s390x_kmo(const unsigned char *in, size_t len, unsigned char *out,
|
|
|
|
# unsigned int fc, void *param)
|
|
|
|
{
|
|
|
|
my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
|
|
|
|
$code.=<<___;
|
|
|
|
.globl s390x_kmo
|
|
|
|
.type s390x_kmo,\@function
|
|
|
|
.align 16
|
|
|
|
s390x_kmo:
|
|
|
|
lr %r0,$fc
|
|
|
|
l${g}r %r1,$param
|
|
|
|
|
|
|
|
.long 0xb92b0042 # kmo $out,$in
|
|
|
|
brc 1,.-4 # pay attention to "partial completion"
|
|
|
|
|
|
|
|
br $ra
|
|
|
|
.size s390x_kmo,.-s390x_kmo
|
|
|
|
___
|
|
|
|
}
|
|
|
|
|
2018-03-28 20:09:24 +08:00
|
|
|
################
|
|
|
|
# void s390x_kmf(const unsigned char *in, size_t len, unsigned char *out,
|
|
|
|
# unsigned int fc, void *param)
|
|
|
|
{
|
|
|
|
my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
|
|
|
|
$code.=<<___;
|
|
|
|
.globl s390x_kmf
|
|
|
|
.type s390x_kmf,\@function
|
|
|
|
.align 16
|
|
|
|
s390x_kmf:
|
|
|
|
lr %r0,$fc
|
|
|
|
l${g}r %r1,$param
|
|
|
|
|
|
|
|
.long 0xb92a0042 # kmf $out,$in
|
|
|
|
brc 1,.-4 # pay attention to "partial completion"
|
|
|
|
|
|
|
|
br $ra
|
|
|
|
.size s390x_kmf,.-s390x_kmf
|
|
|
|
___
|
|
|
|
}
|
|
|
|
|
2017-10-02 21:53:00 +08:00
|
|
|
################
|
|
|
|
# void s390x_kma(const unsigned char *aad, size_t alen,
|
|
|
|
# const unsigned char *in, size_t len,
|
|
|
|
# unsigned char *out, unsigned int fc, void *param)
|
|
|
|
{
|
|
|
|
my ($aad,$alen,$in,$len,$out) = map("%r$_",(2..6));
|
|
|
|
$code.=<<___;
|
|
|
|
.globl s390x_kma
|
|
|
|
.type s390x_kma,\@function
|
|
|
|
.align 16
|
|
|
|
s390x_kma:
|
|
|
|
st${g} $out,6*$SIZE_T($sp)
|
|
|
|
lm${g} %r0,%r1,$stdframe($sp)
|
|
|
|
|
|
|
|
.long 0xb9292064 # kma $out,$aad,$in
|
|
|
|
brc 1,.-4 # pay attention to "partial completion"
|
|
|
|
|
|
|
|
l${g} $out,6*$SIZE_T($sp)
|
|
|
|
br $ra
|
|
|
|
.size s390x_kma,.-s390x_kma
|
|
|
|
___
|
|
|
|
}
|
|
|
|
|
2019-06-27 07:07:54 +08:00
|
|
|
################
|
2019-07-04 00:02:11 +08:00
|
|
|
# int s390x_pcc(unsigned int fc, void *param)
|
2019-06-27 07:07:54 +08:00
|
|
|
{
|
|
|
|
my ($fc,$param) = map("%r$_",(2..3));
|
|
|
|
$code.=<<___;
|
|
|
|
.globl s390x_pcc
|
|
|
|
.type s390x_pcc,\@function
|
|
|
|
.align 16
|
|
|
|
s390x_pcc:
|
|
|
|
lr %r0,$fc
|
|
|
|
l${g}r %r1,$param
|
|
|
|
lhi %r2,0
|
|
|
|
|
|
|
|
.long 0xb92c0000 # pcc
|
|
|
|
brc 1,.-4 # pay attention to "partial completion"
|
|
|
|
brc 7,.Lpcc_err # if CC==0 return 0, else return 1
|
|
|
|
.Lpcc_out:
|
|
|
|
br $ra
|
|
|
|
.Lpcc_err:
|
|
|
|
lhi %r2,1
|
|
|
|
j .Lpcc_out
|
|
|
|
.size s390x_pcc,.-s390x_pcc
|
|
|
|
___
|
|
|
|
}
|
|
|
|
|
|
|
|
################
|
2019-07-04 00:02:11 +08:00
|
|
|
# int s390x_kdsa(unsigned int fc, void *param,
|
|
|
|
# const unsigned char *in, size_t len)
|
2019-06-27 07:07:54 +08:00
|
|
|
{
|
|
|
|
my ($fc,$param,$in,$len) = map("%r$_",(2..5));
|
|
|
|
$code.=<<___;
|
|
|
|
.globl s390x_kdsa
|
|
|
|
.type s390x_kdsa,\@function
|
|
|
|
.align 16
|
|
|
|
s390x_kdsa:
|
|
|
|
lr %r0,$fc
|
|
|
|
l${g}r %r1,$param
|
|
|
|
lhi %r2,0
|
|
|
|
|
|
|
|
.long 0xb93a0004 # kdsa %r0,$in
|
|
|
|
brc 1,.-4 # pay attention to "partial completion"
|
|
|
|
brc 7,.Lkdsa_err # if CC==0 return 0, else return 1
|
|
|
|
.Lkdsa_out:
|
|
|
|
br $ra
|
|
|
|
.Lkdsa_err:
|
|
|
|
lhi %r2,1
|
|
|
|
j .Lkdsa_out
|
|
|
|
.size s390x_kdsa,.-s390x_kdsa
|
|
|
|
___
|
|
|
|
}
|
|
|
|
|
2019-09-19 21:31:27 +08:00
|
|
|
################
|
|
|
|
# void s390x_flip_endian32(unsigned char dst[32], const unsigned char src[32])
|
|
|
|
{
|
|
|
|
my ($dst,$src) = map("%r$_",(2..3));
|
|
|
|
$code.=<<___;
|
|
|
|
.globl s390x_flip_endian32
|
|
|
|
.type s390x_flip_endian32,\@function
|
|
|
|
.align 16
|
|
|
|
s390x_flip_endian32:
|
2019-11-02 06:29:04 +08:00
|
|
|
lrvg %r0,0($src)
|
|
|
|
lrvg %r1,8($src)
|
|
|
|
lrvg %r4,16($src)
|
|
|
|
lrvg %r5,24($src)
|
|
|
|
stg %r0,24($dst)
|
|
|
|
stg %r1,16($dst)
|
|
|
|
stg %r4,8($dst)
|
|
|
|
stg %r5,0($dst)
|
2019-09-19 21:31:27 +08:00
|
|
|
br $ra
|
|
|
|
.size s390x_flip_endian32,.-s390x_flip_endian32
|
|
|
|
___
|
|
|
|
}
|
|
|
|
|
|
|
|
################
|
|
|
|
# void s390x_flip_endian64(unsigned char dst[64], const unsigned char src[64])
|
|
|
|
{
|
|
|
|
my ($dst,$src) = map("%r$_",(2..3));
|
|
|
|
$code.=<<___;
|
|
|
|
.globl s390x_flip_endian64
|
|
|
|
.type s390x_flip_endian64,\@function
|
|
|
|
.align 16
|
|
|
|
s390x_flip_endian64:
|
|
|
|
stmg %r6,%r9,6*$SIZE_T($sp)
|
|
|
|
|
2019-11-02 06:29:04 +08:00
|
|
|
lrvg %r0,0($src)
|
|
|
|
lrvg %r1,8($src)
|
|
|
|
lrvg %r4,16($src)
|
|
|
|
lrvg %r5,24($src)
|
|
|
|
lrvg %r6,32($src)
|
|
|
|
lrvg %r7,40($src)
|
|
|
|
lrvg %r8,48($src)
|
|
|
|
lrvg %r9,56($src)
|
|
|
|
stg %r0,56($dst)
|
|
|
|
stg %r1,48($dst)
|
|
|
|
stg %r4,40($dst)
|
|
|
|
stg %r5,32($dst)
|
|
|
|
stg %r6,24($dst)
|
|
|
|
stg %r7,16($dst)
|
|
|
|
stg %r8,8($dst)
|
|
|
|
stg %r9,0($dst)
|
2019-09-19 21:31:27 +08:00
|
|
|
|
|
|
|
lmg %r6,%r9,6*$SIZE_T($sp)
|
|
|
|
br $ra
|
|
|
|
.size s390x_flip_endian64,.-s390x_flip_endian64
|
|
|
|
___
|
|
|
|
}
|
|
|
|
|
2017-10-02 21:53:00 +08:00
|
|
|
$code.=<<___;
|
2010-01-19 20:24:59 +08:00
|
|
|
.section .init
|
2017-10-02 21:53:00 +08:00
|
|
|
brasl $ra,OPENSSL_cpuid_setup
|
|
|
|
___
|
|
|
|
|
|
|
|
$code =~ s/\`([^\`]*)\`/eval $1/gem;
|
|
|
|
print $code;
|
2020-02-17 10:17:53 +08:00
|
|
|
close STDOUT or die "error closing STDOUT: $!"; # force flush
|