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