Home | History | Annotate | Download | only in crypto
      1 #!/usr/bin/env perl
      2 
      3 $flavour = shift;
      4 $output = shift;
      5 open STDOUT,">$output";
      6 
      7 if ($flavour =~ /64/) {
      8 	$LEVEL		="2.0W";
      9 	$SIZE_T		=8;
     10 	$ST		="std";
     11 } else {
     12 	$LEVEL		="1.1";
     13 	$SIZE_T		=4;
     14 	$ST		="stw";
     15 }
     16 
     17 $rp="%r2";
     18 $sp="%r30";
     19 $rv="%r28";
     20 
     21 $code=<<___;
     22 	.LEVEL	$LEVEL
     23 	.SPACE	\$TEXT\$
     24 	.SUBSPA	\$CODE\$,QUAD=0,ALIGN=8,ACCESS=0x2C,CODE_ONLY
     25 
     26 	.EXPORT	OPENSSL_cpuid_setup,ENTRY
     27 	.ALIGN	8
     28 OPENSSL_cpuid_setup
     29 	.PROC
     30 	.CALLINFO	NO_CALLS
     31 	.ENTRY
     32 	bv	($rp)
     33 	.EXIT
     34 	nop
     35 	.PROCEND
     36 
     37 	.EXPORT	OPENSSL_rdtsc,ENTRY
     38 	.ALIGN	8
     39 OPENSSL_rdtsc
     40 	.PROC
     41 	.CALLINFO	NO_CALLS
     42 	.ENTRY
     43 	mfctl	%cr16,$rv
     44 	bv	($rp)
     45 	.EXIT
     46 	nop
     47 	.PROCEND
     48 
     49 	.EXPORT	OPENSSL_wipe_cpu,ENTRY
     50 	.ALIGN	8
     51 OPENSSL_wipe_cpu
     52 	.PROC
     53 	.CALLINFO	NO_CALLS
     54 	.ENTRY
     55 	xor		%r0,%r0,%r1
     56 	fcpy,dbl	%fr0,%fr4
     57 	xor		%r0,%r0,%r19
     58 	fcpy,dbl	%fr0,%fr5
     59 	xor		%r0,%r0,%r20
     60 	fcpy,dbl	%fr0,%fr6
     61 	xor		%r0,%r0,%r21
     62 	fcpy,dbl	%fr0,%fr7
     63 	xor		%r0,%r0,%r22
     64 	fcpy,dbl	%fr0,%fr8
     65 	xor		%r0,%r0,%r23
     66 	fcpy,dbl	%fr0,%fr9
     67 	xor		%r0,%r0,%r24
     68 	fcpy,dbl	%fr0,%fr10
     69 	xor		%r0,%r0,%r25
     70 	fcpy,dbl	%fr0,%fr11
     71 	xor		%r0,%r0,%r26
     72 	fcpy,dbl	%fr0,%fr22
     73 	xor		%r0,%r0,%r29
     74 	fcpy,dbl	%fr0,%fr23
     75 	xor		%r0,%r0,%r31
     76 	fcpy,dbl	%fr0,%fr24
     77 	fcpy,dbl	%fr0,%fr25
     78 	fcpy,dbl	%fr0,%fr26
     79 	fcpy,dbl	%fr0,%fr27
     80 	fcpy,dbl	%fr0,%fr28
     81 	fcpy,dbl	%fr0,%fr29
     82 	fcpy,dbl	%fr0,%fr30
     83 	fcpy,dbl	%fr0,%fr31
     84 	bv		($rp)
     85 	.EXIT
     86 	ldo		0($sp),$rv
     87 	.PROCEND
     88 ___
     89 {
     90 my $inp="%r26";
     91 my $len="%r25";
     92 
     93 $code.=<<___;
     94 	.EXPORT	OPENSSL_cleanse,ENTRY,ARGW0=GR,ARGW1=GR
     95 	.ALIGN	8
     96 OPENSSL_cleanse
     97 	.PROC
     98 	.CALLINFO	NO_CALLS
     99 	.ENTRY
    100 	cmpib,*=	0,$len,L\$done
    101 	nop
    102 	cmpib,*>>=	15,$len,L\$ittle
    103 	ldi		$SIZE_T-1,%r1
    104 
    105 L\$align
    106 	and,*<>		$inp,%r1,%r28
    107 	b,n		L\$aligned
    108 	stb		%r0,0($inp)
    109 	ldo		-1($len),$len
    110 	b		L\$align
    111 	ldo		1($inp),$inp
    112 
    113 L\$aligned
    114 	andcm		$len,%r1,%r28
    115 L\$ot
    116 	$ST		%r0,0($inp)
    117 	addib,*<>	-$SIZE_T,%r28,L\$ot
    118 	ldo		$SIZE_T($inp),$inp
    119 
    120 	and,*<>		$len,%r1,$len
    121 	b,n		L\$done
    122 L\$ittle
    123 	stb		%r0,0($inp)
    124 	addib,*<>	-1,$len,L\$ittle
    125 	ldo		1($inp),$inp
    126 L\$done
    127 	bv		($rp)
    128 	.EXIT
    129 	nop
    130 	.PROCEND
    131 ___
    132 }
    133 {
    134 my ($out,$cnt,$max)=("%r26","%r25","%r24");
    135 my ($tick,$lasttick)=("%r23","%r22");
    136 my ($diff,$lastdiff)=("%r21","%r20");
    137 
    138 $code.=<<___;
    139 	.EXPORT	OPENSSL_instrument_bus,ENTRY,ARGW0=GR,ARGW1=GR
    140 	.ALIGN	8
    141 OPENSSL_instrument_bus
    142 	.PROC
    143 	.CALLINFO	NO_CALLS
    144 	.ENTRY
    145 	copy		$cnt,$rv
    146 	mfctl		%cr16,$tick
    147 	copy		$tick,$lasttick
    148 	ldi		0,$diff
    149 
    150 	fdc		0($out)
    151 	ldw		0($out),$tick
    152 	add		$diff,$tick,$tick
    153 	stw		$tick,0($out)
    154 L\$oop
    155 	mfctl		%cr16,$tick
    156 	sub		$tick,$lasttick,$diff
    157 	copy		$tick,$lasttick
    158 
    159 	fdc		0($out)
    160 	ldw		0($out),$tick
    161 	add		$diff,$tick,$tick
    162 	stw		$tick,0($out)
    163 
    164 	addib,<>	-1,$cnt,L\$oop
    165 	addi		4,$out,$out
    166 
    167 	bv		($rp)
    168 	.EXIT
    169 	sub		$rv,$cnt,$rv
    170 	.PROCEND
    171 
    172 	.EXPORT	OPENSSL_instrument_bus2,ENTRY,ARGW0=GR,ARGW1=GR
    173 	.ALIGN	8
    174 OPENSSL_instrument_bus2
    175 	.PROC
    176 	.CALLINFO	NO_CALLS
    177 	.ENTRY
    178 	copy		$cnt,$rv
    179 	sub		%r0,$cnt,$cnt
    180 
    181 	mfctl		%cr16,$tick
    182 	copy		$tick,$lasttick
    183 	ldi		0,$diff
    184 
    185 	fdc		0($out)
    186 	ldw		0($out),$tick
    187 	add		$diff,$tick,$tick
    188 	stw		$tick,0($out)
    189 
    190 	mfctl		%cr16,$tick
    191 	sub		$tick,$lasttick,$diff
    192 	copy		$tick,$lasttick
    193 L\$oop2
    194 	copy		$diff,$lastdiff
    195 	fdc		0($out)
    196 	ldw		0($out),$tick
    197 	add		$diff,$tick,$tick
    198 	stw		$tick,0($out)
    199 
    200 	addib,=		-1,$max,L\$done2
    201 	nop
    202 
    203 	mfctl		%cr16,$tick
    204 	sub		$tick,$lasttick,$diff
    205 	copy		$tick,$lasttick
    206 	cmpclr,<>	$lastdiff,$diff,$tick
    207 	ldi		1,$tick
    208 
    209 	ldi		1,%r1
    210 	xor		%r1,$tick,$tick
    211 	addb,<>		$tick,$cnt,L\$oop2
    212 	shladd,l	$tick,2,$out,$out
    213 L\$done2
    214 	bv		($rp)
    215 	.EXIT
    216 	add		$rv,$cnt,$rv
    217 	.PROCEND
    218 ___
    219 }
    220 $code =~ s/cmpib,\*/comib,/gm	if ($SIZE_T==4);
    221 $code =~ s/,\*/,/gm		if ($SIZE_T==4);
    222 $code =~ s/\bbv\b/bve/gm	if ($SIZE_T==8);
    223 print $code;
    224 close STDOUT;
    225 
    226