aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/openssl/asm/windows/crypto/x86_64cpuid.masm
blob: 3ee7ea3ff0e088f45f3f870b77af06e7bfc6ce22 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
OPTION	DOTNAME
EXTERN	OPENSSL_cpuid_setup:NEAR

.CRT$XCU	SEGMENT READONLY ALIGN(8)
		DQ	OPENSSL_cpuid_setup


.CRT$XCU	ENDS
_DATA	SEGMENT
COMM	OPENSSL_ia32cap_P:DWORD:4

_DATA	ENDS
.text$	SEGMENT ALIGN(256) 'CODE'

PUBLIC	OPENSSL_atomic_add

ALIGN	16
OPENSSL_atomic_add	PROC PUBLIC

	mov	eax,DWORD PTR[rcx]
$L$spin::	lea	r8,QWORD PTR[rax*1+rdx]
DB	0f0h
	cmpxchg	DWORD PTR[rcx],r8d
	jne	$L$spin
	mov	eax,r8d
DB	048h,098h
	DB	0F3h,0C3h		;repret

OPENSSL_atomic_add	ENDP

PUBLIC	OPENSSL_rdtsc

ALIGN	16
OPENSSL_rdtsc	PROC PUBLIC

	rdtsc
	shl	rdx,32
	or	rax,rdx
	DB	0F3h,0C3h		;repret

OPENSSL_rdtsc	ENDP

PUBLIC	OPENSSL_ia32_cpuid

