Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 532 → Rev 6483

/programs/system/cpuid/trunk/features.inc
1,5 → 1,5
;Addresses for bits
 
; edx cpuid(1)
FPU_FLAG equ 0001h ;Floating-point unit on-Chip
VME_FLAG equ 0002h ;Virtual Mode Extension
DE_FLAG equ 0004h ;Debugging Extension
38,6 → 38,7
MON_FLAG equ 0008h ;MON -3
DS_CPL_FLAG equ 0010h ;DS-CPL -4
VMX_FLAG equ 0020h ;VMX -5
SMX_FLAG equ 0040h ;SMX -6 to add
EST_FLAG equ 0080h ; EST-7
TM2_FLAG equ 0100h ; TM2-8
SSSE3_FLAG equ 0200h ;SSSE3 -9
44,55 → 45,44
CNXT_ID_FLAG equ 0400h ;CID -10
CX16_FLAG equ 2000h ;CX16 - 13
ETPRD_FLAG equ 4000h ;xTPR - 14
DCA_FLAG equ 40000h ;DCA - 18
PDCM_FLAG equ 8000h ;PDCM - 15 to add
DCA_FLAG equ 40000h ;DCA - 18 Direct Cache Access
SSE41_FLAG equ 80000h ;SSE41 - 19 to add
SSE42_FLAG equ 100000h ;SSE42 - 20 to add
x2APIC_FLAG equ 200000h ;x2APIC - 21 to add
PPCNT_FLAG equ 800000h ;PPCNT - 23 to add
 
 
; edx cpuid(8000_0001h)
 
SYS_FLAG equ 0800h ;11
 
MP_FLAG equ 80000h ;19
SYS_FLAG equ 0800h ;11 - may be we already detect it as SEP_FLAG
MP_FLAG equ 80000h ;19 ???? not found in recent guides from AMD and Intel
NX_FLAG equ 100000h ;20
MMXPi_FLAG equ 400000h ;22
MMXn_FLAG equ 800000h ;23
FXSRn_FLAG equ 1000000h ;24 it is ÌÌÕ+ for Cyrix
FFXSR_FLAG equ 2000000h ;25
PAGE_FLAG equ 4000000h ;26 Page1Gb to add
TSCP_FLAG equ 8000000h ;27
LM_FLAG equ 20000000h ;29 EM64T
DNo_FLAG equ 40000000h ;30
DN_FLAG equ 80000000h ;31
DNo_FLAG equ 40000000h ;30 3dNow! Ext
DN_FLAG equ 80000000h ;31 3dNow!
 
 
; ecx cpuid(8000_0001h)
LAHF_FLAG equ 0001h ; LAHF 0
CMPL_FLAG equ 0002h ; core multi-processing legacy mode 1
SVM_FLAG equ 0004h ; secure virtual machine 2
EAS_FLAG equ 0008h ; ExtApicSpace 3 to add
MOVCR8_FLAG equ 0010h ;AltMovCr8 4
ABM_FLAG equ 0020h ; ABM -5 to add
SSE4A_FLAG equ 0040h ; SSE4A -6 to add
MIS_FLAG equ 0080h ; MissAlignSSE -7 to add
3DNP_FLAG equ 0100h ; 3DNowPrefetch-8 to add
OSVW_FLAG equ 0200h ; OS visible workaround -9 to add
SSE5_FLAG equ 0800h ;SSE5 - 11 to add
SKINIT_FLAG equ 1000h ;SKINIT- 12 to add
WDT_FLAG equ 2000h ;Watchdog timer - 13 to add
 
;//////////////////////////////////////////////
decode_sse3: ; is SS3 supported
xor eax, eax
inc eax
cpuid
test ecx, 1
setnz [sse3sup]
mov eax, sse3+6
 
write_yes_no:
mov dword [eax], 'no'
jz @f
mov dword [eax], 'yes'
@@:
ret
 
show_next_bit:
shr edx, 1
write_yes_no_cf:
mov dword [eax], 'no'
jnc @f
mov dword [eax], 'yes'
@@:
ret
 
;decoding standard features
 
decode_standard_features:
101,230 → 91,873
inc eax
cpuid
 
mov eax, FPU+6
call show_next_bit
 
