OpenSSL 1.1.1-pre2
This commit is contained in:
+24
-2
@@ -63,10 +63,12 @@ OPENSSL_rdtsc:
|
||||
.type OPENSSL_ia32_cpuid,\@function,1
|
||||
.align 16
|
||||
OPENSSL_ia32_cpuid:
|
||||
.cfi_startproc
|
||||
mov %rbx,%r8 # save %rbx
|
||||
.cfi_register %rbx,%r8
|
||||
|
||||
xor %eax,%eax
|
||||
mov %eax,8(%rdi) # clear extended feature flags
|
||||
mov %rax,8(%rdi) # clear extended feature flags
|
||||
cpuid
|
||||
mov %eax,%r11d # max value for standard query level
|
||||
|
||||
@@ -137,6 +139,7 @@ OPENSSL_ia32_cpuid:
|
||||
.Lnocacheinfo:
|
||||
mov \$1,%eax
|
||||
cpuid
|
||||
movd %eax,%xmm0 # put aside processor id
|
||||
and \$0xbfefffff,%edx # force reserved bits to 0
|
||||
cmp \$0,%r9d
|
||||
jne .Lnotintel
|
||||
@@ -184,26 +187,45 @@ OPENSSL_ia32_cpuid:
|
||||
jc .Lnotknights
|
||||
and \$0xfff7ffff,%ebx # clear ADCX/ADOX flag
|
||||
.Lnotknights:
|
||||
movd %xmm0,%eax # restore processor id
|
||||
and \$0x0fff0ff0,%eax
|
||||
cmp \$0x00050650,%eax # Skylake-X
|
||||
jne .Lnotskylakex
|
||||
and \$0xfffeffff,%ebx # ~(1<<16)
|
||||
# suppress AVX512F flag on Skylake-X
|
||||
.Lnotskylakex:
|
||||
mov %ebx,8(%rdi) # save extended feature flags
|
||||
mov %ecx,12(%rdi)
|
||||
.Lno_extended_info:
|
||||
|
||||
bt \$27,%r9d # check OSXSAVE bit
|
||||
jnc .Lclear_avx
|
||||
xor %ecx,%ecx # XCR0
|
||||
.byte 0x0f,0x01,0xd0 # xgetbv
|
||||
and \$0xe6,%eax # isolate XMM, YMM and ZMM state support
|
||||
cmp \$0xe6,%eax
|
||||
je .Ldone
|
||||
andl \$0x3fdeffff,8(%rdi) # ~(1<<31|1<<30|1<<21|1<<16)
|
||||
# clear AVX512F+BW+VL+FIMA, all of
|
||||
# them are EVEX-encoded, which requires
|
||||
# ZMM state support even if one uses
|
||||
# only XMM and YMM :-(
|
||||
and \$6,%eax # isolate XMM and YMM state support
|
||||
cmp \$6,%eax
|
||||
je .Ldone
|
||||
.Lclear_avx:
|
||||
mov \$0xefffe7ff,%eax # ~(1<<28|1<<12|1<<11)
|
||||
and %eax,%r9d # clear AVX, FMA and AMD XOP bits
|
||||
andl \$0xffffffdf,8(%rdi) # clear AVX2, ~(1<<5)
|
||||
mov \$0x3fdeffdf,%eax # ~(1<<31|1<<30|1<<21|1<<16|1<<5)
|
||||
and %eax,8(%rdi) # clear AVX2 and AVX512* bits
|
||||
.Ldone:
|
||||
shl \$32,%r9
|
||||
mov %r10d,%eax
|
||||
mov %r8,%rbx # restore %rbx
|
||||
.cfi_restore %rbx
|
||||
or %r9,%rax
|
||||
ret
|
||||
.cfi_endproc
|
||||
.size OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid
|
||||
|
||||
.globl OPENSSL_cleanse
|
||||
|
||||
Reference in New Issue
Block a user