You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
3.5 KiB
225 lines
3.5 KiB
#!/usr/bin/env perl |
|
|
|
$flavour = shift; |
|
$output = shift; |
|
open STDOUT,">$output"; |
|
|
|
if ($flavour =~ /64/) { |
|
$LEVEL ="2.0W"; |
|
$SIZE_T =8; |
|
$ST ="std"; |
|
} else { |
|
$LEVEL ="1.1"; |
|
$SIZE_T =4; |
|
$ST ="stw"; |
|
} |
|
|
|
$rp="%r2"; |
|
$sp="%r30"; |
|
$rv="%r28"; |
|
|
|
$code=<<___; |
|
.LEVEL $LEVEL |
|
.SPACE \$TEXT\$ |
|
.SUBSPA \$CODE\$,QUAD=0,ALIGN=8,ACCESS=0x2C,CODE_ONLY |
|
|
|
.EXPORT OPENSSL_cpuid_setup,ENTRY |
|
.ALIGN 8 |
|
OPENSSL_cpuid_setup |
|
.PROC |
|
.CALLINFO NO_CALLS |
|
.ENTRY |
|
bv ($rp) |
|
.EXIT |
|
nop |
|
.PROCEND |
|
|
|
.EXPORT OPENSSL_rdtsc,ENTRY |
|
.ALIGN 8 |
|
OPENSSL_rdtsc |
|
.PROC |
|
.CALLINFO NO_CALLS |
|
.ENTRY |
|
mfctl %cr16,$rv |
|
bv ($rp) |
|
.EXIT |
|
nop |
|
.PROCEND |
|
|
|
.EXPORT OPENSSL_wipe_cpu,ENTRY |
|
.ALIGN 8 |
|
OPENSSL_wipe_cpu |
|
.PROC |
|
.CALLINFO NO_CALLS |
|
.ENTRY |
|
xor %r0,%r0,%r1 |
|
fcpy,dbl %fr0,%fr4 |
|
xor %r0,%r0,%r19 |
|
fcpy,dbl %fr0,%fr5 |
|
xor %r0,%r0,%r20 |
|
fcpy,dbl %fr0,%fr6 |
|
xor %r0,%r0,%r21 |
|
fcpy,dbl %fr0,%fr7 |
|
xor %r0,%r0,%r22 |
|
fcpy,dbl %fr0,%fr8 |
|
xor %r0,%r0,%r23 |
|
fcpy,dbl %fr0,%fr9 |
|
xor %r0,%r0,%r24 |
|
fcpy,dbl %fr0,%fr10 |
|
xor %r0,%r0,%r25 |
|
fcpy,dbl %fr0,%fr11 |
|
xor %r0,%r0,%r26 |
|
fcpy,dbl %fr0,%fr22 |
|
xor %r0,%r0,%r29 |
|
fcpy,dbl %fr0,%fr23 |
|
xor %r0,%r0,%r31 |
|
fcpy,dbl %fr0,%fr24 |
|
fcpy,dbl %fr0,%fr25 |
|
fcpy,dbl %fr0,%fr26 |
|
fcpy,dbl %fr0,%fr27 |
|
fcpy,dbl %fr0,%fr28 |
|
fcpy,dbl %fr0,%fr29 |
|
fcpy,dbl %fr0,%fr30 |
|
fcpy,dbl %fr0,%fr31 |
|
bv ($rp) |
|
.EXIT |
|
ldo 0($sp),$rv |
|
.PROCEND |
|
___ |
|
{ |
|
my $inp="%r26"; |
|
my $len="%r25"; |
|
|
|
$code.=<<___; |
|
.EXPORT OPENSSL_cleanse,ENTRY,ARGW0=GR,ARGW1=GR |
|
.ALIGN 8 |
|
OPENSSL_cleanse |
|
.PROC |
|
.CALLINFO NO_CALLS |
|
.ENTRY |
|
cmpib,*= 0,$len,L\$done |
|
nop |
|
cmpib,*>>= 15,$len,L\$ittle |
|
ldi $SIZE_T-1,%r1 |
|
|
|
L\$align |
|
and,*<> $inp,%r1,%r28 |
|
b,n L\$aligned |
|
stb %r0,0($inp) |
|
ldo -1($len),$len |
|
b L\$align |
|
ldo 1($inp),$inp |
|
|
|
L\$aligned |
|
andcm $len,%r1,%r28 |
|
L\$ot |
|
$ST %r0,0($inp) |
|
addib,*<> -$SIZE_T,%r28,L\$ot |
|
ldo $SIZE_T($inp),$inp |
|
|
|
and,*<> $len,%r1,$len |
|
b,n L\$done |
|
L\$ittle |
|
stb %r0,0($inp) |
|
addib,*<> -1,$len,L\$ittle |
|
ldo 1($inp),$inp |
|
L\$done |
|
bv ($rp) |
|
.EXIT |
|
nop |
|
.PROCEND |
|
___ |
|
} |
|
{ |
|
my ($out,$cnt,$max)=("%r26","%r25","%r24"); |
|
my ($tick,$lasttick)=("%r23","%r22"); |
|
my ($diff,$lastdiff)=("%r21","%r20"); |
|
|
|
$code.=<<___; |
|
.EXPORT OPENSSL_instrument_bus,ENTRY,ARGW0=GR,ARGW1=GR |
|
.ALIGN 8 |
|
OPENSSL_instrument_bus |
|
.PROC |
|
.CALLINFO NO_CALLS |
|
.ENTRY |
|
copy $cnt,$rv |
|
mfctl %cr16,$tick |
|
copy $tick,$lasttick |
|
ldi 0,$diff |
|
|
|
fdc 0($out) |
|
ldw 0($out),$tick |
|
add $diff,$tick,$tick |
|
stw $tick,0($out) |
|
L\$oop |
|
mfctl %cr16,$tick |
|
sub $tick,$lasttick,$diff |
|
copy $tick,$lasttick |
|
|
|
fdc 0($out) |
|
ldw 0($out),$tick |
|
add $diff,$tick,$tick |
|
stw $tick,0($out) |
|
|
|
addib,<> -1,$cnt,L\$oop |
|
addi 4,$out,$out |
|
|
|
bv ($rp) |
|
.EXIT |
|
sub $rv,$cnt,$rv |
|
.PROCEND |
|
|
|
.EXPORT OPENSSL_instrument_bus2,ENTRY,ARGW0=GR,ARGW1=GR |
|
.ALIGN 8 |
|
OPENSSL_instrument_bus2 |
|
.PROC |
|
.CALLINFO NO_CALLS |
|
.ENTRY |
|
copy $cnt,$rv |
|
sub %r0,$cnt,$cnt |
|
|
|
mfctl %cr16,$tick |
|
copy $tick,$lasttick |
|
ldi 0,$diff |
|
|
|
fdc 0($out) |
|
ldw 0($out),$tick |
|
add $diff,$tick,$tick |
|
stw $tick,0($out) |
|
|
|
mfctl %cr16,$tick |
|
sub $tick,$lasttick,$diff |
|
copy $tick,$lasttick |
|
L\$oop2 |
|
copy $diff,$lastdiff |
|
fdc 0($out) |
|
ldw 0($out),$tick |
|
add $diff,$tick,$tick |
|
stw $tick,0($out) |
|
|
|
addib,= -1,$max,L\$done2 |
|
nop |
|
|
|
mfctl %cr16,$tick |
|
sub $tick,$lasttick,$diff |
|
copy $tick,$lasttick |
|
cmpclr,<> $lastdiff,$diff,$tick |
|
ldi 1,$tick |
|
|
|
ldi 1,%r1 |
|
xor %r1,$tick,$tick |
|
addb,<> $tick,$cnt,L\$oop2 |
|
shladd,l $tick,2,$out,$out |
|
L\$done2 |
|
bv ($rp) |
|
.EXIT |
|
add $rv,$cnt,$rv |
|
.PROCEND |
|
___ |
|
} |
|
$code =~ s/cmpib,\*/comib,/gm if ($SIZE_T==4); |
|
$code =~ s/,\*/,/gm if ($SIZE_T==4); |
|
$code =~ s/\bbv\b/bve/gm if ($SIZE_T==8); |
|
print $code; |
|
close STDOUT; |
|
|
|
|