mov eax, VME+7
call show_next_bit
Test0:
test edx, FPU_FLAG
jnz Test0e
 
mov eax, DE+7
call show_next_bit
mov dword [FPU+6], $6F6E
jmp Test1
 
mov eax, PSE+8
call show_next_bit
Test0e:
mov dword [FPU+6], $736579
 
mov eax, TSC+6
call show_next_bit
;;;;;;
Test1:
test edx, VME_FLAG
jnz Test1e
 
mov eax, MSR+7
call show_next_bit
mov dword [VME+ 7], $6F6E
jmp Test2
 
mov eax, PAE+7
call show_next_bit
Test1e:
mov dword [VME+ 7], $736579
 
mov eax, MCE+8
call show_next_bit
;;;;;;
Test2:
test edx, DE_FLAG
jnz Test2e
 
mov eax, CX8+6
call show_next_bit
mov dword [DE+ 7], $6F6E
jmp Test3
 
mov eax, APIC+7
call show_next_bit
Test2e:
mov dword [DE+ 7], $736579
;;;;;;
 
shr edx, 1 ; skip reserved bit
Test3:
test edx, PSE_FLAG
jnz Test3e
 
mov eax, SEP+8
call show_next_bit
mov dword [PSE+ 8], $6F6E
jmp Test4
 
mov eax, MTRR+6
call show_next_bit
Test3e:
mov dword [PSE+ 8], $736579
 
mov eax, PGE+7
call show_next_bit
;;;;
Test4:
test edx, TSC_FLAG
jnz Test4e
 
mov eax, MCA+7
call show_next_bit
mov dword [TSC+ 6], $6F6E
jmp Test5
 
mov eax, CMOV+8
call show_next_bit
Test4e:
mov dword [TSC+ 6], $736579
 
mov eax, PAT+6
call show_next_bit
;;;;
Test5:
test edx, MSR_FLAG
jnz Test5e
 
mov eax, PSE36+7
call show_next_bit
mov dword [MSR+ 7], $6F6E
jmp Test6
 
mov eax, PSNUM+7
call show_next_bit
Test5e:
mov dword [MSR+ 7], $736579
 
mov eax, CLFLUSHn+8
call show_next_bit
;;;;
Test6:
test edx, PAE_FLAG
jnz Test6e
 
shr edx, 1 ; skip reserved bit
mov dword [PAE+ 7], $6F6E
jmp Test7
 
mov eax, DTS+7
call show_next_bit
Test6e:
mov dword [PAE+ 7], $736579
 
mov eax, ACPI+7
call show_next_bit
;;;;
Test7:
test edx, MCE_FLAG
jnz Test7e
 
mov eax, MMX+8
call show_next_bit
mov eax, [eax]
mov [MMXs+7], eax
mov dword [MCE+ 8], $6F6E
jmp Test8
 
mov eax, FXSR+6
call show_next_bit
Test7e:
mov dword [MCE+ 8], $736579
 
mov eax, SSE+7
call show_next_bit
;;;;
Test8:
test edx, CX8_FLAG
jnz Test8e
 
mov eax, SSE2+7
call show_next_bit
mov dword [CX8+ 6], $6F6E
jmp Test9
 
mov eax, SSn+8
call show_next_bit
Test8e:
mov dword [CX8+ 6], $736579
;;;;
 
shr edx, 1
; mov eax, HTT+8
Test9:
test edx, APIC_FLAG
jnz Test9e
 
mov dword [APIC+ 7], $6F6E
jmp Test11
 
Test9e:
mov dword [APIC+ 7], $736579
;;;;;
 
Test11:
test edx, SEP_FLAG
jnz Test11e
 
mov dword [SEP+ 8], $6F6E
jmp Test12
 
Test11e:
mov dword [SEP+ 8], $736579
;;;;
 
Test12:
test edx, MTRR_FLAG
jnz Test12e
 
mov dword [MTRR+ 6], $6F6E
jmp Test13
 
Test12e:
mov dword [MTRR+ 6], $736579
;;;;
 
Test13:
test edx, PGE_FLAG
jnz Test13e
 
mov dword [PGE+ 7], $6F6E
jmp Test14
 
Test13e:
mov dword [PGE+ 7], $736579
;;;;;
 
Test14:
test edx, MCA_FLAG
jnz Test14e
 
