diff options
Diffstat (limited to 'src/lib/libcrypto/pariscid.pl')
-rw-r--r-- | src/lib/libcrypto/pariscid.pl | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/src/lib/libcrypto/pariscid.pl b/src/lib/libcrypto/pariscid.pl new file mode 100644 index 0000000000..477ec9b87d --- /dev/null +++ b/src/lib/libcrypto/pariscid.pl | |||
@@ -0,0 +1,224 @@ | |||
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 | |||