Replace memset with OPENSSL_clear_free()
[openssl.git] / crypto / pariscid.pl
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