OPENSSL_cleanse to accept zero length parameter [matching C implementation].
This commit is contained in:
@@ -90,6 +90,7 @@ OPENSSL_rdtsc:
|
|||||||
OPENSSL_cleanse:
|
OPENSSL_cleanse:
|
||||||
.frame $30,0,$26
|
.frame $30,0,$26
|
||||||
.prologue 0
|
.prologue 0
|
||||||
|
beq $17,.Ldone
|
||||||
and $16,7,$0
|
and $16,7,$0
|
||||||
bic $17,7,$at
|
bic $17,7,$at
|
||||||
beq $at,.Little
|
beq $at,.Little
|
||||||
|
@@ -101,6 +101,13 @@ my $bnelr = sub {
|
|||||||
" .long ".sprintf "0x%x",19<<26|$bo<<21|2<<16|16<<1 :
|
" .long ".sprintf "0x%x",19<<26|$bo<<21|2<<16|16<<1 :
|
||||||
" bclr $bo,2";
|
" bclr $bo,2";
|
||||||
};
|
};
|
||||||
|
my $beqlr = sub {
|
||||||
|
my $f = shift;
|
||||||
|
my $bo = $f=~/-/ ? 12+2 : 12; # optional "not to be taken" hint
|
||||||
|
($flavour =~ /linux/) ? # GNU as doesn't allow most recent hints
|
||||||
|
" .long ".sprintf "0x%X",19<<26|$bo<<21|2<<16|16<<1 :
|
||||||
|
" bclr $bo,2";
|
||||||
|
};
|
||||||
# GNU assembler can't handle extrdi rA,rS,16,48, or when sum of last two
|
# GNU assembler can't handle extrdi rA,rS,16,48, or when sum of last two
|
||||||
# arguments is 64, with "operand out of range" error.
|
# arguments is 64, with "operand out of range" error.
|
||||||
my $extrdi = sub {
|
my $extrdi = sub {
|
||||||
|
@@ -83,6 +83,8 @@ Loop: lwarx r5,0,r3
|
|||||||
$CMPLI r4,7
|
$CMPLI r4,7
|
||||||
li r0,0
|
li r0,0
|
||||||
bge Lot
|
bge Lot
|
||||||
|
$CMPLI r4,0
|
||||||
|
beqlr-
|
||||||
Little: mtctr r4
|
Little: mtctr r4
|
||||||
stb r0,0(r3)
|
stb r0,0(r3)
|
||||||
addi r3,r3,1
|
addi r3,r3,1
|
||||||
|
@@ -62,6 +62,8 @@ OPENSSL_cleanse:
|
|||||||
lghi %r0,0
|
lghi %r0,0
|
||||||
clgr %r3,%r4
|
clgr %r3,%r4
|
||||||
jh .Lot
|
jh .Lot
|
||||||
|
clgr %r3,%r0
|
||||||
|
bcr 8,%r14
|
||||||
.Little:
|
.Little:
|
||||||
stc %r0,0(%r2)
|
stc %r0,0(%r2)
|
||||||
la %r2,1(%r2)
|
la %r2,1(%r2)
|
||||||
|
@@ -242,6 +242,10 @@ OPENSSL_cleanse:
|
|||||||
#else
|
#else
|
||||||
bgu .Lot
|
bgu .Lot
|
||||||
#endif
|
#endif
|
||||||
|
cmp %o1,0
|
||||||
|
bne .Little
|
||||||
|
nop
|
||||||
|
retl
|
||||||
nop
|
nop
|
||||||
|
|
||||||
.Little:
|
.Little:
|
||||||
|
@@ -145,12 +145,14 @@ OPENSSL_cleanse:
|
|||||||
xor %rax,%rax
|
xor %rax,%rax
|
||||||
cmp \$15,$arg2
|
cmp \$15,$arg2
|
||||||
jae .Lot
|
jae .Lot
|
||||||
|
cmp \$0,$arg2
|
||||||
|
je .Lret
|
||||||
.Little:
|
.Little:
|
||||||
mov %al,($arg1)
|
mov %al,($arg1)
|
||||||
sub \$1,$arg2
|
sub \$1,$arg2
|
||||||
lea 1($arg1),$arg1
|
lea 1($arg1),$arg1
|
||||||
jnz .Little
|
jnz .Little
|
||||||
ret
|
.Lret: ret
|
||||||
.align 16
|
.align 16
|
||||||
.Lot:
|
.Lot:
|
||||||
test \$7,$arg1
|
test \$7,$arg1
|
||||||
|
@@ -279,11 +279,14 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
|
|||||||
&xor ("eax","eax");
|
&xor ("eax","eax");
|
||||||
&cmp ("ecx",7);
|
&cmp ("ecx",7);
|
||||||
&jae (&label("lot"));
|
&jae (&label("lot"));
|
||||||
|
&cmp ("ecx",0);
|
||||||
|
&je (&label("ret"));
|
||||||
&set_label("little");
|
&set_label("little");
|
||||||
&mov (&BP(0,"edx"),"al");
|
&mov (&BP(0,"edx"),"al");
|
||||||
&sub ("ecx",1);
|
&sub ("ecx",1);
|
||||||
&lea ("edx",&DWP(1,"edx"));
|
&lea ("edx",&DWP(1,"edx"));
|
||||||
&jnz (&label("little"));
|
&jnz (&label("little"));
|
||||||
|
&set_label("ret");
|
||||||
&ret ();
|
&ret ();
|
||||||
|
|
||||||
&set_label("lot",16);
|
&set_label("lot",16);
|
||||||
|
Reference in New Issue
Block a user