| #!/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; |
| |