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