s390x assembly pack: cache capability query results.

IBM argues that in certain scenarios capability query is really
expensive. At the same time it's asserted that query results can
be safely cached, because disabling CPACF is incompatible with
reboot-free operation.

Reviewed-by: Tim Hudson <tjh@openssl.org>
This commit is contained in:
Andy Polyakov 2016-04-15 16:39:22 +02:00
parent 299ccadcdb
commit 670ad0fbf6
5 changed files with 53 additions and 38 deletions

View file

@ -818,13 +818,9 @@ $code.=<<___ if (!$softonly);
tmhl %r0,0x4000 # check for message-security assist tmhl %r0,0x4000 # check for message-security assist
jz .Lekey_internal jz .Lekey_internal
lghi %r0,0 # query capability vector llihh %r0,0x8000
la %r1,16($sp) srlg %r0,%r0,0(%r5)
.long 0xb92f0042 # kmc %r4,%r2 ng %r0,48(%r1) # check kmc capability vector
llihh %r1,0x8000
srlg %r1,%r1,0(%r5)
ng %r1,16($sp)
jz .Lekey_internal jz .Lekey_internal
lmg %r0,%r1,0($inp) # just copy 128 bits... lmg %r0,%r1,0($inp) # just copy 128 bits...
@ -1444,13 +1440,10 @@ $code.=<<___ if (0); ######### kmctr code was measured to be ~12% slower
llgfr $s0,%r0 llgfr $s0,%r0
lgr $s1,%r1 lgr $s1,%r1
lghi %r0,0 larl %r1,OPENSSL_s390xcap_P
la %r1,16($sp)
.long 0xb92d2042 # kmctr %r4,%r2,%r2
llihh %r0,0x8000 # check if kmctr supports the function code llihh %r0,0x8000 # check if kmctr supports the function code
srlg %r0,%r0,0($s0) srlg %r0,%r0,0($s0)
ng %r0,16($sp) ng %r0,64(%r1) # check kmctr capability vector
lgr %r0,$s0 lgr %r0,$s0
lgr %r1,$s1 lgr %r1,$s1
jz .Lctr32_km_loop jz .Lctr32_km_loop
@ -1597,12 +1590,10 @@ $code.=<<___ if(1);
llgfr $s0,%r0 # put aside the function code llgfr $s0,%r0 # put aside the function code
lghi $s1,0x7f lghi $s1,0x7f
nr $s1,%r0 nr $s1,%r0
lghi %r0,0 # query capability vector larl %r1,OPENSSL_s390xcap_P
la %r1,$tweak-16($sp) llihh %r0,0x8000
.long 0xb92e0042 # km %r4,%r2 srlg %r0,%r0,32($s1) # check for 32+function code
llihh %r1,0x8000 ng %r0,32(%r1) # check km capability vector
srlg %r1,%r1,32($s1) # check for 32+function code
ng %r1,$tweak-16($sp)
lgr %r0,$s0 # restore the function code lgr %r0,$s0 # restore the function code
la %r1,0($key1) # restore $key1 la %r1,0($key1) # restore $key1
jz .Lxts_km_vanilla jz .Lxts_km_vanilla
@ -2229,7 +2220,7 @@ ___
} }
$code.=<<___; $code.=<<___;
.string "AES for s390x, CRYPTOGAMS by <appro\@openssl.org>" .string "AES for s390x, CRYPTOGAMS by <appro\@openssl.org>"
.comm OPENSSL_s390xcap_P,16,8 .comm OPENSSL_s390xcap_P,80,8
___ ___
$code =~ s/\`([^\`]*)\`/eval $1/gem; $code =~ s/\`([^\`]*)\`/eval $1/gem;

View file

@ -85,9 +85,7 @@ $code.=<<___ if(!$softonly && 0); # hardware is slow for single block...
tmhl %r0,0x4000 # check for message-security-assist tmhl %r0,0x4000 # check for message-security-assist
jz .Lsoft_gmult jz .Lsoft_gmult
lghi %r0,0 lghi %r0,0
la %r1,16($sp) lg %r1,24(%r1) # load second word of kimd capabilities vector
.long 0xb93e0004 # kimd %r0,%r4
lg %r1,24($sp)
tmhh %r1,0x4000 # check for function 65 tmhh %r1,0x4000 # check for function 65
jz .Lsoft_gmult jz .Lsoft_gmult
stg %r0,16($sp) # arrange 16 bytes of zero input stg %r0,16($sp) # arrange 16 bytes of zero input

View file

@ -5,14 +5,46 @@
.align 16 .align 16
OPENSSL_s390x_facilities: OPENSSL_s390x_facilities:
lghi %r0,0 lghi %r0,0
larl %r2,OPENSSL_s390xcap_P larl %r4,OPENSSL_s390xcap_P
stg %r0,8(%r2) stg %r0,8(%r4) # wipe capability vectors
.long 0xb2b02000 # stfle 0(%r2) stg %r0,16(%r4)
stg %r0,24(%r4)
stg %r0,32(%r4)
stg %r0,40(%r4)
stg %r0,48(%r4)
stg %r0,56(%r4)
stg %r0,64(%r4)
stg %r0,72(%r4)
.long 0xb2b04000 # stfle 0(%r4)
brc 8,.Ldone brc 8,.Ldone
lghi %r0,1 lghi %r0,1
.long 0xb2b02000 # stfle 0(%r2) .long 0xb2b04000 # stfle 0(%r4)
.Ldone: .Ldone:
lg %r2,0(%r2) lmg %r2,%r3,0(%r4)
tmhl %r2,0x4000 # check for message-security-assist
jz .Lret
lghi %r0,0 # query kimd capabilities
la %r1,16(%r4)
.long 0xb93e0002 # kimd %r0,%r2
lghi %r0,0 # query km capability vector
la %r1,32(%r4)
.long 0xb92e0042 # km %r4,%r2
lghi %r0,0 # query kmc capability vector
la %r1,48(%r4)
.long 0xb92f0042 # kmc %r4,%r2
tmhh %r3,0x0004 # check for message-security-assist-4
jz .Lret
lghi %r0,0 # query kmctr capability vector
la %r1,64(%r4)
.long 0xb92d2042 # kmctr %r4,%r2,%r2
.Lret:
br %r14 br %r14
.size OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities .size OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities
@ -112,4 +144,4 @@ OPENSSL_instrument_bus2:
.section .init .section .init
brasl %r14,OPENSSL_cpuid_setup brasl %r14,OPENSSL_cpuid_setup
.comm OPENSSL_s390xcap_P,16,8 .comm OPENSSL_s390xcap_P,80,8

View file

@ -168,10 +168,7 @@ $code.=<<___ if ($kimdfunc);
lg %r0,0(%r1) lg %r0,0(%r1)
tmhl %r0,0x4000 # check for message-security assist tmhl %r0,0x4000 # check for message-security assist
jz .Lsoftware jz .Lsoftware
lghi %r0,0 lg %r0,16(%r1) # check kimd capabilities
la %r1,`2*$SIZE_T`($sp)
.long 0xb93e0002 # kimd %r0,%r2
lg %r0,`2*$SIZE_T`($sp)
tmhh %r0,`0x8000>>$kimdfunc` tmhh %r0,`0x8000>>$kimdfunc`
jz .Lsoftware jz .Lsoftware
lghi %r0,$kimdfunc lghi %r0,$kimdfunc
@ -238,7 +235,7 @@ $code.=<<___;
br %r14 br %r14
.size sha1_block_data_order,.-sha1_block_data_order .size sha1_block_data_order,.-sha1_block_data_order
.string "SHA1 block transform for s390x, CRYPTOGAMS by <appro\@openssl.org>" .string "SHA1 block transform for s390x, CRYPTOGAMS by <appro\@openssl.org>"
.comm OPENSSL_s390xcap_P,16,8 .comm OPENSSL_s390xcap_P,80,8
___ ___
$code =~ s/\`([^\`]*)\`/eval $1/gem; $code =~ s/\`([^\`]*)\`/eval $1/gem;

View file

@ -240,10 +240,7 @@ $code.=<<___ if ($kimdfunc);
lg %r0,0(%r1) lg %r0,0(%r1)
tmhl %r0,0x4000 # check for message-security assist tmhl %r0,0x4000 # check for message-security assist
jz .Lsoftware jz .Lsoftware
lghi %r0,0 lg %r0,16(%r1) # check kimd capabilities
la %r1,`2*$SIZE_T`($sp)
.long 0xb93e0002 # kimd %r0,%r2
lg %r0,`2*$SIZE_T`($sp)
tmhh %r0,`0x8000>>$kimdfunc` tmhh %r0,`0x8000>>$kimdfunc`
jz .Lsoftware jz .Lsoftware
lghi %r0,$kimdfunc lghi %r0,$kimdfunc
@ -311,7 +308,7 @@ $code.=<<___;
br %r14 br %r14
.size $Func,.-$Func .size $Func,.-$Func
.string "SHA${label} block transform for s390x, CRYPTOGAMS by <appro\@openssl.org>" .string "SHA${label} block transform for s390x, CRYPTOGAMS by <appro\@openssl.org>"
.comm OPENSSL_s390xcap_P,16,8 .comm OPENSSL_s390xcap_P,80,8
___ ___
$code =~ s/\`([^\`]*)\`/eval $1/gem; $code =~ s/\`([^\`]*)\`/eval $1/gem;