Commit cbffd2d9 authored by Andy Polyakov's avatar Andy Polyakov
Browse files

SPARC assembly pack: enforce V8+ ABI constraints.



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: default avatarRichard Levitte <levitte@openssl.org>
(cherry picked from commit f198cc43)
parent cb5ebf96
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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

+2 −0
Original line number Diff line number Diff line
@@ -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
+4 −0
Original line number Diff line number Diff line
@@ -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