1e1051a39Sopenharmony_ci#! /usr/bin/env perl 2e1051a39Sopenharmony_ci# Copyright 2009-2020 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci# 4e1051a39Sopenharmony_ci# Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci# this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci# in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci# https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci# $output is the last argument if it looks like a file (it has an extension) 11e1051a39Sopenharmony_ci# $flavour is the first argument if it doesn't look like a file 12e1051a39Sopenharmony_ci$output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef; 13e1051a39Sopenharmony_ci$flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef; 14e1051a39Sopenharmony_ci 15e1051a39Sopenharmony_ci$output and open STDOUT,">$output"; 16e1051a39Sopenharmony_ci 17e1051a39Sopenharmony_ciif ($flavour =~ /64/) { 18e1051a39Sopenharmony_ci $LEVEL ="2.0W"; 19e1051a39Sopenharmony_ci $SIZE_T =8; 20e1051a39Sopenharmony_ci $ST ="std"; 21e1051a39Sopenharmony_ci} else { 22e1051a39Sopenharmony_ci $LEVEL ="1.1"; 23e1051a39Sopenharmony_ci $SIZE_T =4; 24e1051a39Sopenharmony_ci $ST ="stw"; 25e1051a39Sopenharmony_ci} 26e1051a39Sopenharmony_ci 27e1051a39Sopenharmony_ci$rp="%r2"; 28e1051a39Sopenharmony_ci$sp="%r30"; 29e1051a39Sopenharmony_ci$rv="%r28"; 30e1051a39Sopenharmony_ci 31e1051a39Sopenharmony_ci$code=<<___; 32e1051a39Sopenharmony_ci .LEVEL $LEVEL 33e1051a39Sopenharmony_ci .SPACE \$TEXT\$ 34e1051a39Sopenharmony_ci .SUBSPA \$CODE\$,QUAD=0,ALIGN=8,ACCESS=0x2C,CODE_ONLY 35e1051a39Sopenharmony_ci 36e1051a39Sopenharmony_ci .EXPORT OPENSSL_cpuid_setup,ENTRY 37e1051a39Sopenharmony_ci .ALIGN 8 38e1051a39Sopenharmony_ciOPENSSL_cpuid_setup 39e1051a39Sopenharmony_ci .PROC 40e1051a39Sopenharmony_ci .CALLINFO NO_CALLS 41e1051a39Sopenharmony_ci .ENTRY 42e1051a39Sopenharmony_ci bv ($rp) 43e1051a39Sopenharmony_ci .EXIT 44e1051a39Sopenharmony_ci nop 45e1051a39Sopenharmony_ci .PROCEND 46e1051a39Sopenharmony_ci 47e1051a39Sopenharmony_ci .EXPORT OPENSSL_rdtsc,ENTRY 48e1051a39Sopenharmony_ci .ALIGN 8 49e1051a39Sopenharmony_ciOPENSSL_rdtsc 50e1051a39Sopenharmony_ci .PROC 51e1051a39Sopenharmony_ci .CALLINFO NO_CALLS 52e1051a39Sopenharmony_ci .ENTRY 53e1051a39Sopenharmony_ci mfctl %cr16,$rv 54e1051a39Sopenharmony_ci bv ($rp) 55e1051a39Sopenharmony_ci .EXIT 56e1051a39Sopenharmony_ci nop 57e1051a39Sopenharmony_ci .PROCEND 58e1051a39Sopenharmony_ci 59e1051a39Sopenharmony_ci .EXPORT OPENSSL_wipe_cpu,ENTRY 60e1051a39Sopenharmony_ci .ALIGN 8 61e1051a39Sopenharmony_ciOPENSSL_wipe_cpu 62e1051a39Sopenharmony_ci .PROC 63e1051a39Sopenharmony_ci .CALLINFO NO_CALLS 64e1051a39Sopenharmony_ci .ENTRY 65e1051a39Sopenharmony_ci xor %r0,%r0,%r1 66e1051a39Sopenharmony_ci fcpy,dbl %fr0,%fr4 67e1051a39Sopenharmony_ci xor %r0,%r0,%r19 68e1051a39Sopenharmony_ci fcpy,dbl %fr0,%fr5 69e1051a39Sopenharmony_ci xor %r0,%r0,%r20 70e1051a39Sopenharmony_ci fcpy,dbl %fr0,%fr6 71e1051a39Sopenharmony_ci xor %r0,%r0,%r21 72e1051a39Sopenharmony_ci fcpy,dbl %fr0,%fr7 73e1051a39Sopenharmony_ci xor %r0,%r0,%r22 74e1051a39Sopenharmony_ci fcpy,dbl %fr0,%fr8 75e1051a39Sopenharmony_ci xor %r0,%r0,%r23 76e1051a39Sopenharmony_ci fcpy,dbl %fr0,%fr9 77e1051a39Sopenharmony_ci xor %r0,%r0,%r24 78e1051a39Sopenharmony_ci fcpy,dbl %fr0,%fr10 79e1051a39Sopenharmony_ci xor %r0,%r0,%r25 80e1051a39Sopenharmony_ci fcpy,dbl %fr0,%fr11 81e1051a39Sopenharmony_ci xor %r0,%r0,%r26 82e1051a39Sopenharmony_ci fcpy,dbl %fr0,%fr22 83e1051a39Sopenharmony_ci xor %r0,%r0,%r29 84e1051a39Sopenharmony_ci fcpy,dbl %fr0,%fr23 85e1051a39Sopenharmony_ci xor %r0,%r0,%r31 86e1051a39Sopenharmony_ci fcpy,dbl %fr0,%fr24 87e1051a39Sopenharmony_ci fcpy,dbl %fr0,%fr25 88e1051a39Sopenharmony_ci fcpy,dbl %fr0,%fr26 89e1051a39Sopenharmony_ci fcpy,dbl %fr0,%fr27 90e1051a39Sopenharmony_ci fcpy,dbl %fr0,%fr28 91e1051a39Sopenharmony_ci fcpy,dbl %fr0,%fr29 92e1051a39Sopenharmony_ci fcpy,dbl %fr0,%fr30 93e1051a39Sopenharmony_ci fcpy,dbl %fr0,%fr31 94e1051a39Sopenharmony_ci bv ($rp) 95e1051a39Sopenharmony_ci .EXIT 96e1051a39Sopenharmony_ci ldo 0($sp),$rv 97e1051a39Sopenharmony_ci .PROCEND 98e1051a39Sopenharmony_ci___ 99e1051a39Sopenharmony_ci{ 100e1051a39Sopenharmony_cimy $inp="%r26"; 101e1051a39Sopenharmony_cimy $len="%r25"; 102e1051a39Sopenharmony_ci 103e1051a39Sopenharmony_ci$code.=<<___; 104e1051a39Sopenharmony_ci .EXPORT OPENSSL_cleanse,ENTRY,ARGW0=GR,ARGW1=GR 105e1051a39Sopenharmony_ci .ALIGN 8 106e1051a39Sopenharmony_ciOPENSSL_cleanse 107e1051a39Sopenharmony_ci .PROC 108e1051a39Sopenharmony_ci .CALLINFO NO_CALLS 109e1051a39Sopenharmony_ci .ENTRY 110e1051a39Sopenharmony_ci cmpib,*= 0,$len,L\$done 111e1051a39Sopenharmony_ci nop 112e1051a39Sopenharmony_ci cmpib,*>>= 15,$len,L\$ittle 113e1051a39Sopenharmony_ci ldi $SIZE_T-1,%r1 114e1051a39Sopenharmony_ci 115e1051a39Sopenharmony_ciL\$align 116e1051a39Sopenharmony_ci and,*<> $inp,%r1,%r28 117e1051a39Sopenharmony_ci b,n L\$aligned 118e1051a39Sopenharmony_ci stb %r0,0($inp) 119e1051a39Sopenharmony_ci ldo -1($len),$len 120e1051a39Sopenharmony_ci b L\$align 121e1051a39Sopenharmony_ci ldo 1($inp),$inp 122e1051a39Sopenharmony_ci 123e1051a39Sopenharmony_ciL\$aligned 124e1051a39Sopenharmony_ci andcm $len,%r1,%r28 125e1051a39Sopenharmony_ciL\$ot 126e1051a39Sopenharmony_ci $ST %r0,0($inp) 127e1051a39Sopenharmony_ci addib,*<> -$SIZE_T,%r28,L\$ot 128e1051a39Sopenharmony_ci ldo $SIZE_T($inp),$inp 129e1051a39Sopenharmony_ci 130e1051a39Sopenharmony_ci and,*<> $len,%r1,$len 131e1051a39Sopenharmony_ci b,n L\$done 132e1051a39Sopenharmony_ciL\$ittle 133e1051a39Sopenharmony_ci stb %r0,0($inp) 134e1051a39Sopenharmony_ci addib,*<> -1,$len,L\$ittle 135e1051a39Sopenharmony_ci ldo 1($inp),$inp 136e1051a39Sopenharmony_ciL\$done 137e1051a39Sopenharmony_ci bv ($rp) 138e1051a39Sopenharmony_ci .EXIT 139e1051a39Sopenharmony_ci nop 140e1051a39Sopenharmony_ci .PROCEND 141e1051a39Sopenharmony_ci___ 142e1051a39Sopenharmony_ci} 143e1051a39Sopenharmony_ci{ 144e1051a39Sopenharmony_cimy ($in1,$in2,$len)=("%r26","%r25","%r24"); 145e1051a39Sopenharmony_ci 146e1051a39Sopenharmony_ci$code.=<<___; 147e1051a39Sopenharmony_ci .EXPORT CRYPTO_memcmp,ENTRY,ARGW0=GR,ARGW1=GR,ARGW1=GR 148e1051a39Sopenharmony_ci .ALIGN 8 149e1051a39Sopenharmony_ciCRYPTO_memcmp 150e1051a39Sopenharmony_ci .PROC 151e1051a39Sopenharmony_ci .CALLINFO NO_CALLS 152e1051a39Sopenharmony_ci .ENTRY 153e1051a39Sopenharmony_ci cmpib,*= 0,$len,L\$no_data 154e1051a39Sopenharmony_ci xor $rv,$rv,$rv 155e1051a39Sopenharmony_ci 156e1051a39Sopenharmony_ciL\$oop_cmp 157e1051a39Sopenharmony_ci ldb 0($in1),%r19 158e1051a39Sopenharmony_ci ldb 0($in2),%r20 159e1051a39Sopenharmony_ci ldo 1($in1),$in1 160e1051a39Sopenharmony_ci ldo 1($in2),$in2 161e1051a39Sopenharmony_ci xor %r19,%r20,%r29 162e1051a39Sopenharmony_ci addib,*<> -1,$len,L\$oop_cmp 163e1051a39Sopenharmony_ci or %r29,$rv,$rv 164e1051a39Sopenharmony_ci 165e1051a39Sopenharmony_ci sub %r0,$rv,%r29 166e1051a39Sopenharmony_ci extru %r29,0,1,$rv 167e1051a39Sopenharmony_ciL\$no_data 168e1051a39Sopenharmony_ci bv ($rp) 169e1051a39Sopenharmony_ci .EXIT 170e1051a39Sopenharmony_ci nop 171e1051a39Sopenharmony_ci .PROCEND 172e1051a39Sopenharmony_ci___ 173e1051a39Sopenharmony_ci} 174e1051a39Sopenharmony_ci{ 175e1051a39Sopenharmony_cimy ($out,$cnt,$max)=("%r26","%r25","%r24"); 176e1051a39Sopenharmony_cimy ($tick,$lasttick)=("%r23","%r22"); 177e1051a39Sopenharmony_cimy ($diff,$lastdiff)=("%r21","%r20"); 178e1051a39Sopenharmony_ci 179e1051a39Sopenharmony_ci$code.=<<___; 180e1051a39Sopenharmony_ci .EXPORT OPENSSL_instrument_bus,ENTRY,ARGW0=GR,ARGW1=GR 181e1051a39Sopenharmony_ci .ALIGN 8 182e1051a39Sopenharmony_ciOPENSSL_instrument_bus 183e1051a39Sopenharmony_ci .PROC 184e1051a39Sopenharmony_ci .CALLINFO NO_CALLS 185e1051a39Sopenharmony_ci .ENTRY 186e1051a39Sopenharmony_ci copy $cnt,$rv 187e1051a39Sopenharmony_ci mfctl %cr16,$tick 188e1051a39Sopenharmony_ci copy $tick,$lasttick 189e1051a39Sopenharmony_ci ldi 0,$diff 190e1051a39Sopenharmony_ci 191e1051a39Sopenharmony_ci fdc 0($out) 192e1051a39Sopenharmony_ci ldw 0($out),$tick 193e1051a39Sopenharmony_ci add $diff,$tick,$tick 194e1051a39Sopenharmony_ci stw $tick,0($out) 195e1051a39Sopenharmony_ciL\$oop 196e1051a39Sopenharmony_ci mfctl %cr16,$tick 197e1051a39Sopenharmony_ci sub $tick,$lasttick,$diff 198e1051a39Sopenharmony_ci copy $tick,$lasttick 199e1051a39Sopenharmony_ci 200e1051a39Sopenharmony_ci fdc 0($out) 201e1051a39Sopenharmony_ci ldw 0($out),$tick 202e1051a39Sopenharmony_ci add $diff,$tick,$tick 203e1051a39Sopenharmony_ci stw $tick,0($out) 204e1051a39Sopenharmony_ci 205e1051a39Sopenharmony_ci addib,<> -1,$cnt,L\$oop 206e1051a39Sopenharmony_ci addi 4,$out,$out 207e1051a39Sopenharmony_ci 208e1051a39Sopenharmony_ci bv ($rp) 209e1051a39Sopenharmony_ci .EXIT 210e1051a39Sopenharmony_ci sub $rv,$cnt,$rv 211e1051a39Sopenharmony_ci .PROCEND 212e1051a39Sopenharmony_ci 213e1051a39Sopenharmony_ci .EXPORT OPENSSL_instrument_bus2,ENTRY,ARGW0=GR,ARGW1=GR 214e1051a39Sopenharmony_ci .ALIGN 8 215e1051a39Sopenharmony_ciOPENSSL_instrument_bus2 216e1051a39Sopenharmony_ci .PROC 217e1051a39Sopenharmony_ci .CALLINFO NO_CALLS 218e1051a39Sopenharmony_ci .ENTRY 219e1051a39Sopenharmony_ci copy $cnt,$rv 220e1051a39Sopenharmony_ci sub %r0,$cnt,$cnt 221e1051a39Sopenharmony_ci 222e1051a39Sopenharmony_ci mfctl %cr16,$tick 223e1051a39Sopenharmony_ci copy $tick,$lasttick 224e1051a39Sopenharmony_ci ldi 0,$diff 225e1051a39Sopenharmony_ci 226e1051a39Sopenharmony_ci fdc 0($out) 227e1051a39Sopenharmony_ci ldw 0($out),$tick 228e1051a39Sopenharmony_ci add $diff,$tick,$tick 229e1051a39Sopenharmony_ci stw $tick,0($out) 230e1051a39Sopenharmony_ci 231e1051a39Sopenharmony_ci mfctl %cr16,$tick 232e1051a39Sopenharmony_ci sub $tick,$lasttick,$diff 233e1051a39Sopenharmony_ci copy $tick,$lasttick 234e1051a39Sopenharmony_ciL\$oop2 235e1051a39Sopenharmony_ci copy $diff,$lastdiff 236e1051a39Sopenharmony_ci fdc 0($out) 237e1051a39Sopenharmony_ci ldw 0($out),$tick 238e1051a39Sopenharmony_ci add $diff,$tick,$tick 239e1051a39Sopenharmony_ci stw $tick,0($out) 240e1051a39Sopenharmony_ci 241e1051a39Sopenharmony_ci addib,= -1,$max,L\$done2 242e1051a39Sopenharmony_ci nop 243e1051a39Sopenharmony_ci 244e1051a39Sopenharmony_ci mfctl %cr16,$tick 245e1051a39Sopenharmony_ci sub $tick,$lasttick,$diff 246e1051a39Sopenharmony_ci copy $tick,$lasttick 247e1051a39Sopenharmony_ci cmpclr,<> $lastdiff,$diff,$tick 248e1051a39Sopenharmony_ci ldi 1,$tick 249e1051a39Sopenharmony_ci 250e1051a39Sopenharmony_ci ldi 1,%r1 251e1051a39Sopenharmony_ci xor %r1,$tick,$tick 252e1051a39Sopenharmony_ci addb,<> $tick,$cnt,L\$oop2 253e1051a39Sopenharmony_ci shladd,l $tick,2,$out,$out 254e1051a39Sopenharmony_ciL\$done2 255e1051a39Sopenharmony_ci bv ($rp) 256e1051a39Sopenharmony_ci .EXIT 257e1051a39Sopenharmony_ci add $rv,$cnt,$rv 258e1051a39Sopenharmony_ci .PROCEND 259e1051a39Sopenharmony_ci___ 260e1051a39Sopenharmony_ci} 261e1051a39Sopenharmony_ci 262e1051a39Sopenharmony_ciif (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1` 263e1051a39Sopenharmony_ci =~ /GNU assembler/) { 264e1051a39Sopenharmony_ci $gnuas = 1; 265e1051a39Sopenharmony_ci} 266e1051a39Sopenharmony_ci 267e1051a39Sopenharmony_ciforeach(split("\n",$code)) { 268e1051a39Sopenharmony_ci 269e1051a39Sopenharmony_ci s/(\.LEVEL\s+2\.0)W/$1w/ if ($gnuas && $SIZE_T==8); 270e1051a39Sopenharmony_ci s/\.SPACE\s+\$TEXT\$/.text/ if ($gnuas && $SIZE_T==8); 271e1051a39Sopenharmony_ci s/\.SUBSPA.*// if ($gnuas && $SIZE_T==8); 272e1051a39Sopenharmony_ci s/cmpib,\*/comib,/ if ($SIZE_T==4); 273e1051a39Sopenharmony_ci s/,\*/,/ if ($SIZE_T==4); 274e1051a39Sopenharmony_ci s/\bbv\b/bve/ if ($SIZE_T==8); 275e1051a39Sopenharmony_ci 276e1051a39Sopenharmony_ci print $_,"\n"; 277e1051a39Sopenharmony_ci} 278e1051a39Sopenharmony_ciclose STDOUT or die "error closing STDOUT: $!"; 279e1051a39Sopenharmony_ci 280