mov dword [MCA+ 7], $6F6E
jmp Test15
 
Test14e:
mov dword [MCA+ 7], $736579
;;;;
 
Test15:
test edx, CMOV_FLAG
jnz Test15e
 
mov dword [CMOV+ 8], $6F6E
jmp Test16
 
Test15e:
mov dword [CMOV+ 8], $736579
;;;;
 
Test16:
test edx, PAT_FLAG
jnz Test16e
 
mov dword [PAT+ 6], $6F6E
jmp Test17
 
Test16e:
mov dword [PAT+ 6], $736579
;;;;
 
Test17:
test edx, PSE36_FLAG
jnz Test17e
 
mov dword [PSE36+ 7], $6F6E
jmp Test18
 
Test17e:
mov dword [PSE36+ 7], $736579
;;;;
 
Test18:
test edx, PSNUM_FLAG
jnz Test18e
 
mov dword [PSNUM+ 7], $6F6E
jmp Test19
 
Test18e:
mov dword [PSNUM+ 7], $736579
;;;;
 
Test19:
test edx, CLFLUSH_FLAG
jnz Test19e
 
mov dword [CLFLUSHn + 8], $6F6E
jmp Test21
 
Test19e:
mov dword [CLFLUSHn + 8], $736579
;;;;
 
Test21:
test edx, DTS_FLAG
jnz Test21e
 
mov dword [DTS+ 7], $6F6E
jmp Test22
 
Test21e:
mov dword [DTS+ 7], $736579
;;;;
 
Test22:
test edx, ACPI_FLAG
jnz Test22e
 
mov dword [ACPI+ 7], $6F6E
jmp Test23
 
Test22e:
mov dword [ACPI+ 7], $736579
;;;;;
 
Test23:
test edx, MMX_FLAG
jnz Test23e
 
mov dword [MMX+ 8], $6F6E
mov dword [MMXs+ 7], $6F6E
jmp Test24
 
Test23e:
mov dword [MMX+ 8], $736579
mov dword [MMXs+ 7], $736579
;;;;;
 
Test24:
test edx, FXSR_FLAG
jnz Test24e
 
mov dword [FXSR+ 6], $6F6E
jmp Test25
 
Test24e:
mov dword [FXSR+ 6], $736579
;;;;;
 
Test25:
test edx, SSE_FLAG
jnz Test25e
 
mov dword [SSE+ 7], $6F6E
jmp Test26
 
Test25e:
mov dword [SSE+ 7], $736579
 
;;;;
Test26:
test edx, SSE2_FLAG
jnz Test26e
 
mov dword [SSE2+ 7], $6F6E
jmp Test27
 
Test26e:
mov dword [SSE2+ 7], $736579
 
;;;;
 
Test27:
test edx, SS_FLAG
jnz Test27e
 
mov dword [SSn+ 8], $6F6E
jmp Test29;28
 
Test27e:
mov dword [SSn+ 8], $736579
 
;;;;
 
;Test28:
; test edx, HTT_FLAG
; call write_yes_no
;jnz Test28e
;
;mov dword [HTT+ 8], $6F6E
;jmp Test29
;
;Test28e:
;mov dword [HTT+ 8], $736579
 
mov eax, TM+7
call show_next_bit
;;;;
 
mov eax, IA64+7
call show_next_bit
Test29:
test edx, TM_FLAG
jnz Test29e
 
mov eax, PBE+8
call show_next_bit
mov dword [TM+ 7], $6F6E
jmp Test30
 
Test29e:
mov dword [TM+ 7], $736579
 
;;;;
 
Test30:
test edx, IA64_FLAG
jnz Test30e
 
mov dword [IA64+ 7], $6F6E
jmp Test31
 
Test30e:
mov dword [IA64+ 7], $736579
 
;;;;
Test31:
test edx, PBE_FLAG
jnz Test31e
 
mov dword [PBE+ 8], $6F6E
jmp Standart_out
 
Test31e:
mov dword [PBE+ 8], $736579
 
Standart_out:
 
ret
;//////////////////////////////////////////////
decode_sse3_5: ; is SS3-5 supported
xor eax,eax
inc eax
cpuid
test ecx, $1 ; Test bit 1
jnz .EX; SSE3 technology is supported
jz .EXN
 
