1238384Sjkim.text
2238384Sjkim
3238384Sjkim.globl	OPENSSL_s390x_facilities
4238384Sjkim.type	OPENSSL_s390x_facilities,@function
5238384Sjkim.align	16
6238384SjkimOPENSSL_s390x_facilities:
7238384Sjkim	lghi	%r0,0
8298998Sjkim	larl	%r4,OPENSSL_s390xcap_P
9298998Sjkim	stg	%r0,8(%r4)	# wipe capability vectors
10298998Sjkim	stg	%r0,16(%r4)
11298998Sjkim	stg	%r0,24(%r4)
12298998Sjkim	stg	%r0,32(%r4)
13298998Sjkim	stg	%r0,40(%r4)
14298998Sjkim	stg	%r0,48(%r4)
15298998Sjkim	stg	%r0,56(%r4)
16298998Sjkim	stg	%r0,64(%r4)
17298998Sjkim	stg	%r0,72(%r4)
18298998Sjkim
19298998Sjkim	.long	0xb2b04000	# stfle	0(%r4)
20238384Sjkim	brc	8,.Ldone
21238384Sjkim	lghi	%r0,1
22298998Sjkim	.long	0xb2b04000	# stfle 0(%r4)
23238384Sjkim.Ldone:
24298998Sjkim	lmg	%r2,%r3,0(%r4)
25298998Sjkim	tmhl	%r2,0x4000	# check for message-security-assist
26298998Sjkim	jz	.Lret
27298998Sjkim
28298998Sjkim	lghi	%r0,0		# query kimd capabilities
29298998Sjkim	la	%r1,16(%r4)
30298998Sjkim	.long	0xb93e0002	# kimd %r0,%r2
31298998Sjkim
32298998Sjkim	lghi	%r0,0		# query km capability vector
33298998Sjkim	la	%r1,32(%r4)
34298998Sjkim	.long	0xb92e0042	# km %r4,%r2
35298998Sjkim
36298998Sjkim	lghi	%r0,0		# query kmc capability vector
37298998Sjkim	la	%r1,48(%r4)
38298998Sjkim	.long	0xb92f0042	# kmc %r4,%r2
39298998Sjkim
40298998Sjkim	tmhh	%r3,0x0004	# check for message-security-assist-4
41298998Sjkim	jz	.Lret
42298998Sjkim
43298998Sjkim	lghi	%r0,0		# query kmctr capability vector
44298998Sjkim	la	%r1,64(%r4)
45298998Sjkim	.long	0xb92d2042	# kmctr %r4,%r2,%r2
46298998Sjkim
47298998Sjkim.Lret:
48238384Sjkim	br	%r14
49238384Sjkim.size	OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities
50238384Sjkim
51238384Sjkim.globl	OPENSSL_rdtsc
52238384Sjkim.type	OPENSSL_rdtsc,@function
53238384Sjkim.align	16
54238384SjkimOPENSSL_rdtsc:
55238384Sjkim	stck	16(%r15)
56238384Sjkim	lg	%r2,16(%r15)
57238384Sjkim	br	%r14
58238384Sjkim.size	OPENSSL_rdtsc,.-OPENSSL_rdtsc
59238384Sjkim
60238384Sjkim.globl	OPENSSL_atomic_add
61238384Sjkim.type	OPENSSL_atomic_add,@function
62238384Sjkim.align	16
63238384SjkimOPENSSL_atomic_add:
64238384Sjkim	l	%r1,0(%r2)
65238384Sjkim.Lspin:	lr	%r0,%r1
66238384Sjkim	ar	%r0,%r3
67238384Sjkim	cs	%r1,%r0,0(%r2)
68238384Sjkim	brc	4,.Lspin
69238384Sjkim	lgfr	%r2,%r0		# OpenSSL expects the new value
70238384Sjkim	br	%r14
71238384Sjkim.size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
72238384Sjkim
73238384Sjkim.globl	OPENSSL_wipe_cpu
74238384Sjkim.type	OPENSSL_wipe_cpu,@function
75238384Sjkim.align	16
76238384SjkimOPENSSL_wipe_cpu:
77238384Sjkim	xgr	%r0,%r0
78238384Sjkim	xgr	%r1,%r1
79238384Sjkim	lgr	%r2,%r15
80238384Sjkim	xgr	%r3,%r3
81238384Sjkim	xgr	%r4,%r4
82238384Sjkim	lzdr	%f0
83238384Sjkim	lzdr	%f1
84238384Sjkim	lzdr	%f2
85238384Sjkim	lzdr	%f3
86238384Sjkim	lzdr	%f4
87238384Sjkim	lzdr	%f5
88238384Sjkim	lzdr	%f6
89238384Sjkim	lzdr	%f7
90238384Sjkim	br	%r14
91238384Sjkim.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
92238384Sjkim
93238384Sjkim.globl	OPENSSL_cleanse
94238384Sjkim.type	OPENSSL_cleanse,@function
95238384Sjkim.align	16
96238384SjkimOPENSSL_cleanse:
97238384Sjkim#if !defined(__s390x__) && !defined(__s390x)
98238384Sjkim	llgfr	%r3,%r3
99238384Sjkim#endif
100238384Sjkim	lghi	%r4,15
101238384Sjkim	lghi	%r0,0
102238384Sjkim	clgr	%r3,%r4
103238384Sjkim	jh	.Lot
104238384Sjkim	clgr	%r3,%r0
105238384Sjkim	bcr	8,%r14
106238384Sjkim.Little:
107238384Sjkim	stc	%r0,0(%r2)
108238384Sjkim	la	%r2,1(%r2)
109238384Sjkim	brctg	%r3,.Little
110238384Sjkim	br	%r14
111238384Sjkim.align	4
112238384Sjkim.Lot:	tmll	%r2,7
113238384Sjkim	jz	.Laligned
114238384Sjkim	stc	%r0,0(%r2)
115238384Sjkim	la	%r2,1(%r2)
116238384Sjkim	brctg	%r3,.Lot
117238384Sjkim.Laligned:
118238384Sjkim	srlg	%r4,%r3,3
119238384Sjkim.Loop:	stg	%r0,0(%r2)
120238384Sjkim	la	%r2,8(%r2)
121238384Sjkim	brctg	%r4,.Loop
122238384Sjkim	lghi	%r4,7
123238384Sjkim	ngr	%r3,%r4
124238384Sjkim	jnz	.Little
125238384Sjkim	br	%r14
126238384Sjkim.size	OPENSSL_cleanse,.-OPENSSL_cleanse
127238384Sjkim
128238384Sjkim.section	.init
129238384Sjkim	brasl	%r14,OPENSSL_cpuid_setup
130238384Sjkim
131298998Sjkim.comm	OPENSSL_s390xcap_P,80,8
132