summaryrefslogtreecommitdiffstats
path: root/CryptoPkg/Library/OpensslLib/X64Gcc/crypto/x86_64cpuid.S
blob: cac5f8f32c547e536949a39ab670c9bd0399e492 (plain)
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
485
486
487
488
489
490
491
# WARNING: do not edit!
# Generated from openssl/crypto/x86_64cpuid.pl
#
# Copyright 2005-2020 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the OpenSSL license (the "License").  You may not use
# this file except in compliance with the License.  You can obtain a copy
# in the file LICENSE in the source distribution or at
# https://www.openssl.org/source/license.html


.hidden OPENSSL_cpuid_setup
.section        .init
        call    OPENSSL_cpuid_setup

.hidden OPENSSL_ia32cap_P
.comm   OPENSSL_ia32cap_P,16,4

.text

.globl  OPENSSL_atomic_add
.type   OPENSSL_atomic_add,@function
.align  16
OPENSSL_atomic_add:
.cfi_startproc
        movl    (%rdi),%eax
.Lspin: leaq    (%rsi,%rax,1),%r8
.byte   0xf0
        cmpxchgl        %r8d,(%rdi)
        jne     .Lspin
        movl    %r8d,%eax
.byte   0x48,0x98
        .byte   0xf3,0xc3
.cfi_endproc
.size   OPENSSL_atomic_add,.-OPENSSL_atomic_add

.globl  OPENSSL_rdtsc
.type   OPENSSL_rdtsc,@function
.align  16
OPENSSL_rdtsc:
.cfi_startproc
        rdtsc
        shlq    $32,%rdx
        orq     %rdx,%rax
        .byte   0xf3,0xc3
.cfi_endproc
.size   OPENSSL_rdtsc,.-OPENSSL_rdtsc

.globl  OPENSSL_ia32_cpuid
.type   OPENSSL_ia32_cpuid,@function
.align  16
OPENSSL_ia32_cpuid:
.cfi_startproc
        movq    %rbx,%r8
.cfi_register   %rbx,%r8

        xorl    %eax,%eax
        movq    %rax,8(%rdi)
        cpuid
        movl    %eax,%r11d

        xorl    %eax,%eax
        cmpl    $0x756e6547,%ebx
        setne   %al
        movl    %eax,%r9d
        cmpl    $0x49656e69,%edx
        setne   %al
        orl     %eax,%r9d
        cmpl    $0x6c65746e,%ecx
        setne   %al
        orl     %eax,%r9d
        jz      .Lintel

        cmpl    $0x68747541,%ebx
        setne   %al
        movl    %eax,%r10d
        cmpl    $0x69746E65,%edx
        setne   %al
        orl     %eax,%r10d
        cmpl    $0x444D4163,%ecx
        setne   %al
        orl     %eax,%r10d
        jnz     .Lintel


        movl    $0x80000000,%eax
        cpuid
        cmpl    $0x80000001,%eax
        jb      .Lintel
        movl    %eax,%r10d
        movl    $0x80000001,%eax
        cpuid
        orl     %ecx,%r9d
        andl    $0x00000801,%r9d

        cmpl    $0x80000008,%r10d
        jb      .Lintel

        movl    $0x80000008,%eax
        cpuid
        movzbq  %cl,%r10
        incq    %r10

        movl    $1,%eax
        cpuid
        btl     $28,%edx
        jnc     .Lgeneric
        shrl    $16,%ebx
        cmpb    %r10b,%bl
        ja      .Lgeneric
        andl    $0xefffffff,%edx
        jmp     .Lgeneric

.Lintel:
        cmpl    $4,%r11d
        movl    $-1,%r10d
        jb      .Lnocacheinfo

        movl    $4,%eax
        movl    $0,%ecx
        cpuid
        movl    %eax,%r10d
        shrl    $14,%r10d
        andl    $0xfff,%r10d

.Lnocacheinfo:
        movl    $1,%eax
        cpuid
        movd    %eax,%xmm0
        andl    $0xbfefffff,%edx
        cmpl    $0,%r9d
        jne     .Lnotintel
        orl     $0x40000000,%edx
        andb    $15,%ah
        cmpb    $15,%ah
        jne     .LnotP4
        orl     $0x00100000,%edx
.LnotP4:
        cmpb    $6,%ah
        jne     .Lnotintel
        andl    $0x0fff0ff0,%eax
        cmpl    $0x00050670,%eax
        je      .Lknights
        cmpl    $0x00080650,%eax
        jne     .Lnotintel
.Lknights:
        andl    $0xfbffffff,%ecx

.Lnotintel:
        btl     $28,%edx
        jnc     .Lgeneric
        andl    $0xefffffff,%edx
        cmpl    $0,%r10d
        je      .Lgeneric

        orl     $0x10000000,%edx
        shrl    $16,%ebx
        cmpb    $1,%bl
        ja      .Lgeneric
        andl    $0xefffffff,%edx
