]>
Commit | Line | Data |
---|---|---|
96530eea PS |
1 | #! /usr/bin/env perl |
2 | # Copyright 2009-2017 The OpenSSL Project Authors. All Rights Reserved. | |
3 | # | |
4 | # Licensed under the OpenSSL license (the "License"). You may not use | |
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 | ||
9 | $flavour = shift; | |
10 | ||
11 | if ($flavour =~ /3[12]/) { | |
12 | $SIZE_T=4; | |
13 | $g=""; | |
14 | } else { | |
15 | $SIZE_T=8; | |
16 | $g="g"; | |
17 | } | |
8626230a | 18 | |
96530eea PS |
19 | while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} |
20 | open STDOUT,">$output"; | |
21 | ||
22 | $ra="%r14"; | |
23 | $sp="%r15"; | |
24 | $stdframe=16*$SIZE_T+4*8; | |
25 | ||
26 | $code=<<___; | |
bc4e831c PS |
27 | #include "s390x_arch.h" |
28 | ||
96530eea PS |
29 | .text |
30 | ||
8626230a | 31 | .globl OPENSSL_s390x_facilities |
96530eea | 32 | .type OPENSSL_s390x_facilities,\@function |
8626230a AP |
33 | .align 16 |
34 | OPENSSL_s390x_facilities: | |
35 | lghi %r0,0 | |
670ad0fb | 36 | larl %r4,OPENSSL_s390xcap_P |
bc4e831c PS |
37 | |
38 | stg %r0,S390X_STFLE+8(%r4) # wipe capability vectors | |
39 | stg %r0,S390X_STFLE+16(%r4) | |
40 | stg %r0,S390X_STFLE+24(%r4) | |
41 | stg %r0,S390X_KIMD(%r4) | |
42 | stg %r0,S390X_KIMD+8(%r4) | |
43 | stg %r0,S390X_KLMD(%r4) | |
44 | stg %r0,S390X_KLMD+8(%r4) | |
45 | stg %r0,S390X_KM(%r4) | |
46 | stg %r0,S390X_KM+8(%r4) | |
47 | stg %r0,S390X_KMC(%r4) | |
48 | stg %r0,S390X_KMC+8(%r4) | |
49 | stg %r0,S390X_KMAC(%r4) | |
50 | stg %r0,S390X_KMAC+8(%r4) | |
51 | stg %r0,S390X_KMCTR(%r4) | |
52 | stg %r0,S390X_KMCTR+8(%r4) | |
53 | stg %r0,S390X_KMO(%r4) | |
54 | stg %r0,S390X_KMO+8(%r4) | |
55 | stg %r0,S390X_KMF(%r4) | |
56 | stg %r0,S390X_KMF+8(%r4) | |
57 | stg %r0,S390X_PRNO(%r4) | |
58 | stg %r0,S390X_PRNO+8(%r4) | |
59 | stg %r0,S390X_KMA(%r4) | |
60 | stg %r0,S390X_KMA+8(%r4) | |
61 | ||
62 | .long 0xb2b04000 # stfle 0(%r4) | |
90ba3a28 AP |
63 | brc 8,.Ldone |
64 | lghi %r0,1 | |
bc4e831c PS |
65 | .long 0xb2b04000 # stfle 0(%r4) |
66 | brc 8,.Ldone | |
67 | lghi %r0,2 | |
68 | .long 0xb2b04000 # stfle 0(%r4) | |
90ba3a28 | 69 | .Ldone: |
bc4e831c PS |
70 | lmg %r2,%r3,S390X_STFLE(%r4) |
71 | tmhl %r2,0x4000 # check for message-security-assist | |
670ad0fb AP |
72 | jz .Lret |
73 | ||
bc4e831c PS |
74 | lghi %r0,S390X_QUERY # query kimd capabilities |
75 | la %r1,S390X_KIMD(%r4) | |
76 | .long 0xb93e0002 # kimd %r0,%r2 | |
77 | ||
78 | lghi %r0,S390X_QUERY # query klmd capabilities | |
79 | la %r1,S390X_KLMD(%r4) | |
80 | .long 0xb93f0002 # klmd %r0,%r2 | |
81 | ||
82 | lghi %r0,S390X_QUERY # query km capability vector | |
83 | la %r1,S390X_KM(%r4) | |
84 | .long 0xb92e0042 # km %r4,%r2 | |
670ad0fb | 85 | |
bc4e831c PS |
86 | lghi %r0,S390X_QUERY # query kmc capability vector |
87 | la %r1,S390X_KMC(%r4) | |
88 | .long 0xb92f0042 # kmc %r4,%r2 | |
670ad0fb | 89 | |
bc4e831c PS |
90 | lghi %r0,S390X_QUERY # query kmac capability vector |
91 | la %r1,S390X_KMAC(%r4) | |
92 | .long 0xb91e0042 # kmac %r4,%r2 | |
670ad0fb | 93 | |
bc4e831c | 94 | tmhh %r3,0x0004 # check for message-security-assist-4 |
670ad0fb AP |
95 | jz .Lret |
96 | ||
bc4e831c PS |
97 | lghi %r0,S390X_QUERY # query kmctr capability vector |
98 | la %r1,S390X_KMCTR(%r4) | |
99 | .long 0xb92d2042 # kmctr %r4,%r2,%r2 | |
100 | ||
101 | lghi %r0,S390X_QUERY # query kmo capability vector | |
102 | la %r1,S390X_KMO(%r4) | |
103 | .long 0xb92b0042 # kmo %r4,%r2 | |
104 | ||
105 | lghi %r0,S390X_QUERY # query kmf capability vector | |
106 | la %r1,S390X_KMF(%r4) | |
107 | .long 0xb92a0042 # kmf %r4,%r2 | |
108 | ||
109 | tml %r2,0x40 # check for message-security-assist-5 | |
110 | jz .Lret | |
111 | ||
112 | lghi %r0,S390X_QUERY # query prno capability vector | |
113 | la %r1,S390X_PRNO(%r4) | |
114 | .long 0xb93c0042 # prno %r4,%r2 | |
115 | ||
116 | lg %r2,S390X_STFLE+16(%r4) | |
117 | tmhl %r2,0x2000 # check for message-security-assist-8 | |
118 | jz .Lret | |
119 | ||
120 | lghi %r0,S390X_QUERY # query kma capability vector | |
121 | la %r1,S390X_KMA(%r4) | |
122 | .long 0xb9294022 # kma %r2,%r4,%r2 | |
670ad0fb AP |
123 | |
124 | .Lret: | |
96530eea | 125 | br $ra |
8626230a AP |
126 | .size OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities |
127 | ||
128 | .globl OPENSSL_rdtsc | |
96530eea | 129 | .type OPENSSL_rdtsc,\@function |
8626230a AP |
130 | .align 16 |
131 | OPENSSL_rdtsc: | |
96530eea PS |
132 | stck 16($sp) |
133 | lg %r2,16($sp) | |
134 | br $ra | |
8626230a AP |
135 | .size OPENSSL_rdtsc,.-OPENSSL_rdtsc |
136 | ||
137 | .globl OPENSSL_atomic_add | |
96530eea | 138 | .type OPENSSL_atomic_add,\@function |
8626230a AP |
139 | .align 16 |
140 | OPENSSL_atomic_add: | |
141 | l %r1,0(%r2) | |
142 | .Lspin: lr %r0,%r1 | |
143 | ar %r0,%r3 | |
144 | cs %r1,%r0,0(%r2) | |
145 | brc 4,.Lspin | |
146 | lgfr %r2,%r0 # OpenSSL expects the new value | |
96530eea | 147 | br $ra |
8626230a AP |
148 | .size OPENSSL_atomic_add,.-OPENSSL_atomic_add |
149 | ||
150 | .globl OPENSSL_wipe_cpu | |
96530eea | 151 | .type OPENSSL_wipe_cpu,\@function |
8626230a AP |
152 | .align 16 |
153 | OPENSSL_wipe_cpu: | |
154 | xgr %r0,%r0 | |
155 | xgr %r1,%r1 | |
96530eea | 156 | lgr %r2,$sp |
8626230a AP |
157 | xgr %r3,%r3 |
158 | xgr %r4,%r4 | |
159 | lzdr %f0 | |
160 | lzdr %f1 | |
161 | lzdr %f2 | |
162 | lzdr %f3 | |
163 | lzdr %f4 | |
164 | lzdr %f5 | |
165 | lzdr %f6 | |
166 | lzdr %f7 | |
96530eea | 167 | br $ra |
8626230a AP |
168 | .size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu |
169 | ||
170 | .globl OPENSSL_cleanse | |
96530eea | 171 | .type OPENSSL_cleanse,\@function |
8626230a AP |
172 | .align 16 |
173 | OPENSSL_cleanse: | |
e822c756 AP |
174 | #if !defined(__s390x__) && !defined(__s390x) |
175 | llgfr %r3,%r3 | |
176 | #endif | |
8626230a AP |
177 | lghi %r4,15 |
178 | lghi %r0,0 | |
179 | clgr %r3,%r4 | |
180 | jh .Lot | |
7676eebf AP |
181 | clgr %r3,%r0 |
182 | bcr 8,%r14 | |
8626230a AP |
183 | .Little: |
184 | stc %r0,0(%r2) | |
185 | la %r2,1(%r2) | |
186 | brctg %r3,.Little | |
187 | br %r14 | |
188 | .align 4 | |
189 | .Lot: tmll %r2,7 | |
190 | jz .Laligned | |
191 | stc %r0,0(%r2) | |
192 | la %r2,1(%r2) | |
193 | brctg %r3,.Lot | |
194 | .Laligned: | |
195 | srlg %r4,%r3,3 | |
196 | .Loop: stg %r0,0(%r2) | |
197 | la %r2,8(%r2) | |
198 | brctg %r4,.Loop | |
199 | lghi %r4,7 | |
200 | ngr %r3,%r4 | |
201 | jnz .Little | |
96530eea | 202 | br $ra |
8626230a | 203 | .size OPENSSL_cleanse,.-OPENSSL_cleanse |
91fdacb2 | 204 | |
e33826f0 | 205 | .globl CRYPTO_memcmp |
96530eea | 206 | .type CRYPTO_memcmp,\@function |
e33826f0 AP |
207 | .align 16 |
208 | CRYPTO_memcmp: | |
209 | #if !defined(__s390x__) && !defined(__s390x) | |
210 | llgfr %r4,%r4 | |
211 | #endif | |
212 | lghi %r5,0 | |
213 | clgr %r4,%r5 | |
214 | je .Lno_data | |
215 | ||
216 | .Loop_cmp: | |
0a4c87a9 | 217 | llgc %r0,0(%r2) |
e33826f0 | 218 | la %r2,1(%r2) |
0a4c87a9 | 219 | llgc %r1,0(%r3) |
e33826f0 AP |
220 | la %r3,1(%r3) |
221 | xr %r1,%r0 | |
222 | or %r5,%r1 | |
223 | brctg %r4,.Loop_cmp | |
224 | ||
225 | lnr %r5,%r5 | |
226 | srl %r5,31 | |
227 | .Lno_data: | |
228 | lgr %r2,%r5 | |
96530eea | 229 | br $ra |
e33826f0 AP |
230 | .size CRYPTO_memcmp,.-CRYPTO_memcmp |
231 | ||
5fabb88a | 232 | .globl OPENSSL_instrument_bus |
96530eea | 233 | .type OPENSSL_instrument_bus,\@function |
5fabb88a AP |
234 | .align 16 |
235 | OPENSSL_instrument_bus: | |
236 | lghi %r2,0 | |
237 | br %r14 | |
238 | .size OPENSSL_instrument_bus,.-OPENSSL_instrument_bus | |
239 | ||
240 | .globl OPENSSL_instrument_bus2 | |
96530eea | 241 | .type OPENSSL_instrument_bus2,\@function |
5fabb88a AP |
242 | .align 16 |
243 | OPENSSL_instrument_bus2: | |
244 | lghi %r2,0 | |
96530eea | 245 | br $ra |
5fabb88a AP |
246 | .size OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2 |
247 | ||
bc4e831c | 248 | .globl OPENSSL_vx_probe |
96530eea | 249 | .type OPENSSL_vx_probe,\@function |
bc4e831c PS |
250 | .align 16 |
251 | OPENSSL_vx_probe: | |
252 | .word 0xe700,0x0000,0x0044 # vzero %v0 | |
96530eea | 253 | br $ra |
bc4e831c | 254 | .size OPENSSL_vx_probe,.-OPENSSL_vx_probe |
96530eea PS |
255 | ___ |
256 | ||
257 | ################ | |
258 | # void s390x_km(const unsigned char *in, size_t len, unsigned char *out, | |
259 | # unsigned int fc, void *param) | |
260 | { | |
261 | my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6)); | |
262 | $code.=<<___; | |
263 | .globl s390x_km | |
264 | .type s390x_km,\@function | |
265 | .align 16 | |
266 | s390x_km: | |
267 | lr %r0,$fc | |
268 | l${g}r %r1,$param | |
269 | ||
270 | .long 0xb92e0042 # km $out,$in | |
271 | brc 1,.-4 # pay attention to "partial completion" | |
bc4e831c | 272 | |
96530eea PS |
273 | br $ra |
274 | .size s390x_km,.-s390x_km | |
275 | ___ | |
276 | } | |
277 | ||
278 | ################ | |
279 | # void s390x_kma(const unsigned char *aad, size_t alen, | |
280 | # const unsigned char *in, size_t len, | |
281 | # unsigned char *out, unsigned int fc, void *param) | |
282 | { | |
283 | my ($aad,$alen,$in,$len,$out) = map("%r$_",(2..6)); | |
284 | $code.=<<___; | |
285 | .globl s390x_kma | |
286 | .type s390x_kma,\@function | |
287 | .align 16 | |
288 | s390x_kma: | |
289 | st${g} $out,6*$SIZE_T($sp) | |
290 | lm${g} %r0,%r1,$stdframe($sp) | |
291 | ||
292 | .long 0xb9292064 # kma $out,$aad,$in | |
293 | brc 1,.-4 # pay attention to "partial completion" | |
294 | ||
295 | l${g} $out,6*$SIZE_T($sp) | |
296 | br $ra | |
297 | .size s390x_kma,.-s390x_kma | |
298 | ___ | |
299 | } | |
300 | ||
301 | $code.=<<___; | |
91fdacb2 | 302 | .section .init |
96530eea PS |
303 | brasl $ra,OPENSSL_cpuid_setup |
304 | ___ | |
305 | ||
306 | $code =~ s/\`([^\`]*)\`/eval $1/gem; | |
307 | print $code; | |
308 | close STDOUT; # force flush |