OLD | NEW |
| (Empty) |
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,Ldone | |
101 nop | |
102 cmpib,*>>= 15,$len,Little | |
103 ldi $SIZE_T-1,%r1 | |
104 | |
105 Lalign | |
106 and,*<> $inp,%r1,%r28 | |
107 b,n Laligned | |
108 stb %r0,0($inp) | |
109 ldo -1($len),$len | |
110 b Lalign | |
111 ldo 1($inp),$inp | |
112 | |
113 Laligned | |
114 andcm $len,%r1,%r28 | |
115 Lot | |
116 $ST %r0,0($inp) | |
117 addib,*<> -$SIZE_T,%r28,Lot | |
118 ldo $SIZE_T($inp),$inp | |
119 | |
120 and,*<> $len,%r1,$len | |
121 b,n Ldone | |
122 Little | |
123 stb %r0,0($inp) | |
124 addib,*<> -1,$len,Little | |
125 ldo 1($inp),$inp | |
126 Ldone | |
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 Loop | |
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,Loop | |
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 Loop2 | |
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,Ldone2 | |
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,Loop2 | |
212 shladd,l $tick,2,$out,$out | |
213 Ldone2 | |
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 print $code; | |
223 close STDOUT; | |
224 | |
OLD | NEW |