[9] | 1 | ! getprocessor() - determine processor type Author: Kees J. Bot
|
---|
| 2 | ! 26 Jan 1994
|
---|
| 3 |
|
---|
| 4 | .sect .text; .sect .rom; .sect .data; .sect .bss
|
---|
| 5 | .sect .text
|
---|
| 6 |
|
---|
| 7 | ! int getprocessor(void);
|
---|
| 8 | ! Return 386, 486, 586, ...
|
---|
| 9 |
|
---|
| 10 | .define _getprocessor
|
---|
| 11 |
|
---|
| 12 | _getprocessor:
|
---|
| 13 | push ebp
|
---|
| 14 | mov ebp, esp
|
---|
| 15 | and esp, 0xFFFFFFFC ! Align stack to avoid AC fault
|
---|
| 16 | mov ecx, 0x00040000 ! Try to flip the AC bit introduced on the 486
|
---|
| 17 | call flip
|
---|
| 18 | mov eax, 386 ! 386 if it didn't react to "flipping"
|
---|
| 19 | jz gotprocessor
|
---|
| 20 | mov ecx, 0x00200000 ! Try to flip the ID bit introduced on the 586
|
---|
| 21 | call flip
|
---|
| 22 | mov eax, 486 ! 486 if it didn't react
|
---|
| 23 | jz gotprocessor
|
---|
| 24 | pushf
|
---|
| 25 | pusha ! Save the world
|
---|
| 26 | mov eax, 1
|
---|
| 27 | .data1 0x0F, 0xA2 ! CPUID instruction tells the processor type
|
---|
| 28 | andb ah, 0x0F ! Extract the family (5, 6, ...)
|
---|
| 29 | movzxb eax, ah
|
---|
| 30 | cmp eax, 15 ! 15: extended family
|
---|
| 31 | jne direct
|
---|
| 32 | mov eax, 6 ! Make it 686
|
---|
| 33 | direct:
|
---|
| 34 | imul eax, 100 ! 500, 600, ...
|
---|
| 35 | add eax, 86 ! 586, 686, ...
|
---|
| 36 | mov 7*4(esp), eax ! Pass eax through
|
---|
| 37 | popa
|
---|
| 38 | popf
|
---|
| 39 | gotprocessor:
|
---|
| 40 | leave
|
---|
| 41 | ret
|
---|
| 42 |
|
---|
| 43 | flip:
|
---|
| 44 | pushf ! Push eflags
|
---|
| 45 | pop eax ! eax = eflags
|
---|
| 46 | mov edx, eax ! Save original eflags
|
---|
| 47 | xor eax, ecx ! Flip the bit to test
|
---|
| 48 | push eax ! Push modified eflags value
|
---|
| 49 | popf ! Load modified eflags register
|
---|
| 50 | pushf
|
---|
| 51 | pop eax ! Get it again
|
---|
| 52 | push edx
|
---|
| 53 | popf ! Restore original eflags register
|
---|
| 54 | xor eax, edx ! See if the bit changed
|
---|
| 55 | test eax, ecx
|
---|
| 56 | ret
|
---|