;//////////////////////////////////////////////
.EX:
mov dword [sse3+ 6], $736579
mov [sse3sup], 1
jmp exitter
.EXN:
mov dword [sse3+ 6], $6F6E
mov [sse3sup],0
 
exitter:
 
 
test ecx, $80000 ; Test bit 19
jnz .EX1; SSE41 technology is supported
jz .EXN1
 
.EX1:
mov dword [SSE41+ 11], $736579
mov [sse41sup], 1
jmp exitter1
.EXN1:
mov dword [SSE41+ 11], $6F6E
mov [sse41sup],0
 
exitter1:
 
 
test ecx, $100000 ; Test bit 20
jnz .EX2; SSE42 technology is supported
jz .EXN2
 
.EX2:
mov dword [SSE42+ 10], $736579
mov dword [SS42+ 11], $736579
mov [sse42sup], 1
jmp exitter2
.EXN2:
mov dword [SSE42+ 10], $6F6E
mov dword [SS42+ 11], $6F6E
mov [sse42sup],0
 
exitter2:
 
 
xor eax,eax
mov eax, 80000001h
cpuid
test ecx, $800 ; Test bit 11
jnz .EX3; SS5 technology is supported
jz .EXN3
 
.EX3:
mov dword [SSE5+ 12], $736579
mov [sse5sup], 1
jmp exitter3
.EXN3:
mov dword [SSE5+ 12], $6F6E
mov [sse5sup],0
 
exitter3:
 
ret
 
 
decode_extended_features:
; is called immediately after decode_standard_features
; xor eax, eax
; inc eax
; cpuid
 
mov eax, SS3+8
xor eax,eax
inc eax
cpuid
Tes1:
test ecx, SSE3_FLAG
call write_yes_no
jnz Tes1e
 
mov eax, MON+8
mov dword [SS3+ 8], $6F6E
jmp Tes2
 
Tes1e:
mov dword [SS3+ 8], $736579
 
 
Tes2:
test ecx, MON_FLAG
call write_yes_no
jnz Tes2e
 
mov eax, DS_CPL+8
mov dword [MON+ 8], $6F6E
jmp Tes3
 
Tes2e:
mov dword [MON+ 8], $736579
 
 
Tes3:
test ecx, DS_CPL_FLAG
call write_yes_no
jnz Tes3e
 
mov eax, EST+8
mov dword [DS_CPL+ 8], $6F6E
jmp Tes4
 
Tes3e:
mov dword [DS_CPL+ 8], $736579
 
Tes4:
test ecx, EST_FLAG
call write_yes_no
jnz Tes4e
 
mov eax, TM2+8
mov dword [EST+ 8], $6F6E
jmp Tes5
 
Tes4e:
mov dword [EST+ 8], $736579
 
 
Tes5:
test ecx, TM2_FLAG
call write_yes_no
jnz Tes5e
 
mov eax, CNXT_ID+12
mov dword [TM2+ 8], $6F6E
jmp Tes6
 
Tes5e:
mov dword [TM2+ 8], $736579
 
 
Tes6:
test ecx, CNXT_ID_FLAG
call write_yes_no
jnz Tes6e
 
mov eax, CX16+12
mov dword [CNXT_ID+ 12], $6F6E
jmp Tes7
 
Tes6e:
mov dword [CNXT_ID+ 12], $736579
 
 
Tes7:
test ecx, CX16_FLAG
call write_yes_no
jnz Tes7e
 
mov eax, ETPRD+12
mov dword [CX16+ 12], $6F6E
jmp Tes8
 
Tes7e:
mov dword [CX16+ 12], $736579
 
 
Tes8:
test ecx, ETPRD_FLAG
call write_yes_no
jnz Tes8e
 
mov eax, VMX+8
mov dword [ETPRD+ 12], $6F6E
jmp Tes9
 
Tes8e:
mov dword [ETPRD+ 12], $736579
 
Tes9:
test ecx, VMX_FLAG
call write_yes_no
jnz Tes9e
 
mov eax, SSSE3+12
mov dword [VMX+ 8], $6F6E
jmp Tes10
 
Tes9e:
mov dword [VMX+ 8], $736579
 
