1.text
2
3.globl	OPENSSL_s390x_facilities
4.type	OPENSSL_s390x_facilities,@function
5.align	16
6OPENSSL_s390x_facilities:
7	lghi	%r0,0
8	.long	0xb2b0f010	# stfle	16(%r15)
9	lg	%r2,16(%r15)
10	larl	%r1,OPENSSL_s390xcap_P
11	stg	%r2,0(%r1)
12	br	%r14
13.size	OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities
14
15.globl	OPENSSL_rdtsc
16.type	OPENSSL_rdtsc,@function
17.align	16
18OPENSSL_rdtsc:
19	stck	16(%r15)
20	lg	%r2,16(%r15)
21	br	%r14
22.size	OPENSSL_rdtsc,.-OPENSSL_rdtsc
23
24.globl	OPENSSL_atomic_add
25.type	OPENSSL_atomic_add,@function
26.align	16
27OPENSSL_atomic_add:
28	l	%r1,0(%r2)
29.Lspin:	lr	%r0,%r1
30	ar	%r0,%r3
31	cs	%r1,%r0,0(%r2)
32	brc	4,.Lspin
33	lgfr	%r2,%r0		# OpenSSL expects the new value
34	br	%r14
35.size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
36
37.globl	OPENSSL_wipe_cpu
38.type	OPENSSL_wipe_cpu,@function
39.align	16
40OPENSSL_wipe_cpu:
41	xgr	%r0,%r0
42	xgr	%r1,%r1
43	lgr	%r2,%r15
44	xgr	%r3,%r3
45	xgr	%r4,%r4
46	lzdr	%f0
47	lzdr	%f1
48	lzdr	%f2
49	lzdr	%f3
50	lzdr	%f4
51	lzdr	%f5
52	lzdr	%f6
53	lzdr	%f7
54	br	%r14
55.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
56
57.globl	OPENSSL_cleanse
58.type	OPENSSL_cleanse,@function
59.align	16
60OPENSSL_cleanse:
61	lghi	%r4,15
62	lghi	%r0,0
63	clgr	%r3,%r4
64	jh	.Lot
65	clgr	%r3,%r0
66	bcr	8,%r14
67.Little:
68	stc	%r0,0(%r2)
69	la	%r2,1(%r2)
70	brctg	%r3,.Little
71	br	%r14
72.align	4
73.Lot:	tmll	%r2,7
74	jz	.Laligned
75	stc	%r0,0(%r2)
76	la	%r2,1(%r2)
77	brctg	%r3,.Lot
78.Laligned:
79	srlg	%r4,%r3,3
80.Loop:	stg	%r0,0(%r2)
81	la	%r2,8(%r2)
82	brctg	%r4,.Loop
83	lghi	%r4,7
84	ngr	%r3,%r4
85	jnz	.Little
86	br	%r14
87.size	OPENSSL_cleanse,.-OPENSSL_cleanse
88
89.section	.init
90	brasl	%r14,OPENSSL_cpuid_setup
91
92.comm	OPENSSL_s390xcap_P,8,8
93