| [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 | 
|---|