mirror of
https://github.com/nodejs/node.git
synced 2025-05-19 18:00:10 +00:00

Several people have reported issues with IIS and Resin servers (or maybe SSL terminators sitting in front of those servers) that are fixed by downgrading OpenSSL. The AESNI performance improvements were nice but stability is more important. Downgrade OpenSSL from 1.0.1e to 1.0.0f. Fixes #5360 (and others).
278 lines
4.4 KiB
NASM
278 lines
4.4 KiB
NASM
TITLE x86cpuid.asm
|
|
IF @Version LT 800
|
|
ECHO MASM version 8.00 or later is strongly recommended.
|
|
ENDIF
|
|
.586
|
|
.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
|
|
bt ecx,21
|
|
jnc $L000done
|
|
xor eax,eax
|
|
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,2147483656
|
|
jb $L001intel
|
|
mov eax,2147483656
|
|
cpuid
|
|
movzx esi,cl
|
|
inc esi
|
|
mov eax,1
|
|
cpuid
|
|
bt edx,28
|
|
jnc $L000done
|
|
shr ebx,16
|
|
and ebx,255
|
|
cmp ebx,esi
|
|
ja $L000done
|
|
and edx,4026531839
|
|
jmp $L000done
|
|
$L001intel:
|
|
cmp edi,4
|
|
mov edi,-1
|
|
jb $L002nocacheinfo
|
|
mov eax,4
|
|
mov ecx,0
|
|
cpuid
|
|
mov edi,eax
|
|
shr edi,14
|
|
and edi,4095
|
|
$L002nocacheinfo:
|
|
mov eax,1
|
|
cpuid
|
|
cmp ebp,0
|
|
jne $L003notP4
|
|
and ah,15
|
|
cmp ah,15
|
|
jne $L003notP4
|
|
or edx,1048576
|
|
$L003notP4:
|
|
bt edx,28
|
|
jnc $L000done
|
|
and edx,4026531839
|
|
cmp edi,0
|
|
je $L000done
|
|
or edx,268435456
|
|
shr ebx,16
|
|
cmp bl,1
|
|
ja $L000done
|
|
and edx,4026531839
|
|
$L000done:
|
|
mov eax,edx
|
|
mov edx,ecx
|
|
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 $L004notsc
|
|
rdtsc
|
|
$L004notsc:
|
|
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 $L005nohalt
|
|
DD 2421723150
|
|
and eax,3
|
|
jnz $L005nohalt
|
|
pushfd
|
|
pop eax
|
|
bt eax,9
|
|
jnc $L005nohalt
|
|
rdtsc
|
|
push edx
|
|
push eax
|
|
hlt
|
|
rdtsc
|
|
sub eax,DWORD PTR [esp]
|
|
sbb edx,DWORD PTR 4[esp]
|
|
add esp,8
|
|
ret
|
|
$L005nohalt:
|
|
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 $L006nospin
|
|
mov eax,DWORD PTR 4[esp]
|
|
mov ecx,DWORD PTR 8[esp]
|
|
DD 2430111262
|
|
xor eax,eax
|
|
mov edx,DWORD PTR [ecx]
|
|
jmp $L007spin
|
|
ALIGN 16
|
|
$L007spin:
|
|
inc eax
|
|
cmp edx,DWORD PTR [ecx]
|
|
je $L007spin
|
|
DD 529567888
|
|
ret
|
|
$L006nospin:
|
|
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 $L008no_x87
|
|
DD 4007259865,4007259865,4007259865,4007259865,2430851995
|
|
$L008no_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]
|
|
$L009spin:
|
|
lea ebx,DWORD PTR [ecx*1+eax]
|
|
nop
|
|
DD 447811568
|
|
jne $L009spin
|
|
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 $L010lot
|
|
cmp ecx,0
|
|
je $L011ret
|
|
$L012little:
|
|
mov BYTE PTR [edx],al
|
|
sub ecx,1
|
|
lea edx,DWORD PTR 1[edx]
|
|
jnz $L012little
|
|
$L011ret:
|
|
ret
|
|
ALIGN 16
|
|
$L010lot:
|
|
test edx,3
|
|
jz $L013aligned
|
|
mov BYTE PTR [edx],al
|
|
lea ecx,DWORD PTR [ecx-1]
|
|
lea edx,DWORD PTR 1[edx]
|
|
jmp $L010lot
|
|
$L013aligned:
|
|
mov DWORD PTR [edx],eax
|
|
lea ecx,DWORD PTR [ecx-4]
|
|
test ecx,-4
|
|
lea edx,DWORD PTR 4[edx]
|
|
jnz $L013aligned
|
|
cmp ecx,0
|
|
jne $L012little
|
|
ret
|
|
_OPENSSL_cleanse ENDP
|
|
.text$ ENDS
|
|
.bss SEGMENT 'BSS'
|
|
COMM _OPENSSL_ia32cap_P:DWORD
|
|
.bss ENDS
|
|
.CRT$XCU SEGMENT DWORD PUBLIC 'DATA'
|
|
EXTERN _OPENSSL_cpuid_setup:NEAR
|
|
DD _OPENSSL_cpuid_setup
|
|
.CRT$XCU ENDS
|
|
END
|