Tes10:
test ecx, SSSE3_FLAG
call write_yes_no
jnz Tes10e
 
mov eax, DCA+8
mov dword [SSSE3+ 12], $6F6E
jmp Tes11
 
Tes10e:
mov dword [SSSE3+ 12], $736579
 
Tes11:
test ecx, DCA_FLAG
call write_yes_no
@@:
jnz Tes11e
 
mov dword [DCA+ 8], $6F6E
jmp Tes12
 
Tes11e:
mov dword [DCA+ 8], $736579
 
Tes12:
test ecx, SMX_FLAG
jnz Tes12e
 
mov dword [SMX+ 8], $6F6E
jmp Tes13
 
Tes12e:
mov dword [SMX+ 8], $736579
 
Tes13:
test ecx, PDCM_FLAG
jnz Tes13e
 
mov dword [newLabel+ 8], $6F6E
jmp Tes14
 
Tes13e:
mov dword [newLabel+ 8], $736579
 
Tes14:
test ecx, x2APIC_FLAG
jnz Tes14e
 
mov dword [x2APIC+ 8], $6F6E
jmp Tes15
 
Tes14e:
mov dword [x2APIC+ 8], $736579
 
Tes15:
test ecx, PPCNT_FLAG
jnz Tes15e
 
mov dword [PPCNT+ 12], $6F6E
jmp Tes16
 
Tes15e:
mov dword [PPCNT+ 12], $736579
 
Tes16:
 
ret
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
decode_extended:
xor eax, eax
mov eax, $80000000
cpuid
mov [extc], eax ; max number of calls
test eax, eax
jns @b
 
test eax, 80000000h
jnz gooodd
 
jmp baaad
 
baaad:
 
jmp Tez13
 
gooodd:
xor eax, eax
mov eax, $80000001 ;// Setup extended function 8000_0001h
cpuid
 
mov eax, MP+8
Tez1:
test edx, MP_FLAG
call write_yes_no
jnz Tez1e
 
mov eax, NX+8
mov dword [MP+8], $6F6E
jmp Tez2
 
Tez1e:
mov dword [MP+ 8], $736579
 
Tez2:
test edx, NX_FLAG
call write_yes_no
jnz Tez2e
 
mov dword [NX+ 8], $6F6E
jmp Tez4
;jmp Tez3 we do detection in another place, because of Cyrix specific MMX+ detection
; mov eax, MMXPi+8
 
Tez2e:
mov dword [NX+ 8], $736579
 
;Tez3:
; test edx, MMXPi_FLAG
; call write_yes_no
;jnz Tez3e
 
mov eax, MMXn+8
;mov dword [MMXPi+ 8], $6F6E
;jmp Tez4
 
 
;Tez3e:
;mov dword [MMXPi+ 8], $736579
 
Tez4:
test edx, MMXn_FLAG
call write_yes_no
jnz Tez4e
 
mov eax, FXSRn+8
mov dword [MMXn+ 8], $6F6E
jmp Tez5
 
Tez4e:
mov dword [MMXn+ 8], $736579
 
Tez5:
test edx, FXSRn_FLAG
call write_yes_no
jnz Tez5e
 
mov eax, FFXSR+12
mov dword [FXSRn+ 8], $6F6E
jmp Tez6
 
Tez5e:
mov dword [FXSRn+ 8], $736579
 
Tez6:
test edx, FFXSR_FLAG
call write_yes_no
jnz Tez6e
 
mov eax, TSCP+12
mov dword [FFXSR+ 12], $6F6E
jmp Tez7
 
Tez6e:
mov dword [FFXSR+ 12], $736579
 
Tez7:
test edx, TSCP_FLAG
call write_yes_no
jnz Tez7e
 
mov eax, LM+12
mov dword [TSCP+ 12], $6F6E
jmp Tez8
 
Tez7e:
mov dword [TSCP+ 12], $736579
 
 
Tez8:
test edx, LM_FLAG
call write_yes_no
jnz Tez8e
 
mov eax, DNo+12
mov dword [LM+ 12], $6F6E
jmp Tez9
 
Tez8e:
mov dword [LM+ 12], $736579
 
Tez9:
test edx, DNo_FLAG
call write_yes_no
jnz Tez9e
 
mov eax, DN+12
mov dword [DNo+ 12], $6F6E
jmp Tez10
 
