1 #include "s390x_arch.h"
2 
3 .text
4 
5 .globl	OPENSSL_s390x_facilities
6 .type	OPENSSL_s390x_facilities,@function
7 .align	16
8 OPENSSL_s390x_facilities:
9 	lghi	%r0,0
10 	larl	%r4,OPENSSL_s390xcap_P
11 
12 	stg	%r0,S390X_STFLE+8(%r4)	# wipe capability vectors
13 	stg	%r0,S390X_STFLE+16(%r4)
14 	stg	%r0,S390X_STFLE+24(%r4)
15 
16 	.long	0xb2b04000		# stfle	0(%r4)
17 	brc	8,.Ldone
18 	lghi	%r0,1
19 	.long	0xb2b04000		# stfle 0(%r4)
20 	brc	8,.Ldone
21 	lghi	%r0,2
22 	.long	0xb2b04000		# stfle 0(%r4)
23 .Ldone:
24 	br	%r14
25 .size	OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities
26 
27 .globl	OPENSSL_s390x_functions
28 .type	OPENSSL_s390x_functions,@function
29 .align	16
30 OPENSSL_s390x_functions:
31 	lghi	%r0,0
32 	larl	%r4,OPENSSL_s390xcap_P
33 
34 	stg	%r0,S390X_KIMD(%r4)	# wipe capability vectors
35 	stg	%r0,S390X_KIMD+8(%r4)
36 	stg	%r0,S390X_KLMD(%r4)
37 	stg	%r0,S390X_KLMD+8(%r4)
38 	stg	%r0,S390X_KM(%r4)
39 	stg	%r0,S390X_KM+8(%r4)
40 	stg	%r0,S390X_KMC(%r4)
41 	stg	%r0,S390X_KMC+8(%r4)
42 	stg	%r0,S390X_KMAC(%r4)
43 	stg	%r0,S390X_KMAC+8(%r4)
44 	stg	%r0,S390X_KMCTR(%r4)
45 	stg	%r0,S390X_KMCTR+8(%r4)
46 	stg	%r0,S390X_KMO(%r4)
47 	stg	%r0,S390X_KMO+8(%r4)
48 	stg	%r0,S390X_KMF(%r4)
49 	stg	%r0,S390X_KMF+8(%r4)
50 	stg	%r0,S390X_PRNO(%r4)
51 	stg	%r0,S390X_PRNO+8(%r4)
52 	stg	%r0,S390X_KMA(%r4)
53 	stg	%r0,S390X_KMA+8(%r4)
54 	stg	%r0,S390X_PCC(%r4)
55 	stg	%r0,S390X_PCC+8(%r4)
56 	stg	%r0,S390X_KDSA(%r4)
57 	stg	%r0,S390X_KDSA+8(%r4)
58 
59 	lmg	%r2,%r3,S390X_STFLE(%r4)
60 
61 	tmhl	%r2,0x4000		# check for message-security-assist
62 	jz	.Lret
63 
64 	lghi	%r0,S390X_QUERY		# query kimd capabilities
65 	la	%r1,S390X_KIMD(%r4)
66 	.long	0xb93e0002		# kimd %r0,%r2
67 
68 	lghi	%r0,S390X_QUERY		# query klmd capabilities
69 	la	%r1,S390X_KLMD(%r4)
70 	.long	0xb93f0002		# klmd %r0,%r2
71 
72 	lghi	%r0,S390X_QUERY		# query km capability vector
73 	la	%r1,S390X_KM(%r4)
74 	.long	0xb92e0042		# km %r4,%r2
75 
76 	lghi	%r0,S390X_QUERY		# query kmc capability vector
77 	la	%r1,S390X_KMC(%r4)
78 	.long	0xb92f0042		# kmc %r4,%r2
79 
80 	lghi	%r0,S390X_QUERY		# query kmac capability vector
81 	la	%r1,S390X_KMAC(%r4)
82 	.long	0xb91e0042		# kmac %r4,%r2
83 
84 	tmhh	%r3,0x0008		# check for message-security-assist-3
85 	jz	.Lret
86 
87 	lghi	%r0,S390X_QUERY		# query pcc capability vector
88 	la	%r1,S390X_PCC(%r4)
89 	.long	0xb92c0000		# pcc
90 
91 	tmhh	%r3,0x0004		# check for message-security-assist-4
92 	jz	.Lret
93 
94 	lghi	%r0,S390X_QUERY		# query kmctr capability vector
95 	la	%r1,S390X_KMCTR(%r4)
96 	.long	0xb92d2042		# kmctr %r4,%r2,%r2
97 
98 	lghi	%r0,S390X_QUERY		# query kmo capability vector
99 	la	%r1,S390X_KMO(%r4)
100 	.long	0xb92b0042		# kmo %r4,%r2
101 
102 	lghi	%r0,S390X_QUERY		# query kmf capability vector
103 	la	%r1,S390X_KMF(%r4)
104 	.long	0xb92a0042		# kmf %r4,%r2
105 
106 	tml	%r2,0x40		# check for message-security-assist-5
107 	jz	.Lret
108 
109 	lghi	%r0,S390X_QUERY		# query prno capability vector
110 	la	%r1,S390X_PRNO(%r4)
111 	.long	0xb93c0042		# prno %r4,%r2
112 
113 	lg	%r2,S390X_STFLE+16(%r4)
114 
115 	tmhl	%r2,0x2000		# check for message-security-assist-8
116 	jz	.Lret
117 
118 	lghi	%r0,S390X_QUERY		# query kma capability vector
119 	la	%r1,S390X_KMA(%r4)
120 	.long	0xb9294022		# kma %r2,%r4,%r2
121 
122 	tmhl	%r2,0x0010		# check for message-security-assist-9
123 	jz	.Lret
124 
125 	lghi	%r0,S390X_QUERY		# query kdsa capability vector
126 	la	%r1,S390X_KDSA(%r4)
127 	.long	0xb93a0002		# kdsa %r0,%r2
128 
129 .Lret:
130 	br	%r14
131 .size	OPENSSL_s390x_functions,.-OPENSSL_s390x_functions
132 
133 .globl	OPENSSL_rdtsc
134 .type	OPENSSL_rdtsc,@function
135 .align	16
136 OPENSSL_rdtsc:
137 	larl	%r4,OPENSSL_s390xcap_P
138 	tm	S390X_STFLE+3(%r4),0x40	# check for store-clock-fast facility
139 	jz	.Lstck
140 
141 	.long	0xb27cf010	# stckf 16(%r15)
142 	lg	%r2,16(%r15)
143 	br	%r14
144 .Lstck:
145 	stck	16(%r15)
146 	lg	%r2,16(%r15)
147 	br	%r14
148 .size	OPENSSL_rdtsc,.-OPENSSL_rdtsc
149 
150 .globl	OPENSSL_atomic_add
151 .type	OPENSSL_atomic_add,@function
152 .align	16
153 OPENSSL_atomic_add:
154 	l	%r1,0(%r2)
155 .Lspin:	lr	%r0,%r1
156 	ar	%r0,%r3
157 	cs	%r1,%r0,0(%r2)
158 	brc	4,.Lspin
159 	lgfr	%r2,%r0		# OpenSSL expects the new value
160 	br	%r14
161 .size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
162 
163 .globl	OPENSSL_wipe_cpu
164 .type	OPENSSL_wipe_cpu,@function
165 .align	16
166 OPENSSL_wipe_cpu:
167 	xgr	%r0,%r0
168 	xgr	%r1,%r1
169 	lgr	%r2,%r15
170 	xgr	%r3,%r3
171 	xgr	%r4,%r4
172 	lzdr	%f0
173 	lzdr	%f1
174 	lzdr	%f2
175 	lzdr	%f3
176 	lzdr	%f4
177 	lzdr	%f5
178 	lzdr	%f6
179 	lzdr	%f7
180 	br	%r14
181 .size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
182 
183 .globl	OPENSSL_cleanse
184 .type	OPENSSL_cleanse,@function
185 .align	16
186 OPENSSL_cleanse:
187 #if !defined(__s390x__) && !defined(__s390x)
188 	llgfr	%r3,%r3
189 #endif
190 	lghi	%r4,15
191 	lghi	%r0,0
192 	clgr	%r3,%r4
193 	jh	.Lot
194 	clgr	%r3,%r0
195 	bcr	8,%r14
196 .Little:
197 	stc	%r0,0(%r2)
198 	la	%r2,1(%r2)
199 	brctg	%r3,.Little
200 	br	%r14
201 .align	4
202 .Lot:	tmll	%r2,7
203 	jz	.Laligned
204 	stc	%r0,0(%r2)
205 	la	%r2,1(%r2)
206 	brctg	%r3,.Lot
207 .Laligned:
208 	srlg	%r4,%r3,3
209 .Loop:	stg	%r0,0(%r2)
210 	la	%r2,8(%r2)
211 	brctg	%r4,.Loop
212 	lghi	%r4,7
213 	ngr	%r3,%r4
214 	jnz	.Little
215 	br	%r14
216 .size	OPENSSL_cleanse,.-OPENSSL_cleanse
217 
218 .globl	CRYPTO_memcmp
219 .type	CRYPTO_memcmp,@function
220 .align	16
221 CRYPTO_memcmp:
222 #if !defined(__s390x__) && !defined(__s390x)
223 	llgfr	%r4,%r4
224 #endif
225 	lghi	%r5,0
226 	clgr	%r4,%r5
227 	je	.Lno_data
228 
229 .Loop_cmp:
230 	llgc	%r0,0(%r2)
231 	la	%r2,1(%r2)
232 	llgc	%r1,0(%r3)
233 	la	%r3,1(%r3)
234 	xr	%r1,%r0
235 	or	%r5,%r1
236 	brctg	%r4,.Loop_cmp
237 
238 	lnr	%r5,%r5
239 	srl	%r5,31
240 .Lno_data:
241 	lgr	%r2,%r5
242 	br	%r14
243 .size	CRYPTO_memcmp,.-CRYPTO_memcmp
244 
245 .globl	OPENSSL_instrument_bus
246 .type	OPENSSL_instrument_bus,@function
247 .align	16
248 OPENSSL_instrument_bus:
249 	lghi	%r2,0
250 	br	%r14
251 .size	OPENSSL_instrument_bus,.-OPENSSL_instrument_bus
252 
253 .globl	OPENSSL_instrument_bus2
254 .type	OPENSSL_instrument_bus2,@function
255 .align	16
256 OPENSSL_instrument_bus2:
257 	lghi	%r2,0
258 	br	%r14
259 .size	OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
260 
261 .globl	OPENSSL_vx_probe
262 .type	OPENSSL_vx_probe,@function
263 .align	16
264 OPENSSL_vx_probe:
265 	.word	0xe700,0x0000,0x0044	# vzero %v0
266 	br	%r14
267 .size	OPENSSL_vx_probe,.-OPENSSL_vx_probe
268 .globl	s390x_kimd
269 .type	s390x_kimd,@function
270 .align	16
271 s390x_kimd:
272 	llgfr	%r0,%r4
273 	lgr	%r1,%r5
274 
275 	.long	0xb93e0002	# kimd %r0,%r2
276 	brc	1,.-4		# pay attention to "partial completion"
277 
278 	br	%r14
279 .size	s390x_kimd,.-s390x_kimd
280 .globl	s390x_klmd
281 .type	s390x_klmd,@function
282 .align	32
283 s390x_klmd:
284 	llgfr	%r0,%r6
285 	lg	%r1,160(%r15)
286 
287 	.long	0xb93f0042	# klmd %r4,%r2
288 	brc	1,.-4		# pay attention to "partial completion"
289 
290 	br	%r14
291 .size	s390x_klmd,.-s390x_klmd
292 .globl	s390x_km
293 .type	s390x_km,@function
294 .align	16
295 s390x_km:
296 	lr	%r0,%r5
297 	lgr	%r1,%r6
298 
299 	.long	0xb92e0042	# km %r4,%r2
300 	brc	1,.-4		# pay attention to "partial completion"
301 
302 	br	%r14
303 .size	s390x_km,.-s390x_km
304 .globl	s390x_kmac
305 .type	s390x_kmac,@function
306 .align	16
307 s390x_kmac:
308 	lr	%r0,%r4
309 	lgr	%r1,%r5
310 
311 	.long	0xb91e0002	# kmac %r0,%r2
312 	brc	1,.-4		# pay attention to "partial completion"
313 
314 	br	%r14
315 .size	s390x_kmac,.-s390x_kmac
316 .globl	s390x_kmo
317 .type	s390x_kmo,@function
318 .align	16
319 s390x_kmo:
320 	lr	%r0,%r5
321 	lgr	%r1,%r6
322 
323 	.long	0xb92b0042	# kmo %r4,%r2
324 	brc	1,.-4		# pay attention to "partial completion"
325 
326 	br	%r14
327 .size	s390x_kmo,.-s390x_kmo
328 .globl	s390x_kmf
329 .type	s390x_kmf,@function
330 .align	16
331 s390x_kmf:
332 	lr	%r0,%r5
333 	lgr	%r1,%r6
334 
335 	.long	0xb92a0042	# kmf %r4,%r2
336 	brc	1,.-4		# pay attention to "partial completion"
337 
338 	br	%r14
339 .size	s390x_kmf,.-s390x_kmf
340 .globl	s390x_kma
341 .type	s390x_kma,@function
342 .align	16
343 s390x_kma:
344 	stg	%r6,6*8(%r15)
345 	lmg	%r0,%r1,160(%r15)
346 
347 	.long	0xb9292064	# kma %r6,%r2,%r4
348 	brc	1,.-4		# pay attention to "partial completion"
349 
350 	lg	%r6,6*8(%r15)
351 	br	%r14
352 .size	s390x_kma,.-s390x_kma
353 .globl	s390x_pcc
354 .type	s390x_pcc,@function
355 .align	16
356 s390x_pcc:
357 	lr	%r0,%r2
358 	lgr	%r1,%r3
359 	lhi	%r2,0
360 
361 	.long	0xb92c0000	# pcc
362 	brc	1,.-4		# pay attention to "partial completion"
363 	brc	7,.Lpcc_err	# if CC==0 return 0, else return 1
364 .Lpcc_out:
365 	br	%r14
366 .Lpcc_err:
367 	lhi	%r2,1
368 	j	.Lpcc_out
369 .size	s390x_pcc,.-s390x_pcc
370 .globl	s390x_kdsa
371 .type	s390x_kdsa,@function
372 .align	16
373 s390x_kdsa:
374 	lr	%r0,%r2
375 	lgr	%r1,%r3
376 	lhi	%r2,0
377 
378 	.long	0xb93a0004	# kdsa %r0,%r4
379 	brc	1,.-4		# pay attention to "partial completion"
380 	brc	7,.Lkdsa_err	# if CC==0 return 0, else return 1
381 .Lkdsa_out:
382 	br	%r14
383 .Lkdsa_err:
384 	lhi	%r2,1
385 	j	.Lkdsa_out
386 .size	s390x_kdsa,.-s390x_kdsa
387 .globl	s390x_flip_endian32
388 .type	s390x_flip_endian32,@function
389 .align	16
390 s390x_flip_endian32:
391 	lrvg	%r0,0(%r3)
392 	lrvg	%r1,8(%r3)
393 	lrvg	%r4,16(%r3)
394 	lrvg	%r5,24(%r3)
395 	stg	%r0,24(%r2)
396 	stg	%r1,16(%r2)
397 	stg	%r4,8(%r2)
398 	stg	%r5,0(%r2)
399 	br	%r14
400 .size	s390x_flip_endian32,.-s390x_flip_endian32
401 .globl	s390x_flip_endian64
402 .type	s390x_flip_endian64,@function
403 .align	16
404 s390x_flip_endian64:
405 	stmg	%r6,%r9,6*8(%r15)
406 
407 	lrvg	%r0,0(%r3)
408 	lrvg	%r1,8(%r3)
409 	lrvg	%r4,16(%r3)
410 	lrvg	%r5,24(%r3)
411 	lrvg	%r6,32(%r3)
412 	lrvg	%r7,40(%r3)
413 	lrvg	%r8,48(%r3)
414 	lrvg	%r9,56(%r3)
415 	stg	%r0,56(%r2)
416 	stg	%r1,48(%r2)
417 	stg	%r4,40(%r2)
418 	stg	%r5,32(%r2)
419 	stg	%r6,24(%r2)
420 	stg	%r7,16(%r2)
421 	stg	%r8,8(%r2)
422 	stg	%r9,0(%r2)
423 
424 	lmg	%r6,%r9,6*8(%r15)
425 	br	%r14
426 .size	s390x_flip_endian64,.-s390x_flip_endian64
427 .section	.init
428 	brasl	%r14,OPENSSL_cpuid_setup
429