mirror of https://github.com/lukechilds/node.git
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.
321 lines
5.1 KiB
321 lines
5.1 KiB
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
|
|
xor ecx,ecx
|
|
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
|
|
xor ecx,ecx
|
|
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
|
|
|