1238384Sjkim#!/usr/bin/env perl 2238384Sjkim 3238384Sjkim$flavour = shift; 4238384Sjkim$output = shift; 5238384Sjkimopen STDOUT,">$output"; 6238384Sjkim 7238384Sjkimif ($flavour =~ /64/) { 8238384Sjkim $LEVEL ="2.0W"; 9238384Sjkim $SIZE_T =8; 10238384Sjkim $ST ="std"; 11238384Sjkim} else { 12238384Sjkim $LEVEL ="1.1"; 13238384Sjkim $SIZE_T =4; 14238384Sjkim $ST ="stw"; 15238384Sjkim} 16238384Sjkim 17238384Sjkim$rp="%r2"; 18238384Sjkim$sp="%r30"; 19238384Sjkim$rv="%r28"; 20238384Sjkim 21238384Sjkim$code=<<___; 22238384Sjkim .LEVEL $LEVEL 23238384Sjkim .SPACE \$TEXT\$ 24238384Sjkim .SUBSPA \$CODE\$,QUAD=0,ALIGN=8,ACCESS=0x2C,CODE_ONLY 25238384Sjkim 26238384Sjkim .EXPORT OPENSSL_cpuid_setup,ENTRY 27238384Sjkim .ALIGN 8 28238384SjkimOPENSSL_cpuid_setup 29238384Sjkim .PROC 30238384Sjkim .CALLINFO NO_CALLS 31238384Sjkim .ENTRY 32238384Sjkim bv ($rp) 33238384Sjkim .EXIT 34238384Sjkim nop 35238384Sjkim .PROCEND 36238384Sjkim 37238384Sjkim .EXPORT OPENSSL_rdtsc,ENTRY 38238384Sjkim .ALIGN 8 39238384SjkimOPENSSL_rdtsc 40238384Sjkim .PROC 41238384Sjkim .CALLINFO NO_CALLS 42238384Sjkim .ENTRY 43238384Sjkim mfctl %cr16,$rv 44238384Sjkim bv ($rp) 45238384Sjkim .EXIT 46238384Sjkim nop 47238384Sjkim .PROCEND 48238384Sjkim 49238384Sjkim .EXPORT OPENSSL_wipe_cpu,ENTRY 50238384Sjkim .ALIGN 8 51238384SjkimOPENSSL_wipe_cpu 52238384Sjkim .PROC 53238384Sjkim .CALLINFO NO_CALLS 54238384Sjkim .ENTRY 55238384Sjkim xor %r0,%r0,%r1 56238384Sjkim fcpy,dbl %fr0,%fr4 57238384Sjkim xor %r0,%r0,%r19 58238384Sjkim fcpy,dbl %fr0,%fr5 59238384Sjkim xor %r0,%r0,%r20 60238384Sjkim fcpy,dbl %fr0,%fr6 61238384Sjkim xor %r0,%r0,%r21 62238384Sjkim fcpy,dbl %fr0,%fr7 63238384Sjkim xor %r0,%r0,%r22 64238384Sjkim fcpy,dbl %fr0,%fr8 65238384Sjkim xor %r0,%r0,%r23 66238384Sjkim fcpy,dbl %fr0,%fr9 67238384Sjkim xor %r0,%r0,%r24 68238384Sjkim fcpy,dbl %fr0,%fr10 69238384Sjkim xor %r0,%r0,%r25 70238384Sjkim fcpy,dbl %fr0,%fr11 71238384Sjkim xor %r0,%r0,%r26 72238384Sjkim fcpy,dbl %fr0,%fr22 73238384Sjkim xor %r0,%r0,%r29 74238384Sjkim fcpy,dbl %fr0,%fr23 75238384Sjkim xor %r0,%r0,%r31 76238384Sjkim fcpy,dbl %fr0,%fr24 77238384Sjkim fcpy,dbl %fr0,%fr25 78238384Sjkim fcpy,dbl %fr0,%fr26 79238384Sjkim fcpy,dbl %fr0,%fr27 80238384Sjkim fcpy,dbl %fr0,%fr28 81238384Sjkim fcpy,dbl %fr0,%fr29 82238384Sjkim fcpy,dbl %fr0,%fr30 83238384Sjkim fcpy,dbl %fr0,%fr31 84238384Sjkim bv ($rp) 85238384Sjkim .EXIT 86238384Sjkim ldo 0($sp),$rv 87238384Sjkim .PROCEND 88238384Sjkim___ 89238384Sjkim{ 90238384Sjkimmy $inp="%r26"; 91238384Sjkimmy $len="%r25"; 92238384Sjkim 93238384Sjkim$code.=<<___; 94238384Sjkim .EXPORT OPENSSL_cleanse,ENTRY,ARGW0=GR,ARGW1=GR 95238384Sjkim .ALIGN 8 96238384SjkimOPENSSL_cleanse 97238384Sjkim .PROC 98238384Sjkim .CALLINFO NO_CALLS 99238384Sjkim .ENTRY 100264331Sjkim cmpib,*= 0,$len,L\$done 101238384Sjkim nop 102264331Sjkim cmpib,*>>= 15,$len,L\$ittle 103238384Sjkim ldi $SIZE_T-1,%r1 104238384Sjkim 105264331SjkimL\$align 106238384Sjkim and,*<> $inp,%r1,%r28 107264331Sjkim b,n L\$aligned 108238384Sjkim stb %r0,0($inp) 109238384Sjkim ldo -1($len),$len 110264331Sjkim b L\$align 111238384Sjkim ldo 1($inp),$inp 112238384Sjkim 113264331SjkimL\$aligned 114238384Sjkim andcm $len,%r1,%r28 115264331SjkimL\$ot 116238384Sjkim $ST %r0,0($inp) 117264331Sjkim addib,*<> -$SIZE_T,%r28,L\$ot 118238384Sjkim ldo $SIZE_T($inp),$inp 119238384Sjkim 120238384Sjkim and,*<> $len,%r1,$len 121264331Sjkim b,n L\$done 122264331SjkimL\$ittle 123238384Sjkim stb %r0,0($inp) 124264331Sjkim addib,*<> -1,$len,L\$ittle 125238384Sjkim ldo 1($inp),$inp 126264331SjkimL\$done 127238384Sjkim bv ($rp) 128238384Sjkim .EXIT 129238384Sjkim nop 130238384Sjkim .PROCEND 131238384Sjkim___ 132238384Sjkim} 133238384Sjkim{ 134238384Sjkimmy ($out,$cnt,$max)=("%r26","%r25","%r24"); 135238384Sjkimmy ($tick,$lasttick)=("%r23","%r22"); 136238384Sjkimmy ($diff,$lastdiff)=("%r21","%r20"); 137238384Sjkim 138238384Sjkim$code.=<<___; 139238384Sjkim .EXPORT OPENSSL_instrument_bus,ENTRY,ARGW0=GR,ARGW1=GR 140238384Sjkim .ALIGN 8 141238384SjkimOPENSSL_instrument_bus 142238384Sjkim .PROC 143238384Sjkim .CALLINFO NO_CALLS 144238384Sjkim .ENTRY 145238384Sjkim copy $cnt,$rv 146238384Sjkim mfctl %cr16,$tick 147238384Sjkim copy $tick,$lasttick 148238384Sjkim ldi 0,$diff 149238384Sjkim 150238384Sjkim fdc 0($out) 151238384Sjkim ldw 0($out),$tick 152238384Sjkim add $diff,$tick,$tick 153238384Sjkim stw $tick,0($out) 154264331SjkimL\$oop 155238384Sjkim mfctl %cr16,$tick 156238384Sjkim sub $tick,$lasttick,$diff 157238384Sjkim copy $tick,$lasttick 158238384Sjkim 159238384Sjkim fdc 0($out) 160238384Sjkim ldw 0($out),$tick 161238384Sjkim add $diff,$tick,$tick 162238384Sjkim stw $tick,0($out) 163238384Sjkim 164264331Sjkim addib,<> -1,$cnt,L\$oop 165238384Sjkim addi 4,$out,$out 166238384Sjkim 167238384Sjkim bv ($rp) 168238384Sjkim .EXIT 169238384Sjkim sub $rv,$cnt,$rv 170238384Sjkim .PROCEND 171238384Sjkim 172238384Sjkim .EXPORT OPENSSL_instrument_bus2,ENTRY,ARGW0=GR,ARGW1=GR 173238384Sjkim .ALIGN 8 174238384SjkimOPENSSL_instrument_bus2 175238384Sjkim .PROC 176238384Sjkim .CALLINFO NO_CALLS 177238384Sjkim .ENTRY 178238384Sjkim copy $cnt,$rv 179238384Sjkim sub %r0,$cnt,$cnt 180238384Sjkim 181238384Sjkim mfctl %cr16,$tick 182238384Sjkim copy $tick,$lasttick 183238384Sjkim ldi 0,$diff 184238384Sjkim 185238384Sjkim fdc 0($out) 186238384Sjkim ldw 0($out),$tick 187238384Sjkim add $diff,$tick,$tick 188238384Sjkim stw $tick,0($out) 189238384Sjkim 190238384Sjkim mfctl %cr16,$tick 191238384Sjkim sub $tick,$lasttick,$diff 192238384Sjkim copy $tick,$lasttick 193264331SjkimL\$oop2 194238384Sjkim copy $diff,$lastdiff 195238384Sjkim fdc 0($out) 196238384Sjkim ldw 0($out),$tick 197238384Sjkim add $diff,$tick,$tick 198238384Sjkim stw $tick,0($out) 199238384Sjkim 200264331Sjkim addib,= -1,$max,L\$done2 201238384Sjkim nop 202238384Sjkim 203238384Sjkim mfctl %cr16,$tick 204238384Sjkim sub $tick,$lasttick,$diff 205238384Sjkim copy $tick,$lasttick 206238384Sjkim cmpclr,<> $lastdiff,$diff,$tick 207238384Sjkim ldi 1,$tick 208238384Sjkim 209238384Sjkim ldi 1,%r1 210238384Sjkim xor %r1,$tick,$tick 211264331Sjkim addb,<> $tick,$cnt,L\$oop2 212238384Sjkim shladd,l $tick,2,$out,$out 213264331SjkimL\$done2 214238384Sjkim bv ($rp) 215238384Sjkim .EXIT 216238384Sjkim add $rv,$cnt,$rv 217238384Sjkim .PROCEND 218238384Sjkim___ 219238384Sjkim} 220264331Sjkim$code =~ s/cmpib,\*/comib,/gm if ($SIZE_T==4); 221264331Sjkim$code =~ s/,\*/,/gm if ($SIZE_T==4); 222264331Sjkim$code =~ s/\bbv\b/bve/gm if ($SIZE_T==8); 223238384Sjkimprint $code; 224238384Sjkimclose STDOUT; 225238384Sjkim 226