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:26:21 +0000 (14:26 +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>
(cherry picked from commit f198cc43a0eca4bf1a8e7f60c51af560f4346dc8)

crypto/des/asm/dest4-sparcv9.pl
crypto/modes/asm/ghash-sparcv9.pl
crypto/perlasm/sparcv9_modes.pl

index 1dc60243d4fbda91314f2d2dc33ca1eb0aa1b6c3..5f3a511dba27fafab818677463e33720ba0958f3 100644 (file)
@@ -96,7 +96,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
 
@@ -197,7 +197,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
 
@@ -305,7 +305,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
 
@@ -457,7 +457,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 5bc28702019a176649f11e6197090ac74b332a19..b129ba706f0f01365bfd92027c4e8e0f9914d646 100644 (file)
@@ -445,6 +445,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 eb267a57ed8151855a55ec3bc33dc9483a19ff4d..ac8da328b00eb44f7683b70e38e36a489c879a58 100644 (file)
@@ -37,6 +37,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);
@@ -254,6 +255,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);
@@ -613,6 +615,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
@@ -916,6 +919,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