.Lgeneric:
        andl    $0x00000800,%r9d
        andl    $0xfffff7ff,%ecx
        orl     %ecx,%r9d

        movl    %edx,%r10d

        cmpl    $7,%r11d
        jb      .Lno_extended_info
        movl    $7,%eax
        xorl    %ecx,%ecx
        cpuid
        btl     $26,%r9d
        jc      .Lnotknights
        andl    $0xfff7ffff,%ebx
.Lnotknights:
        movd    %xmm0,%eax
        andl    $0x0fff0ff0,%eax
        cmpl    $0x00050650,%eax
        jne     .Lnotskylakex
        andl    $0xfffeffff,%ebx

.Lnotskylakex:
        movl    %ebx,8(%rdi)
        movl    %ecx,12(%rdi)
.Lno_extended_info:

        btl     $27,%r9d
        jnc     .Lclear_avx
        xorl    %ecx,%ecx
.byte   0x0f,0x01,0xd0
        andl    $0xe6,%eax
        cmpl    $0xe6,%eax
        je      .Ldone
        andl    $0x3fdeffff,8(%rdi)




        andl    $6,%eax
        cmpl    $6,%eax
        je      .Ldone
.Lclear_avx:
        movl    $0xefffe7ff,%eax
        andl    %eax,%r9d
        movl    $0x3fdeffdf,%eax
        andl    %eax,8(%rdi)
.Ldone:
        shlq    $32,%r9
        movl    %r10d,%eax
        movq    %r8,%rbx
.cfi_restore    %rbx
        orq     %r9,%rax
        .byte   0xf3,0xc3
.cfi_endproc
.size   OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid

.globl  OPENSSL_cleanse
.type   OPENSSL_cleanse,@function
.align  16
OPENSSL_cleanse:
.cfi_startproc
        xorq    %rax,%rax
        cmpq    $15,%rsi
        jae     .Lot
        cmpq    $0,%rsi
        je      .Lret
.Little:
        movb    %al,(%rdi)
        subq    $1,%rsi
        leaq    1(%rdi),%rdi
        jnz     .Little
.Lret:
        .byte   0xf3,0xc3
.align  16
.Lot:
        testq   $7,%rdi
        jz      .Laligned
        movb    %al,(%rdi)
        leaq    -1(%rsi),%rsi
        leaq    1(%rdi),%rdi
        jmp     .Lot
.Laligned:
        movq    %rax,(%rdi)
        leaq    -8(%rsi),%rsi
        testq   $-8,%rsi
        leaq    8(%rdi),%rdi
        jnz     .Laligned
        cmpq    $0,%rsi
        jne     .Little
        .byte   0xf3,0xc3
.cfi_endproc
.size   OPENSSL_cleanse,.-OPENSSL_cleanse

.globl  CRYPTO_memcmp
.type   CRYPTO_memcmp,@function
.align  16
CRYPTO_memcmp:
.cfi_startproc
        xorq    %rax,%rax
        xorq    %r10,%r10
        cmpq    $0,%rdx
        je      .Lno_data
        cmpq    $16,%rdx
        jne     .Loop_cmp
        movq    (%rdi),%r10
        movq    8(%rdi),%r11
        movq    $1,%rdx
        xorq    (%rsi),%r10
        xorq    8(%rsi),%r11
        orq     %r11,%r10
        cmovnzq %rdx,%rax
        .byte   0xf3,0xc3

.align  16
.Loop_cmp:
        movb    (%rdi),%r10b
        leaq    1(%rdi),%rdi
        xorb    (%rsi),%r10b
        leaq    1(%rsi),%rsi
        orb     %r10b,%al
        decq    %rdx
        jnz     .Loop_cmp
        negq    %rax
        shrq    $63,%rax
.Lno_data:
        .byte   0xf3,0xc3
.cfi_endproc
.size   CRYPTO_memcmp,.-CRYPTO_memcmp
.globl  OPENSSL_wipe_cpu
.type   OPENSSL_wipe_cpu,@function
.align  16
OPENSSL_wipe_cpu:
.cfi_startproc
        pxor    %xmm0,%xmm0
        pxor    %xmm1,%xmm1
        pxor    %xmm2,%xmm2
        pxor    %xmm3,%xmm3
        pxor    %xmm4,%xmm4
        pxor    %xmm5,%xmm5
        pxor    %xmm6,%xmm6
        pxor    %xmm7,%xmm7
        pxor    %xmm8,%xmm8
        pxor    %xmm9,%xmm9
        pxor    %xmm10,%xmm10
        pxor    %xmm11,%xmm11
        pxor    %xmm12,%xmm12
        pxor    %xmm13,%xmm13
        pxor    %xmm14,%xmm14
        pxor    %xmm15,%xmm15
        xorq    %rcx,%rcx
        xorq    %rdx,%rdx
        xorq    %rsi,%rsi
        xorq    %rdi,%rdi
        xorq    %r8,%r8
        xorq    %r9,%r9
        xorq    %r10,%r10
        xorq    %r11,%r11
        leaq    8(%rsp),%rax
        .byte   0xf3,0xc3
