remove libcompat_minix as library
[minix3.git] / minix / lib / libminlib / i386 / getprocessor.S
blobf1daeba07dbcce3eb384d7ffb596ad678188a964
1 /*      getprocessor() - determine processor type       Author: Kees J. Bot */
2 /*                                                              26 Jan 1994 */
3 #include <machine/asm.h>
5 /* int getprocessor(void); */
6 /*      Return 386, 486, 586, ... */
7 ENTRY(getprocessor)
8         push    %ebp
9         movl    %esp, %ebp
10         andl    $0xFFFFFFFC, %esp       /* Align stack to avoid AC fault */
11         movl    $0x00040000, %ecx       /* Try to flip the AC bit introduced on the 486 */
12         call    flip
13         movl    $386, %eax      /* 386 if it didn't react to "flipping" */
14         je      gotprocessor
15         movl    $0x00200000, %ecx       /* Try to flip the ID bit introduced on the 586 */
16         call    flip
17         movl    $486, %eax      /* 486 if it didn't react */
18         je      gotprocessor
19         pushf
20         pusha   /* Save the world */
21         movl    $1, %eax
22 .byte   0x0F, 0xA2      /* CPUID instruction tells the processor type */
23         andb    $0x0F, %ah      /* Extract the family (5, 6, ...) */
24         movzbl  %ah, %eax
25         cmpl    $15, %eax       /* 15: extended family */
26         jne     direct
27         movl    $6, %eax        /* Make it 686 */
28 direct:
29         imull   $100, %eax      /* 500, 600, ... */
30         addl    $86, %eax       /* 586, 686, ... */
31         movl    %eax, 7*4(%esp) /* Pass eax through */
32         popa
33         popf
34 gotprocessor:
35         leave
36         ret
38 flip:
39         pushf   /* Push eflags */
40         pop     %eax    /* eax = eflags */
41         movl    %eax, %edx      /* Save original eflags */
42         xorl    %ecx, %eax      /* Flip the bit to test */
43         push    %eax    /* Push modified eflags value */
44         popf    /* Load modified eflags register */
45         pushf
46         pop     %eax    /* Get it again */
47         push    %edx
48         popf    /* Restore original eflags register */
49         xorl    %edx, %eax      /* See if the bit changed */
50         testl   %ecx, %eax
51         ret