SPARC assembly pack: enforce V8+ ABI constraints.
authorAndy Polyakov <appro@openssl.org>
Thu, 30 Jun 2016 13:57:57 +0000 (15:57 +0200)
committerAndy Polyakov <appro@openssl.org>
Fri, 1 Jul 2016 12:25:08 +0000 (14:25 +0200)
Even though it's hard to imagine, it turned out that upper half of
arguments passed to V8+ subroutine can be non-zero.

["n" pseudo-instructions, such as srln being srl in 32-bit case and
srlx in 64-bit one, were implemented in binutils 2.10. It's assumed
that Solaris assembler implemented it around same time, i.e. 2000.]

Reviewed-by: Richard Levitte <levitte@openssl.org>
crypto/des/asm/dest4-sparcv9.pl
crypto/modes/asm/ghash-sparcv9.pl
crypto/perlasm/sparcv9_modes.pl

index 1d4f0d11bf362086cfe75d17d9cd93f3e92debdd..4a6e29fc5307eacc8f8267deca1a389c6c44c417 100644 (file)
@@ -106,7 +106,7 @@ $code.=<<___;
 des_t4_cbc_encrypt:
        cmp             $len, 0
        be,pn           $::size_t_cc, .Lcbc_abort
-       nop
+       srln            $len, 0, $len           ! needed on v8+, "nop" on v9
        ld              [$ivec + 0], %f0        ! load ivec
        ld              [$ivec + 4], %f1
 
@@ -207,7 +207,7 @@ des_t4_cbc_encrypt:
 des_t4_cbc_decrypt:
        cmp             $len, 0
        be,pn           $::size_t_cc, .Lcbc_abort
-       nop
+       srln            $len, 0, $len           ! needed on v8+, "nop" on v9
        ld              [$ivec + 0], %f2        ! load ivec
        ld              [$ivec + 4], %f3
 
@@ -315,7 +315,7 @@ $code.=<<___;
 des_t4_ede3_cbc_encrypt:
        cmp             $len, 0
        be,pn           $::size_t_cc, .Lcbc_abort
-       nop
+       srln            $len, 0, $len           ! needed on v8+, "nop" on v9
        ld              [$ivec + 0], %f0        ! load ivec
        ld              [$ivec + 4], %f1
 
@@ -467,7 +467,7 @@ des_t4_ede3_cbc_encrypt:
 des_t4_ede3_cbc_decrypt:
        cmp             $len, 0
        be,pn           $::size_t_cc, .Lcbc_abort
-       nop
+       srln            $len, 0, $len           ! needed on v8+, "nop" on v9
        ld              [$ivec + 0], %f2        ! load ivec
        ld              [$ivec + 4], %f3
 
index 6ca3a9bdf002e4e3058c91cd72f38ce8d7175bf8..c4eb3b1f02060edc69cdb129bd2438e1bf289d3c 100644 (file)
@@ -453,6 +453,8 @@ gcm_gmult_vis3:
 .align 32
 gcm_ghash_vis3:
        save    %sp,-$frame,%sp
+       nop
+       srln    $len,0,$len             ! needed on v8+, "nop" on v9
 
        ldx     [$Xip+8],$C2            ! load Xi
        ldx     [$Xip+0],$C3
index 47c2e53b994e5126ee5bb8e3012fc901d800e432..bfdada8540be67e99d438c6adac716734163e588 100644 (file)
@@ -48,6 +48,7 @@ ${alg}${bits}_t4_cbc_encrypt:
        save            %sp, -$::frame, %sp
        cmp             $len, 0
        be,pn           $::size_t_cc, .L${bits}_cbc_enc_abort
+       srln            $len, 0, $len           ! needed on v8+, "nop" on v9
        sub             $inp, $out, $blk_init   ! $inp!=$out
 ___
 $::code.=<<___ if (!$::evp);
@@ -265,6 +266,7 @@ ${alg}${bits}_t4_cbc_decrypt:
        save            %sp, -$::frame, %sp
        cmp             $len, 0
        be,pn           $::size_t_cc, .L${bits}_cbc_dec_abort
+       srln            $len, 0, $len           ! needed on v8+, "nop" on v9
        sub             $inp, $out, $blk_init   ! $inp!=$out
 ___
 $::code.=<<___ if (!$::evp);
@@ -624,6 +626,7 @@ $::code.=<<___;
 .align 32
 ${alg}${bits}_t4_ctr32_encrypt:
        save            %sp, -$::frame, %sp
+       srln            $len, 0, $len           ! needed on v8+, "nop" on v9
 
        prefetch        [$inp], 20
        prefetch        [$inp + 63], 20
@@ -927,6 +930,7 @@ $::code.=<<___;
 .align 32
 ${alg}${bits}_t4_xts_${dir}crypt:
        save            %sp, -$::frame-16, %sp
+       srln            $len, 0, $len           ! needed on v8+, "nop" on v9
 
        mov             $ivec, %o0
        add             %fp, $::bias-16, %o1