You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
234 lines
3.7 KiB
234 lines
3.7 KiB
|
|
.hidden OPENSSL_cpuid_setup |
|
.section .init |
|
call OPENSSL_cpuid_setup |
|
|
|
.hidden OPENSSL_ia32cap_P |
|
.comm OPENSSL_ia32cap_P,8,4 |
|
|
|
.text |
|
|
|
.globl OPENSSL_atomic_add |
|
.type OPENSSL_atomic_add,@function |
|
.align 16 |
|
OPENSSL_atomic_add: |
|
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 |
|
.size OPENSSL_atomic_add,.-OPENSSL_atomic_add |
|
|
|
.globl OPENSSL_rdtsc |
|
.type OPENSSL_rdtsc,@function |
|
.align 16 |
|
OPENSSL_rdtsc: |
|
rdtsc |
|
shlq $32,%rdx |
|
orq %rdx,%rax |
|
.byte 0xf3,0xc3 |
|
.size OPENSSL_rdtsc,.-OPENSSL_rdtsc |
|
|
|
.globl OPENSSL_ia32_cpuid |
|
.type OPENSSL_ia32_cpuid,@function |
|
.align 16 |
|
OPENSSL_ia32_cpuid: |
|
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 |
|
orl %ecx,%r9d |
|
andl $2049,%r9d |
|
|
|
cmpl $2147483656,%r10d |
|
jb .Lintel |
|
|
|
movl $2147483656,%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 $4026531839,%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 $3220176895,%edx |
|
cmpl $0,%r9d |
|
jne .Lnotintel |
|
orl $1073741824,%edx |
|
andb $15,%ah |
|
cmpb $15,%ah |
|
jne .Lnotintel |
|
orl $1048576,%edx |
|
.Lnotintel: |
|
btl $28,%edx |
|
jnc .Lgeneric |
|
andl $4026531839,%edx |
|
cmpl $0,%r10d |
|
je .Lgeneric |
|
|
|
orl $268435456,%edx |
|
shrl $16,%ebx |
|
cmpb $1,%bl |
|
ja .Lgeneric |
|
andl $4026531839,%edx |
|
.Lgeneric: |
|
andl $2048,%r9d |
|
andl $4294965247,%ecx |
|
orl %ecx,%r9d |
|
|
|
movl %edx,%r10d |
|
btl $27,%r9d |
|
jnc .Lclear_avx |
|
xorl %ecx,%ecx |
|
.byte 0x0f,0x01,0xd0 |
|
andl $6,%eax |
|
cmpl $6,%eax |
|
je .Ldone |
|
.Lclear_avx: |
|
movl $4026525695,%eax |
|
andl %eax,%r9d |
|
.Ldone: |
|
shlq $32,%r9 |
|
movl %r10d,%eax |
|
movq %r8,%rbx |
|
orq %r9,%rax |
|
.byte 0xf3,0xc3 |
|
.size OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid |
|
|
|
.globl OPENSSL_cleanse |
|
.type OPENSSL_cleanse,@function |
|
.align 16 |
|
OPENSSL_cleanse: |
|
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 |
|
.size OPENSSL_cleanse,.-OPENSSL_cleanse |
|
.globl OPENSSL_wipe_cpu |
|
.type OPENSSL_wipe_cpu,@function |
|
.align 16 |
|
OPENSSL_wipe_cpu: |
|
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 |
|
.size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu |
|
.globl OPENSSL_ia32_rdrand |
|
.type OPENSSL_ia32_rdrand,@function |
|
.align 16 |
|
OPENSSL_ia32_rdrand: |
|
movl $8,%ecx |
|
.Loop_rdrand: |
|
.byte 72,15,199,240 |
|
jc .Lbreak_rdrand |
|
loop .Loop_rdrand |
|
.Lbreak_rdrand: |
|
cmpq $0,%rax |
|
cmoveq %rcx,%rax |
|
.byte 0xf3,0xc3 |
|
.size OPENSSL_ia32_rdrand,.-OPENSSL_ia32_rdrand
|
|
|