Tez9e:
mov dword [DNo+ 12], $736579
 
 
Tez10:
test edx, DN_FLAG
call write_yes_no
jnz Tez10e
 
mov dword [DN+ 12], $6F6E
jmp Tez11
 
Tez10e:
mov dword [DN+ 12], $736579
 
;Intel
mov eax, SYS+12
 
Tez11:
test edx, SYS_FLAG
call write_yes_no
jnz Tez11e
 
mov eax, LAF+12
mov dword [SYS+ 12], $6F6E
jmp Tez12
 
Tez11e:
mov dword [SYS+ 12], $736579
 
 
Tez12:
test ecx, LAHF_FLAG
call write_yes_no
jnz Tez12e
 
mov eax, CMPL+12
mov dword [LAF+ 12], $6F6E
jmp Tez13
 
Tez12e:
mov dword [LAF+ 12], $736579
 
Tez13:
test ecx, CMPL_FLAG
call write_yes_no
jnz Tez13e
 
mov eax, SVM+8
mov dword [CMPL+ 8], $6F6E
jmp Tez14
 
Tez13e:
mov dword [CMPL+ 8], $736579
 
Tez14:
test ecx, SVM_FLAG
call write_yes_no
jnz Tez14e
 
mov eax, MCR8+12
mov dword [SVM+ 8], $6F6E
jmp Tez15
 
Tez14e:
mov dword [SVM+ 8], $736579
 
Tez15:
test ecx, MOVCR8_FLAG
call write_yes_no
jnz Tez15e
 
mov dword [MCR8+ 12], $6F6E
jmp Tez16
 
Tez15e:
mov dword [MCR8+ 12], $736579
 
Tez16:
test edx, PAGE_FLAG
jnz Tez16e
 
mov dword [PAGE+ 8], $6F6E
jmp Tez17
 
Tez16e:
mov dword [PAGE+ 8], $736579
 
Tez17:
test ecx, EAS_FLAG
jnz Tez17e
 
mov dword [EAS+ 12], $6F6E
jmp Tez18
 
Tez17e:
mov dword [EAS+ 12], $736579
 
Tez18:
test ecx, ABM_FLAG
jnz Tez18e
 
mov dword [ABM+ 8], $6F6E
jmp Tez19
 
Tez18e:
mov dword [ABM+ 8], $736579
 
Tez19:
test ecx, SSE4A_FLAG
jnz Tez19e
 
mov dword [SSE4A+ 8], $6F6E
jmp Tez20
 
Tez19e:
mov dword [SSE4A+ 8], $736579
 
Tez20:
test ecx, MIS_FLAG
jnz Tez20e
 
mov dword [MIS+ 8], $6F6E
jmp Tez21
 
Tez20e:
mov dword [MIS+ 8], $736579
 
Tez21:
test ecx, 3DNP_FLAG
jnz Tez21e
 
;mov dword [DNP+ 8], $6F6E
;jmp Tez22
 
Tez21e:
;mov dword [DNP+ 8], $736579
 
Tez22:
test ecx, OSVW_FLAG
jnz Tez22e
 
mov dword [OSVW+ 8], $6F6E
jmp Tez23
 
Tez22e:
mov dword [OSVW+ 8], $736579
 
Tez23:
test ecx, SKINIT_FLAG
jnz Tez23e
 
mov dword [SKINIT_+ 12], $6F6E
jmp Tez24
 
Tez23e:
mov dword [SKINIT_+ 12], $736579
 
Tez24:
test ecx, WDT_FLAG
jnz Tez24e
 
mov dword [WDT+ 12], $6F6E
jmp Tez25
 
Tez24e:
mov dword [WDT+ 12], $736579
 
Tez25:
 
ret
 
;//////////////////////////////////////////////
decode_sse3: ; is SS3 supported
xor eax, eax
inc eax
cpuid
test ecx, 1
setnz [sse3sup]
mov eax, sse3+6
 
write_yes_no:
mov dword [eax], 'no'
jz @f
mov dword [eax], 'yes'
@@:
ret
 
show_next_bit:
shr edx, 1
write_yes_no_cf:
mov dword [eax], 'no'
jnc @f
mov dword [eax], 'yes'
@@:
ret