Make DRBG uninstantiate() and instantiate() methods inverse to each other
[openssl.git] / crypto / s390xcpuid.S
1 .text
2 // Copyright 2009-2016 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 #include "s390x_arch.h"
10
11 .globl  OPENSSL_s390x_facilities
12 .type   OPENSSL_s390x_facilities,@function
13 .align  16
14 OPENSSL_s390x_facilities:
15         lghi    %r0,0
16         larl    %r4,OPENSSL_s390xcap_P
17
18         stg     %r0,S390X_STFLE+8(%r4)  # wipe capability vectors
19         stg     %r0,S390X_STFLE+16(%r4)
20         stg     %r0,S390X_STFLE+24(%r4)
21         stg     %r0,S390X_KIMD(%r4)
22         stg     %r0,S390X_KIMD+8(%r4)
23         stg     %r0,S390X_KLMD(%r4)
24         stg     %r0,S390X_KLMD+8(%r4)
25         stg     %r0,S390X_KM(%r4)
26         stg     %r0,S390X_KM+8(%r4)
27         stg     %r0,S390X_KMC(%r4)
28         stg     %r0,S390X_KMC+8(%r4)
29         stg     %r0,S390X_KMAC(%r4)
30         stg     %r0,S390X_KMAC+8(%r4)
31         stg     %r0,S390X_KMCTR(%r4)
32         stg     %r0,S390X_KMCTR+8(%r4)
33         stg     %r0,S390X_KMO(%r4)
34         stg     %r0,S390X_KMO+8(%r4)
35         stg     %r0,S390X_KMF(%r4)
36         stg     %r0,S390X_KMF+8(%r4)
37         stg     %r0,S390X_PRNO(%r4)
38         stg     %r0,S390X_PRNO+8(%r4)
39         stg     %r0,S390X_KMA(%r4)
40         stg     %r0,S390X_KMA+8(%r4)
41
42         .long   0xb2b04000              # stfle 0(%r4)
43         brc     8,.Ldone
44         lghi    %r0,1
45         .long   0xb2b04000              # stfle 0(%r4)
46         brc     8,.Ldone
47         lghi    %r0,2
48         .long   0xb2b04000              # stfle 0(%r4)
49 .Ldone:
50         lmg     %r2,%r3,S390X_STFLE(%r4)
51         tmhl    %r2,0x4000              # check for message-security-assist
52         jz      .Lret
53
54         lghi    %r0,S390X_QUERY         # query kimd capabilities
55         la      %r1,S390X_KIMD(%r4)
56         .long   0xb93e0002              # kimd %r0,%r2
57
58         lghi    %r0,S390X_QUERY         # query klmd capabilities
59         la      %r1,S390X_KLMD(%r4)
60         .long   0xb93f0002              # klmd %r0,%r2
61
62         lghi    %r0,S390X_QUERY         # query km capability vector
63         la      %r1,S390X_KM(%r4)
64         .long   0xb92e0042              # km %r4,%r2
65
66         lghi    %r0,S390X_QUERY         # query kmc capability vector
67         la      %r1,S390X_KMC(%r4)
68         .long   0xb92f0042              # kmc %r4,%r2
69
70         lghi    %r0,S390X_QUERY         # query kmac capability vector
71         la      %r1,S390X_KMAC(%r4)
72         .long   0xb91e0042              # kmac %r4,%r2
73
74         tmhh    %r3,0x0004              # check for message-security-assist-4
75         jz      .Lret
76
77         lghi    %r0,S390X_QUERY         # query kmctr capability vector
78         la      %r1,S390X_KMCTR(%r4)
79         .long   0xb92d2042              # kmctr %r4,%r2,%r2
80
81         lghi    %r0,S390X_QUERY         # query kmo capability vector
82         la      %r1,S390X_KMO(%r4)
83         .long   0xb92b0042              # kmo %r4,%r2
84
85         lghi    %r0,S390X_QUERY         # query kmf capability vector
86         la      %r1,S390X_KMF(%r4)
87         .long   0xb92a0042              # kmf %r4,%r2
88
89         tml     %r2,0x40                # check for message-security-assist-5
90         jz      .Lret
91
92         lghi    %r0,S390X_QUERY         # query prno capability vector
93         la      %r1,S390X_PRNO(%r4)
94         .long   0xb93c0042              # prno %r4,%r2
95
96         lg      %r2,S390X_STFLE+16(%r4)
97         tmhl    %r2,0x2000              # check for message-security-assist-8
98         jz      .Lret
99
100         lghi    %r0,S390X_QUERY         # query kma capability vector
101         la      %r1,S390X_KMA(%r4)
102         .long   0xb9294022              # kma %r2,%r4,%r2
103
104 .Lret:
105         br      %r14
106 .size   OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities
107
108 .globl  OPENSSL_rdtsc
109 .type   OPENSSL_rdtsc,@function
110 .align  16
111 OPENSSL_rdtsc:
112         stck    16(%r15)
113         lg      %r2,16(%r15)
114         br      %r14
115 .size   OPENSSL_rdtsc,.-OPENSSL_rdtsc
116
117 .globl  OPENSSL_atomic_add
118 .type   OPENSSL_atomic_add,@function
119 .align  16
120 OPENSSL_atomic_add:
121         l       %r1,0(%r2)
122 .Lspin: lr      %r0,%r1
123         ar      %r0,%r3
124         cs      %r1,%r0,0(%r2)
125         brc     4,.Lspin
126         lgfr    %r2,%r0         # OpenSSL expects the new value
127         br      %r14
128 .size   OPENSSL_atomic_add,.-OPENSSL_atomic_add
129
130 .globl  OPENSSL_wipe_cpu
131 .type   OPENSSL_wipe_cpu,@function
132 .align  16
133 OPENSSL_wipe_cpu:
134         xgr     %r0,%r0
135         xgr     %r1,%r1
136         lgr     %r2,%r15
137         xgr     %r3,%r3
138         xgr     %r4,%r4
139         lzdr    %f0
140         lzdr    %f1
141         lzdr    %f2
142         lzdr    %f3
143         lzdr    %f4
144         lzdr    %f5
145         lzdr    %f6
146         lzdr    %f7
147         br      %r14
148 .size   OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
149
150 .globl  OPENSSL_cleanse
151 .type   OPENSSL_cleanse,@function
152 .align  16
153 OPENSSL_cleanse:
154 #if !defined(__s390x__) && !defined(__s390x)
155         llgfr   %r3,%r3
156 #endif
157         lghi    %r4,15
158         lghi    %r0,0
159         clgr    %r3,%r4
160         jh      .Lot
161         clgr    %r3,%r0
162         bcr     8,%r14
163 .Little:
164         stc     %r0,0(%r2)
165         la      %r2,1(%r2)
166         brctg   %r3,.Little
167         br      %r14
168 .align  4
169 .Lot:   tmll    %r2,7
170         jz      .Laligned
171         stc     %r0,0(%r2)
172         la      %r2,1(%r2)
173         brctg   %r3,.Lot
174 .Laligned:
175         srlg    %r4,%r3,3
176 .Loop:  stg     %r0,0(%r2)
177         la      %r2,8(%r2)
178         brctg   %r4,.Loop
179         lghi    %r4,7
180         ngr     %r3,%r4
181         jnz     .Little
182         br      %r14
183 .size   OPENSSL_cleanse,.-OPENSSL_cleanse
184
185 .globl  CRYPTO_memcmp
186 .type   CRYPTO_memcmp,@function
187 .align  16
188 CRYPTO_memcmp:
189 #if !defined(__s390x__) && !defined(__s390x)
190         llgfr   %r4,%r4
191 #endif
192         lghi    %r5,0
193         clgr    %r4,%r5
194         je      .Lno_data
195
196 .Loop_cmp:
197         llgc    %r0,0(%r2)
198         la      %r2,1(%r2)
199         llgc    %r1,0(%r3)
200         la      %r3,1(%r3)
201         xr      %r1,%r0
202         or      %r5,%r1
203         brctg   %r4,.Loop_cmp
204
205         lnr     %r5,%r5
206         srl     %r5,31
207 .Lno_data:
208         lgr     %r2,%r5
209         br      %r14
210 .size   CRYPTO_memcmp,.-CRYPTO_memcmp
211
212 .globl  OPENSSL_instrument_bus
213 .type   OPENSSL_instrument_bus,@function
214 .align  16
215 OPENSSL_instrument_bus:
216         lghi    %r2,0
217         br      %r14
218 .size   OPENSSL_instrument_bus,.-OPENSSL_instrument_bus
219
220 .globl  OPENSSL_instrument_bus2
221 .type   OPENSSL_instrument_bus2,@function
222 .align  16
223 OPENSSL_instrument_bus2:
224         lghi    %r2,0
225         br      %r14
226 .size   OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
227
228 .globl  OPENSSL_vx_probe
229 .type   OPENSSL_vx_probe,@function
230 .align  16
231 OPENSSL_vx_probe:
232         .word   0xe700,0x0000,0x0044    # vzero %v0
233         br      %r14
234 .size   OPENSSL_vx_probe,.-OPENSSL_vx_probe
235
236 .section        .init
237         brasl   %r14,OPENSSL_cpuid_setup