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	larl	%r4,OPENSSL_s390xcap_P
9	stg	%r0,8(%r4)	# wipe capability vectors
10	stg	%r0,16(%r4)
11	stg	%r0,24(%r4)
12	stg	%r0,32(%r4)
13	stg	%r0,40(%r4)
14	stg	%r0,48(%r4)
15	stg	%r0,56(%r4)
16	stg	%r0,64(%r4)
17	stg	%r0,72(%r4)
18
19	.long	0xb2b04000	# stfle	0(%r4)
20	brc	8,.Ldone
21	lghi	%r0,1
22	.long	0xb2b04000	# stfle 0(%r4)
23.Ldone:
24	lmg	%r2,%r3,0(%r4)
25	tmhl	%r2,0x4000	# check for message-security-assist
26	jz	.Lret
27
28	lghi	%r0,0		# query kimd capabilities
29	la	%r1,16(%r4)
30	.long	0xb93e0002	# kimd %r0,%r2
31
32	lghi	%r0,0		# query km capability vector
33	la	%r1,32(%r4)
34	.long	0xb92e0042	# km %r4,%r2
35
36	lghi	%r0,0		# query kmc capability vector
37	la	%r1,48(%r4)
38	.long	0xb92f0042	# kmc %r4,%r2
39
40	tmhh	%r3,0x0004	# check for message-security-assist-4
41	jz	.Lret
42
43	lghi	%r0,0		# query kmctr capability vector
44	la	%r1,64(%r4)
45	.long	0xb92d2042	# kmctr %r4,%r2,%r2
46
47.Lret:
48	br	%r14
49.size	OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities
50
51.globl	OPENSSL_rdtsc
52.type	OPENSSL_rdtsc,@function
53.align	16
54OPENSSL_rdtsc:
55	stck	16(%r15)
56	lg	%r2,16(%r15)
57	br	%r14
58.size	OPENSSL_rdtsc,.-OPENSSL_rdtsc
59
60.globl	OPENSSL_atomic_add
61.type	OPENSSL_atomic_add,@function
62.align	16
63OPENSSL_atomic_add:
64	l	%r1,0(%r2)
65.Lspin:	lr	%r0,%r1
66	ar	%r0,%r3
67	cs	%r1,%r0,0(%r2)
68	brc	4,.Lspin
69	lgfr	%r2,%r0		# OpenSSL expects the new value
70	br	%r14
71.size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
72
73.globl	OPENSSL_wipe_cpu
74.type	OPENSSL_wipe_cpu,@function
75.align	16
76OPENSSL_wipe_cpu:
77	xgr	%r0,%r0
78	xgr	%r1,%r1
79	lgr	%r2,%r15
80	xgr	%r3,%r3
81	xgr	%r4,%r4
82	lzdr	%f0
83	lzdr	%f1
84	lzdr	%f2
85	lzdr	%f3
86	lzdr	%f4
87	lzdr	%f5
88	lzdr	%f6
89	lzdr	%f7
90	br	%r14
91.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
92
93.globl	OPENSSL_cleanse
94.type	OPENSSL_cleanse,@function
95.align	16
96OPENSSL_cleanse:
97#if !defined(__s390x__) && !defined(__s390x)
98	llgfr	%r3,%r3
99#endif
100	lghi	%r4,15
101	lghi	%r0,0
102	clgr	%r3,%r4
103	jh	.Lot
104	clgr	%r3,%r0
105	bcr	8,%r14
106.Little:
107	stc	%r0,0(%r2)
108	la	%r2,1(%r2)
109	brctg	%r3,.Little
110	br	%r14
111.align	4
112.Lot:	tmll	%r2,7
113	jz	.Laligned
114	stc	%r0,0(%r2)
115	la	%r2,1(%r2)
116	brctg	%r3,.Lot
117.Laligned:
118	srlg	%r4,%r3,3
119.Loop:	stg	%r0,0(%r2)
120	la	%r2,8(%r2)
121	brctg	%r4,.Loop
122	lghi	%r4,7
123	ngr	%r3,%r4
124	jnz	.Little
125	br	%r14
126.size	OPENSSL_cleanse,.-OPENSSL_cleanse
127
128.section	.init
129	brasl	%r14,OPENSSL_cpuid_setup
130
131.comm	OPENSSL_s390xcap_P,80,8
132