2018-03-11 17:40:12 +11:00
|
|
|
#include "x86_arch.h"
|
|
|
|
|
|
|
|
.hidden OPENSSL_cpuid_setup
|
|
|
|
.section .init
|
2023-06-04 16:48:43 -07:00
|
|
|
endbr64
|
2018-03-11 17:40:12 +11:00
|
|
|
call OPENSSL_cpuid_setup
|
|
|
|
|
|
|
|
|
|
|
|
.hidden OPENSSL_ia32cap_P
|
|
|
|
|
|
|
|
.text
|
|
|
|
|
|
|
|
.globl OPENSSL_ia32_cpuid
|
|
|
|
.type OPENSSL_ia32_cpuid,@function
|
|
|
|
.align 16
|
|
|
|
OPENSSL_ia32_cpuid:
|
2023-06-04 16:48:43 -07:00
|
|
|
endbr64
|
2018-03-11 17:40:12 +11:00
|
|
|
movq %rbx,%r8
|
|
|
|
|
|
|
|
xorl %eax,%eax
|
|
|
|
cpuid
|
|
|
|
movl %eax,%r11d
|
|
|
|
|
|
|
|
xorl %eax,%eax
|
|
|
|
cmpl $1970169159,%ebx
|
|
|
|
setne %al
|
|
|
|
movl %eax,%r9d
|
|
|
|
cmpl $1231384169,%edx
|
|
|
|
setne %al
|
|
|
|
orl %eax,%r9d
|
|
|
|
cmpl $1818588270,%ecx
|
|
|
|
setne %al
|
|
|
|
orl %eax,%r9d
|
|
|
|
jz .Lintel
|
|
|
|
|
|
|
|
cmpl $1752462657,%ebx
|
|
|
|
setne %al
|
|
|
|
movl %eax,%r10d
|
|
|
|
cmpl $1769238117,%edx
|
|
|
|
setne %al
|
|
|
|
orl %eax,%r10d
|
|
|
|
cmpl $1145913699,%ecx
|
|
|
|
setne %al
|
|
|
|
orl %eax,%r10d
|
|
|
|
jnz .Lintel
|
|
|
|
|
|
|
|
|
|
|
|
movl $2147483648,%eax
|
|
|
|
cpuid
|
|
|
|
cmpl $2147483649,%eax
|
|
|
|
jb .Lintel
|
|
|
|
movl %eax,%r10d
|
|
|
|
movl $2147483649,%eax
|
|
|
|
cpuid
|
2023-06-04 16:48:43 -07:00
|
|
|
orl %ecx,%r9d
|
2018-03-11 17:40:12 +11:00
|
|
|
andl $IA32CAP_MASK1_AMD_XOP,%r9d
|
|
|
|
orl $1,%r9d
|
|
|
|
|
|
|
|
cmpl $2147483656,%r10d
|
|
|
|
jb .Lintel
|
|
|
|
|
|
|
|
movl $2147483656,%eax
|
|
|
|
cpuid
|
|
|
|
movzbq %cl,%r10
|
|
|
|
incq %r10
|
|
|
|
|
|
|
|
movl $1,%eax
|
|
|
|
cpuid
|
|
|
|
btl $IA32CAP_BIT0_HT,%edx
|
|
|
|
jnc .Lgeneric
|
|
|
|
shrl $16,%ebx
|
|
|
|
cmpb %r10b,%bl
|
|
|
|
ja .Lgeneric
|
|
|
|
xorl $IA32CAP_MASK0_HT,%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 $4095,%r10d
|
|
|
|
|
|
|
|
.Lnocacheinfo:
|
|
|
|
movl $1,%eax
|
|
|
|
cpuid
|
|
|
|
|
|
|
|
andl $(~(IA32CAP_MASK0_INTELP4 | IA32CAP_MASK0_INTEL)),%edx
|
|
|
|
cmpl $0,%r9d
|
|
|
|
jne .Lnotintel
|
|
|
|
|
|
|
|
orl $IA32CAP_MASK0_INTEL,%edx
|
|
|
|
andb $15,%ah
|
|
|
|
cmpb $15,%ah
|
|
|
|
jne .Lnotintel
|
|
|
|
|
|
|
|
orl $IA32CAP_MASK0_INTELP4,%edx
|
|
|
|
.Lnotintel:
|
|
|
|
btl $IA32CAP_BIT0_HT,%edx
|
|
|
|
jnc .Lgeneric
|
|
|
|
xorl $IA32CAP_MASK0_HT,%edx
|
|
|
|
cmpl $0,%r10d
|
|
|
|
je .Lgeneric
|
|
|
|
|
|
|
|
orl $IA32CAP_MASK0_HT,%edx
|
|
|
|
shrl $16,%ebx
|
|
|
|
cmpb $1,%bl
|
|
|
|
ja .Lgeneric
|
|
|
|
xorl $IA32CAP_MASK0_HT,%edx
|
|
|
|
|
|
|
|
.Lgeneric:
|
|
|
|
andl $IA32CAP_MASK1_AMD_XOP,%r9d
|
|
|
|
andl $(~IA32CAP_MASK1_AMD_XOP),%ecx
|
|
|
|
orl %ecx,%r9d
|
|
|
|
|
|
|
|
movl %edx,%r10d
|
|
|
|
btl $IA32CAP_BIT1_OSXSAVE,%r9d
|
|
|
|
jnc .Lclear_avx
|
|
|
|
xorl %ecx,%ecx
|
|
|
|
.byte 0x0f,0x01,0xd0
|
|
|
|
andl $6,%eax
|
|
|
|
cmpl $6,%eax
|
|
|
|
je .Ldone
|
|
|
|
.Lclear_avx:
|
|
|
|
movl $(~(IA32CAP_MASK1_AVX | IA32CAP_MASK1_FMA3 | IA32CAP_MASK1_AMD_XOP)),%eax
|
|
|
|
andl %eax,%r9d
|
|
|
|
.Ldone:
|
|
|
|
shlq $32,%r9
|
|
|
|
movl %r10d,%eax
|
|
|
|
movq %r8,%rbx
|
|
|
|
orq %r9,%rax
|
2018-04-12 20:52:41 -06:00
|
|
|
retq
|
2018-03-11 17:40:12 +11:00
|
|
|
.size OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid
|
|
|
|
#if defined(HAVE_GNU_STACK)
|
|
|
|
.section .note.GNU-stack,"",%progbits
|
|
|
|
#endif
|