.cfi_endproc
.size   OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
.globl  OPENSSL_instrument_bus
.type   OPENSSL_instrument_bus,@function
.align  16
OPENSSL_instrument_bus:
.cfi_startproc
        movq    %rdi,%r10
        movq    %rsi,%rcx
        movq    %rsi,%r11

        rdtsc
        movl    %eax,%r8d
        movl    $0,%r9d
        clflush (%r10)
.byte   0xf0
        addl    %r9d,(%r10)
        jmp     .Loop
.align  16
.Loop:  rdtsc
        movl    %eax,%edx
        subl    %r8d,%eax
        movl    %edx,%r8d
        movl    %eax,%r9d
        clflush (%r10)
.byte   0xf0
        addl    %eax,(%r10)
        leaq    4(%r10),%r10
        subq    $1,%rcx
        jnz     .Loop

        movq    %r11,%rax
        .byte   0xf3,0xc3
.cfi_endproc
.size   OPENSSL_instrument_bus,.-OPENSSL_instrument_bus

.globl  OPENSSL_instrument_bus2
.type   OPENSSL_instrument_bus2,@function
.align  16
OPENSSL_instrument_bus2:
.cfi_startproc
        movq    %rdi,%r10
        movq    %rsi,%rcx
        movq    %rdx,%r11
        movq    %rcx,8(%rsp)

        rdtsc
        movl    %eax,%r8d
        movl    $0,%r9d

        clflush (%r10)
.byte   0xf0
        addl    %r9d,(%r10)

        rdtsc
        movl    %eax,%edx
        subl    %r8d,%eax
        movl    %edx,%r8d
        movl    %eax,%r9d
.Loop2:
        clflush (%r10)
.byte   0xf0
        addl    %eax,(%r10)

        subq    $1,%r11
        jz      .Ldone2

        rdtsc
        movl    %eax,%edx
        subl    %r8d,%eax
        movl    %edx,%r8d
        cmpl    %r9d,%eax
        movl    %eax,%r9d
        movl    $0,%edx
        setne   %dl
        subq    %rdx,%rcx
        leaq    (%r10,%rdx,4),%r10
        jnz     .Loop2

.Ldone2:
        movq    8(%rsp),%rax
        subq    %rcx,%rax
        .byte   0xf3,0xc3
.cfi_endproc
.size   OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
.globl  OPENSSL_ia32_rdrand_bytes
.type   OPENSSL_ia32_rdrand_bytes,@function
.align  16
OPENSSL_ia32_rdrand_bytes:
.cfi_startproc
        xorq    %rax,%rax
        cmpq    $0,%rsi
        je      .Ldone_rdrand_bytes

        movq    $8,%r11
.Loop_rdrand_bytes:
.byte   73,15,199,242
        jc      .Lbreak_rdrand_bytes
        decq    %r11
        jnz     .Loop_rdrand_bytes
        jmp     .Ldone_rdrand_bytes

.align  16
.Lbreak_rdrand_bytes:
        cmpq    $8,%rsi
        jb      .Ltail_rdrand_bytes
        movq    %r10,(%rdi)
        leaq    8(%rdi),%rdi
        addq    $8,%rax
        subq    $8,%rsi
        jz      .Ldone_rdrand_bytes
        movq    $8,%r11
        jmp     .Loop_rdrand_bytes

.align  16
.Ltail_rdrand_bytes:
        movb    %r10b,(%rdi)
        leaq    1(%rdi),%rdi
        incq    %rax
        shrq    $8,%r10
        decq    %rsi
        jnz     .Ltail_rdrand_bytes

.Ldone_rdrand_bytes:
        xorq    %r10,%r10
        .byte   0xf3,0xc3
.cfi_endproc
.size   OPENSSL_ia32_rdrand_bytes,.-OPENSSL_ia32_rdrand_bytes
.globl  OPENSSL_ia32_rdseed_bytes
.type   OPENSSL_ia32_rdseed_bytes,@function
.align  16
OPENSSL_ia32_rdseed_bytes:
.cfi_startproc
        xorq    %rax,%rax
        cmpq    $0,%rsi
        je      .Ldone_rdseed_bytes

        movq    $8,%r11
.Loop_rdseed_bytes:
.byte   73,15,199,250
        jc      .Lbreak_rdseed_bytes
        decq    %r11
        jnz     .Loop_rdseed_bytes
        jmp     .Ldone_rdseed_bytes

.align  16
.Lbreak_rdseed_bytes:
        cmpq    $8,%rsi
        jb      .Ltail_rdseed_bytes
        movq    %r10,(%rdi)
        leaq    8(%rdi),%rdi
        addq    $8,%rax
        subq    $8,%rsi
        jz      .Ldone_rdseed_bytes
        movq    $8,%r11
        jmp     .Loop_rdseed_bytes

.align  16
.Ltail_rdseed_bytes:
        movb    %r10b,(%rdi)
        leaq    1(%rdi),%rdi
        incq    %rax
        shrq    $8,%r10
        decq    %rsi
        jnz     .Ltail_rdseed_bytes

.Ldone_rdseed_bytes:
        xorq    %r10,%r10
        .byte   0xf3,0xc3
.cfi_endproc
.size   OPENSSL_ia32_rdseed_bytes,.-OPENSSL_ia32_rdseed_bytes