blob: b9b1c25843ad315be1f189d9c0a80dfe05e1a977 [file] [log] [blame]
TITLE x86cpuid.asm
IF @Version LT 800
ECHO MASM version 8.00 or later is strongly recommended.
ENDIF
.686
.MODEL FLAT
OPTION DOTNAME
IF @Version LT 800
.text$ SEGMENT PAGE 'CODE'
ELSE
.text$ SEGMENT ALIGN(64) 'CODE'
ENDIF
ALIGN 16
_OPENSSL_ia32_cpuid PROC PUBLIC
$L_OPENSSL_ia32_cpuid_begin::
push ebp
push ebx
push esi
push edi
xor edx,edx
pushfd
pop eax
mov ecx,eax
xor eax,2097152
push eax
popfd
pushfd
pop eax
xor ecx,eax
xor eax,eax
bt ecx,21
jnc $L000nocpuid
cpuid
mov edi,eax
xor eax,eax
cmp ebx,1970169159
setne al
mov ebp,eax
cmp edx,1231384169
setne al
or ebp,eax
cmp ecx,1818588270
setne al
or ebp,eax
jz $L001intel
cmp ebx,1752462657
setne al
mov esi,eax
cmp edx,1769238117
setne al
or esi,eax
cmp ecx,1145913699
setne al
or esi,eax
jnz $L001intel
mov eax,2147483648
cpuid
cmp eax,2147483649
jb $L001intel
mov esi,eax
mov eax,2147483649
cpuid
or ebp,ecx
and ebp,2049
cmp esi,2147483656
jb $L001intel
mov eax,2147483656
cpuid
movzx esi,cl
inc esi
mov eax,1
cpuid
bt edx,28
jnc $L002generic
shr ebx,16
and ebx,255
cmp ebx,esi
ja $L002generic
and edx,4026531839
jmp $L002generic
$L001intel:
cmp edi,4
mov edi,-1
jb $L003nocacheinfo
mov eax,4
mov ecx,0
cpuid
mov edi,eax
shr edi,14
and edi,4095
$L003nocacheinfo:
mov eax,1
cpuid
and edx,3220176895
cmp ebp,0
jne $L004notintel
or edx,1073741824
and ah,15
cmp ah,15
jne $L004notintel
or edx,1048576
$L004notintel:
bt edx,28
jnc $L002generic
and edx,4026531839
cmp edi,0
je $L002generic
or edx,268435456
shr ebx,16
cmp bl,1
ja $L002generic
and edx,4026531839
$L002generic:
and ebp,2048
and ecx,4294965247
mov esi,edx
or ebp,ecx
bt ecx,27
jnc $L005clear_avx
xor ecx,ecx
DB 15,1,208
and eax,6
cmp eax,6
je $L006done
cmp eax,2
je $L005clear_avx
$L007clear_xmm:
and ebp,4261412861
and esi,4278190079
$L005clear_avx:
and ebp,4026525695
$L006done:
mov eax,esi
mov edx,ebp
$L000nocpuid:
pop edi
pop esi
pop ebx
pop ebp
ret
_OPENSSL_ia32_cpuid ENDP
;EXTERN _OPENSSL_ia32cap_P:NEAR
ALIGN 16
_OPENSSL_rdtsc PROC PUBLIC
$L_OPENSSL_rdtsc_begin::
xor eax,eax
xor edx,edx
lea ecx,DWORD PTR _OPENSSL_ia32cap_P
bt DWORD PTR [ecx],4
jnc $L008notsc
rdtsc
$L008notsc:
ret
_OPENSSL_rdtsc ENDP
ALIGN 16
_OPENSSL_instrument_halt PROC PUBLIC
$L_OPENSSL_instrument_halt_begin::
lea ecx,DWORD PTR _OPENSSL_ia32cap_P
bt DWORD PTR [ecx],4
jnc $L009nohalt
DD 2421723150
and eax,3
jnz $L009nohalt
pushfd
pop eax
bt eax,9
jnc $L009nohalt
rdtsc
push edx
push eax
hlt
rdtsc
sub eax,DWORD PTR [esp]
sbb edx,DWORD PTR 4[esp]
add esp,8
ret
$L009nohalt:
xor eax,eax
xor edx,edx
ret
_OPENSSL_instrument_halt ENDP
ALIGN 16
_OPENSSL_far_spin PROC PUBLIC
$L_OPENSSL_far_spin_begin::
pushfd
pop eax
bt eax,9
jnc $L010nospin
mov eax,DWORD PTR 4[esp]
mov ecx,DWORD PTR 8[esp]
DD 2430111262
xor eax,eax
mov edx,DWORD PTR [ecx]
jmp $L011spin
ALIGN 16
$L011spin:
inc eax
cmp edx,DWORD PTR [ecx]
je $L011spin
DD 529567888
ret
$L010nospin:
xor eax,eax
xor edx,edx
ret
_OPENSSL_far_spin ENDP
ALIGN 16
_OPENSSL_wipe_cpu PROC PUBLIC
$L_OPENSSL_wipe_cpu_begin::
xor eax,eax
xor edx,edx
lea ecx,DWORD PTR _OPENSSL_ia32cap_P
mov ecx,DWORD PTR [ecx]
bt DWORD PTR [ecx],1
jnc $L012no_x87
DD 4007259865,4007259865,4007259865,4007259865,2430851995
$L012no_x87:
lea eax,DWORD PTR 4[esp]
ret
_OPENSSL_wipe_cpu ENDP
ALIGN 16
_OPENSSL_atomic_add PROC PUBLIC
$L_OPENSSL_atomic_add_begin::
mov edx,DWORD PTR 4[esp]
mov ecx,DWORD PTR 8[esp]
push ebx
nop
mov eax,DWORD PTR [edx]
$L013spin:
lea ebx,DWORD PTR [ecx*1+eax]
nop
DD 447811568
jne $L013spin
mov eax,ebx
pop ebx
ret
_OPENSSL_atomic_add ENDP
ALIGN 16
_OPENSSL_indirect_call PROC PUBLIC
$L_OPENSSL_indirect_call_begin::
push ebp
mov ebp,esp
sub esp,28
mov ecx,DWORD PTR 12[ebp]
mov DWORD PTR [esp],ecx
mov edx,DWORD PTR 16[ebp]
mov DWORD PTR 4[esp],edx
mov eax,DWORD PTR 20[ebp]
mov DWORD PTR 8[esp],eax
mov eax,DWORD PTR 24[ebp]
mov DWORD PTR 12[esp],eax
mov eax,DWORD PTR 28[ebp]
mov DWORD PTR 16[esp],eax
mov eax,DWORD PTR 32[ebp]
mov DWORD PTR 20[esp],eax
mov eax,DWORD PTR 36[ebp]
mov DWORD PTR 24[esp],eax
call DWORD PTR 8[ebp]
mov esp,ebp
pop ebp
ret
_OPENSSL_indirect_call ENDP
ALIGN 16
_OPENSSL_cleanse PROC PUBLIC
$L_OPENSSL_cleanse_begin::
mov edx,DWORD PTR 4[esp]
mov ecx,DWORD PTR 8[esp]
xor eax,eax
cmp ecx,7
jae $L014lot
cmp ecx,0
je $L015ret
$L016little:
mov BYTE PTR [edx],al
sub ecx,1
lea edx,DWORD PTR 1[edx]
jnz $L016little
$L015ret:
ret
ALIGN 16
$L014lot:
test edx,3
jz $L017aligned
mov BYTE PTR [edx],al
lea ecx,DWORD PTR [ecx-1]
lea edx,DWORD PTR 1[edx]
jmp $L014lot
$L017aligned:
mov DWORD PTR [edx],eax
lea ecx,DWORD PTR [ecx-4]
test ecx,-4
lea edx,DWORD PTR 4[edx]
jnz $L017aligned
cmp ecx,0
jne $L016little
ret
_OPENSSL_cleanse ENDP
ALIGN 16
_OPENSSL_ia32_rdrand PROC PUBLIC
$L_OPENSSL_ia32_rdrand_begin::
mov ecx,8
$L018loop:
DB 15,199,240
jc $L019break
loop $L018loop
$L019break:
cmp eax,0
cmove eax,ecx
ret
_OPENSSL_ia32_rdrand ENDP
.text$ ENDS
.bss SEGMENT 'BSS'
COMM _OPENSSL_ia32cap_P:QWORD
.bss ENDS
.CRT$XCU SEGMENT DWORD PUBLIC 'DATA'
EXTERN _OPENSSL_cpuid_setup:NEAR
DD _OPENSSL_cpuid_setup
.CRT$XCU ENDS
END