Skip to content

Commit

Permalink
s390x assembler update: add support for run-time facility detection […
Browse files Browse the repository at this point in the history
…from HEAD].
  • Loading branch information
Andy Polyakov committed Jan 19, 2010
1 parent 2a4d0dc commit 3e719c9
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 9 deletions.
2 changes: 1 addition & 1 deletion Configure
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ my $sparcv9_asm="sparcv9cap.o sparccpuid.o:bn-sparcv9.o sparcv9-mont.o sparcv9a-
my $sparcv8_asm=":sparcv8.o:des_enc-sparc.o fcrypt_b.o:::::::::::void";
my $alpha_asm="alphacpuid.o:bn_asm.o alpha-mont.o::::::::::::void";
my $mips3_asm=":bn-mips3.o::::::::::::void";
my $s390x_asm="s390xcpuid.o:bn-s390x.o s390x-mont.o::aes-s390x.o:::sha1-s390x.o sha256-s390x.o sha512-s390x.o::rc4-s390x.o:::::void";
my $s390x_asm="s390xcap.o s390xcpuid.o:bn-s390x.o s390x-mont.o::aes-s390x.o:::sha1-s390x.o sha256-s390x.o sha512-s390x.o::rc4-s390x.o:::::void";
my $armv4_asm=":bn_asm.o armv4-mont.o::aes_cbc.o aes-armv4.o:::sha1-armv4-large.o sha256-armv4.o sha512-armv4.o:::::::void";
my $ppc32_asm="ppccpuid.o:bn-ppc.o::aes_core.o aes_cbc.o aes-ppc.o:::sha1-ppc.o sha256-ppc.o::::::";
my $ppc64_asm="ppccpuid.o:bn-ppc.o ppc-mont.o::aes_core.o aes_cbc.o aes-ppc.o:::sha1-ppc.o sha256-ppc.o sha512-ppc.o::::::";
Expand Down
2 changes: 1 addition & 1 deletion TABLE
Original file line number Diff line number Diff line change
Expand Up @@ -3728,7 +3728,7 @@ $thread_cflag = -D_REENTRANT
$sys_id =
$lflags = -ldl
$bn_ops = SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL
$cpuid_obj = s390xcpuid.o
$cpuid_obj = s390xcap.o s390xcpuid.o
$bn_obj = bn-s390x.o s390x-mont.o
$des_obj =
$aes_obj = aes-s390x.o
Expand Down
6 changes: 6 additions & 0 deletions crypto/aes/asm/aes-s390x.pl
Original file line number Diff line number Diff line change
Expand Up @@ -765,6 +765,11 @@ ()
srl %r5,6
ar %r5,%r0
larl %r1,OPENSSL_s390xcap_P
lg %r0,0(%r1)
tmhl %r0,0x4000 # check for message-security assist
jz .Lekey_internal
lghi %r0,0 # query capability vector
la %r1,16($sp)
.long 0xb92f0042 # kmc %r4,%r2
Expand Down Expand Up @@ -1323,6 +1328,7 @@ ()
4: ex $len,0($s1)
j .Lcbc_dec_exit
.size AES_cbc_encrypt,.-AES_cbc_encrypt
.comm OPENSSL_s390xcap_P,8,8
___
}
$code.=<<___;
Expand Down
37 changes: 37 additions & 0 deletions crypto/s390xcap.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <setjmp.h>
#include <signal.h>

extern unsigned long OPENSSL_s390xcap_P;

static sigjmp_buf ill_jmp;
static void ill_handler (int sig) { siglongjmp(ill_jmp,sig); }

unsigned long OPENSSL_s390x_facilities(void);

void OPENSSL_cpuid_setup(void)
{
sigset_t oset;
struct sigaction ill_act,oact;

if (OPENSSL_s390xcap_P) return;

memset(&ill_act,0,sizeof(ill_act));
ill_act.sa_handler = ill_handler;
sigfillset(&ill_act.sa_mask);
sigdelset(&ill_act.sa_mask,SIGILL);
sigdelset(&ill_act.sa_mask,SIGTRAP);
sigprocmask(SIG_SETMASK,&ill_act.sa_mask,&oset);
sigaction (SIGILL,&ill_act,&oact);

/* protection against missing store-facility-list-extended */
if (sigsetjmp(ill_jmp,0) == 0)
OPENSSL_s390xcap_P = OPENSSL_s390x_facilities();
else
OPENSSL_s390xcap_P = 1UL<<63;

sigaction (SIGILL,&oact,NULL);
sigprocmask(SIG_SETMASK,&oset,NULL);
}
14 changes: 7 additions & 7 deletions crypto/s390xcpuid.S
Original file line number Diff line number Diff line change
@@ -1,19 +1,14 @@
.text

.globl OPENSSL_cpuid_setup
.type OPENSSL_cpuid_setup,@function
.align 16
OPENSSL_cpuid_setup:
br %r14 # reserved for future
.size OPENSSL_cpuid_setup,.-OPENSSL_cpuid_setup

.globl OPENSSL_s390x_facilities
.type OPENSSL_s390x_facilities,@function
.align 16
OPENSSL_s390x_facilities:
lghi %r0,0
.long 0xb2b0f010 # stfle 16(%r15)
lg %r2,16(%r15)
larl %r1,OPENSSL_s390xcap_P
stg %r2,0(%r1)
br %r14
.size OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities

Expand Down Expand Up @@ -88,3 +83,8 @@ OPENSSL_cleanse:
jnz .Little
br %r14
.size OPENSSL_cleanse,.-OPENSSL_cleanse

.section .init
brasl %r14,OPENSSL_cpuid_setup

.comm OPENSSL_s390xcap_P,8,8
5 changes: 5 additions & 0 deletions crypto/sha/asm/sha1-s390x.pl
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,10 @@ sub BODY_40_59 {
sha1_block_data_order:
___
$code.=<<___ if ($kimdfunc);
larl %r1,OPENSSL_s390xcap_P
lg %r0,0(%r1)
tmhl %r0,0x4000 # check for message-security assist
jz .Lsoftware
lghi %r0,0
la %r1,16($sp)
.long 0xb93e0002 # kimd %r0,%r2
Expand Down Expand Up @@ -213,6 +217,7 @@ sub BODY_40_59 {
br %r14
.size sha1_block_data_order,.-sha1_block_data_order
.string "SHA1 block transform for s390x, CRYPTOGAMS by <appro\@openssl.org>"
.comm OPENSSL_s390xcap_P,8,8
___

$code =~ s/\`([^\`]*)\`/eval $1/gem;
Expand Down
5 changes: 5 additions & 0 deletions crypto/sha/asm/sha512-s390x.pl
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,10 @@ sub BODY_16_XX {
$Func:
___
$code.=<<___ if ($kimdfunc);
larl %r1,OPENSSL_s390xcap_P
lg %r0,0(%r1)
tmhl %r0,0x4000 # check for message-security assist
jz .Lsoftware
lghi %r0,0
la %r1,16($sp)
.long 0xb93e0002 # kimd %r0,%r2
Expand Down Expand Up @@ -286,6 +290,7 @@ sub BODY_16_XX {
br %r14
.size $Func,.-$Func
.string "SHA${label} block transform for s390x, CRYPTOGAMS by <appro\@openssl.org>"
.comm OPENSSL_s390xcap_P,8,8
___

$code =~ s/\`([^\`]*)\`/eval $1/gem;
Expand Down

0 comments on commit 3e719c9

Please sign in to comment.