ALIGN	16
OPENSSL_ia32_cpuid	PROC PUBLIC
	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
	mov	QWORD PTR[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_OPENSSL_ia32_cpuid::
	mov	rdi,rcx



	mov	r8,rbx


	xor	eax,eax
	mov	QWORD PTR[8+rdi],rax
	cpuid
	mov	r11d,eax

	xor	eax,eax
	cmp	ebx,0756e6547h
	setne	al
	mov	r9d,eax
	cmp	edx,049656e69h
	setne	al
	or	r9d,eax
	cmp	ecx,06c65746eh
	setne	al
	or	r9d,eax
	jz	$L$intel

	cmp	ebx,068747541h
	setne	al
	mov	r10d,eax
	cmp	edx,069746E65h
	setne	al
	or	r10d,eax
	cmp	ecx,0444D4163h
	setne	al
	or	r10d,eax
	jnz	$L$intel


	mov	eax,080000000h
	cpuid
	cmp	eax,080000001h
	jb	$L$intel
	mov	r10d,eax
	mov	eax,080000001h
	cpuid
	or	r9d,ecx
	and	r9d,000000801h

	cmp	r10d,080000008h
	jb	$L$intel

	mov	eax,080000008h
	cpuid
	movzx	r10,cl
	inc	r10

	mov	eax,1
	cpuid
	bt	edx,28
	jnc	$L$generic
	shr	ebx,16
	cmp	bl,r10b
	ja	$L$generic
	and	edx,0efffffffh
	jmp	$L$generic

$L$intel::
	cmp	r11d,4
	mov	r10d,-1
	jb	$L$nocacheinfo

	mov	eax,4
	mov	ecx,0
	cpuid
	mov	r10d,eax
	shr	r10d,14
	and	r10d,0fffh

$L$nocacheinfo::
	mov	eax,1
	cpuid
	movd	xmm0,eax
	and	edx,0bfefffffh
	cmp	r9d,0
	jne	$L$notintel
	or	edx,040000000h
	and	ah,15
	cmp	ah,15
	jne	$L$notP4
	or	edx,000100000h
$L$notP4::
	cmp	ah,6
	jne	$L$notintel
	and	eax,00fff0ff0h
	cmp	eax,000050670h
	je	$L$knights
	cmp	eax,000080650h
	jne	$L$notintel
$L$knights::
	and	ecx,0fbffffffh

$L$notintel::
	bt	edx,28
	jnc	$L$generic
	and	edx,0efffffffh
	cmp	r10d,0
	je	$L$generic

	or	edx,010000000h
	shr	ebx,16
	cmp	bl,1
	ja	$L$generic
	and	edx,0efffffffh
$L$generic::
	and	r9d,000000800h
	and	ecx,0fffff7ffh
	or	r9d,ecx

	mov	r10d,edx

	cmp	r11d,7
	jb	$L$no_extended_info
	mov	eax,7
	xor	ecx,ecx
	cpuid
	bt	r9d,26
	jc	$L$notknights
	and	ebx,0fff7ffffh
$L$notknights::
	movd	eax,xmm0
	and	eax,00fff0ff0h
	cmp	eax,000050650h
	jne	$L$notskylakex
	and	ebx,0fffeffffh

$L$notskylakex::
	mov	DWORD PTR[8+rdi],ebx
	mov	DWORD PTR[12+rdi],ecx
$L$no_extended_info::

	bt	r9d,27
	jnc	$L$clear_avx
	xor	ecx,ecx
DB	00fh,001h,0d0h
	and	eax,0e6h
	cmp	eax,0e6h
	je	$L$done
	and	DWORD PTR[8+rdi],03fdeffffh




	and	eax,6
	cmp	eax,6
	je	$L$done
$L$clear_avx::
	mov	eax,0efffe7ffh
	and	r9d,eax
	mov	eax,03fdeffdfh
	and	DWORD PTR[8+rdi],eax
$L$done::
	shl	r9,32
	mov	eax,r10d
	mov	rbx,r8

	or	rax,r9
	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
	mov	rsi,QWORD PTR[16+rsp]
	DB	0F3h,0C3h		;repret

$L$SEH_end_OPENSSL_ia32_cpuid::
OPENSSL_ia32_cpuid	ENDP

PUBLIC	OPENSSL_cleanse

ALIGN	16
OPENSSL_cleanse	PROC PUBLIC

	xor	rax,rax
	cmp	rdx,15
	jae	$L$ot
	cmp	rdx,0
	je	$L$ret
$L$ittle::
	mov	BYTE PTR[rcx],al
	sub	rdx,1
	lea	rcx,QWORD PTR[1+rcx]
	jnz	$L$ittle
$L$ret::
	DB	0F3h,0C3h		;repret
ALIGN	16
$L$ot::
	test	rcx,7
	jz	$L$aligned
	mov	BYTE PTR[rcx],al
	lea	rdx,QWORD PTR[((-1))+rdx]
	lea	rcx,QWORD PTR[1+rcx]
	jmp	$L$ot
$L$aligned::
	mov	QWORD PTR[rcx],rax
	lea	rdx,QWORD PTR[((-8))+rdx]
	test	rdx,-8
	lea	rcx,QWORD PTR[8+rcx]
	jnz	$L$aligned
	cmp	rdx,0
	jne	$L$ittle
	DB	0F3h,0C3h		;repret

OPENSSL_cleanse	ENDP

PUBLIC	CRYPTO_memcmp

ALIGN	16
CRYPTO_memcmp	PROC PUBLIC

	xor	rax,rax
	xor	r10,r10
	cmp	r8,0
	je	$L$no_data
	cmp	r8,16
	jne	$L$oop_cmp
	mov	r10,QWORD PTR[rcx]
	mov	r11,QWORD PTR[8+rcx]
	mov	r8,1
	xor	r10,QWORD PTR[rdx]
	xor	r11,QWORD PTR[8+rdx]
	or	r10,r11
	cmovnz	rax,r8
	DB	0F3h,0C3h		;repret

ALIGN	16
$L$oop_cmp::
	mov	r10b,BYTE PTR[rcx]
	lea	rcx,QWORD PTR[1+rcx]
	xor	r10b,BYTE PTR[rdx]
	lea	rdx,QWORD PTR[1+rdx]
	or	al,r10b
	dec	r8
	jnz	$L$oop_cmp
	neg	rax
	shr	rax,63
$L$no_data::
	DB	0F3h,0C3h		;repret

CRYPTO_memcmp	ENDP
PUBLIC	OPENSSL_wipe_cpu

ALIGN	16
OPENSSL_wipe_cpu	PROC PUBLIC
	pxor	xmm0,xmm0
	pxor	xmm1,xmm1
	pxor	xmm2,xmm2
	pxor	xmm3,xmm3
	pxor	xmm4,xmm4
	pxor	xmm5,xmm5
	xor	rcx,rcx
	xor	rdx,rdx
	xor	r8,r8
	xor	r9,r9
	xor	r10,r10
	xor	r11,r11
	lea	rax,QWORD PTR[8+rsp]
	DB	0F3h,0C3h		;repret
OPENSSL_wipe_cpu	ENDP
PUBLIC	OPENSSL_instrument_bus

ALIGN	16
OPENSSL_instrument_bus	PROC PUBLIC

	mov	r10,rcx
	mov	rcx,rdx
	mov	r11,rdx

	rdtsc
	mov	r8d,eax
	mov	r9d,0
	clflush	[r10]
DB	0f0h
	add	DWORD PTR[r10],r9d
	jmp	$L$oop
ALIGN	16
$L$oop::	rdtsc
	mov	edx,eax
	sub	eax,r8d
	mov	r8d,edx
	mov	r9d,eax
	clflush	[r10]
DB	0f0h
	add	DWORD PTR[r10],eax
	lea	r10,QWORD PTR[4+r10]
	sub	rcx,1
	jnz	$L$oop

	mov	rax,r11
	DB	0F3h,0C3h		;repret

OPENSSL_instrument_bus	ENDP

PUBLIC	OPENSSL_instrument_bus2

ALIGN	16
OPENSSL_instrument_bus2	PROC PUBLIC

	mov	r10,rcx
	mov	rcx,rdx
	mov	r11,r8
	mov	QWORD PTR[8+rsp],rcx

	rdtsc
	mov	r8d,eax
	mov	r9d,0

	clflush	[r10]
DB	0f0h
	add	DWORD PTR[r10],r9d

	rdtsc
	mov	edx,eax
	sub	eax,r8d
	mov	r8d,edx
	mov	r9d,eax
$L$oop2::
	clflush	[r10]
DB	0f0h
	add	DWORD PTR[r10],eax

	sub	r11,1
	jz	$L$done2

	rdtsc
	mov	edx,eax
	sub	eax,r8d
	mov	r8d,edx
	cmp	eax,r9d
	mov	r9d,eax
	mov	edx,0
	setne	dl
	sub	rcx,rdx
	lea	r10,QWORD PTR[rdx*4+r10]
	jnz	$L$oop2

$L$done2::
	mov	rax,QWORD PTR[8+rsp]
	sub	rax,rcx
	DB	0F3h,0C3h		;repret

OPENSSL_instrument_bus2	ENDP
PUBLIC	OPENSSL_ia32_rdrand_bytes

ALIGN	16
OPENSSL_ia32_rdrand_bytes	PROC PUBLIC

	xor	rax,rax
	cmp	rdx,0
	je	$L$done_rdrand_bytes

	mov	r11,8
$L$oop_rdrand_bytes::
DB	73,15,199,242
	jc	$L$break_rdrand_bytes
	dec	r11
	jnz	$L$oop_rdrand_bytes
	jmp	$L$done_rdrand_bytes

ALIGN	16
$L$break_rdrand_bytes::
	cmp	rdx,8
	jb	$L$tail_rdrand_bytes
	mov	QWORD PTR[rcx],r10
	lea	rcx,QWORD PTR[8+rcx]
	add	rax,8
	sub	rdx,8
	jz	$L$done_rdrand_bytes
	mov	r11,8
	jmp	$L$oop_rdrand_bytes

ALIGN	16
$L$tail_rdrand_bytes::
	mov	BYTE PTR[rcx],r10b
	lea	rcx,QWORD PTR[1+rcx]
	inc	rax
	shr	r10,8
	dec	rdx
	jnz	$L$tail_rdrand_bytes

$L$done_rdrand_bytes::
	xor	r10,r10
	DB	0F3h,0C3h		;repret

OPENSSL_ia32_rdrand_bytes	ENDP
PUBLIC	OPENSSL_ia32_rdseed_bytes

ALIGN	16
OPENSSL_ia32_rdseed_bytes	PROC PUBLIC

	xor	rax,rax
	cmp	rdx,0
	je	$L$done_rdseed_bytes

	mov	r11,8
$L$oop_rdseed_bytes::
DB	73,15,199,250
	jc	$L$break_rdseed_bytes
	dec	r11
	jnz	$L$oop_rdseed_bytes
	jmp	$L$done_rdseed_bytes

ALIGN	16
$L$break_rdseed_bytes::
	cmp	rdx,8
	jb	$L$tail_rdseed_bytes
	mov	QWORD PTR[rcx],r10
	lea	rcx,QWORD PTR[8+rcx]
	add	rax,8
	sub	rdx,8
	jz	$L$done_rdseed_bytes
	mov	r11,8
	jmp	$L$oop_rdseed_bytes

ALIGN	16
$L$tail_rdseed_bytes::
	mov	BYTE PTR[rcx],r10b
	lea	rcx,QWORD PTR[1+rcx]
	inc	rax
	shr	r10,8
	dec	rdx
	jnz	$L$tail_rdseed_bytes

$L$done_rdseed_bytes::
	xor	r10,r10
	DB	0F3h,0C3h		;repret

OPENSSL_ia32_rdseed_bytes	ENDP

.text$	ENDS
END