Subversion Repositories HelenOS-historic

Rev

Rev 348 | Rev 501 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 348 Rev 408
Line 36... Line 36...
36
    __u32 cpuid_ebx;
36
    __u32 cpuid_ebx;
37
    __u32 cpuid_ecx;
37
    __u32 cpuid_ecx;
38
    __u32 cpuid_edx;
38
    __u32 cpuid_edx;
39
} __attribute__ ((packed));
39
} __attribute__ ((packed));
40
 
40
 
41
extern int has_cpuid(void);
41
static inline __u32 has_cpuid(void)
-
 
42
{
-
 
43
    __u32 val, ret;
-
 
44
   
-
 
45
    __asm__ volatile (
-
 
46
        "pushf\n"               /* read flags */
-
 
47
        "popl %0\n"
-
 
48
        "movl %0, %1\n"
-
 
49
       
-
 
50
        "btcl $21, %1\n"        /* swap the ID bit */
-
 
51
       
-
 
52
        "pushl %1\n"            /* propagate the change into flags */
-
 
53
        "popf\n"
-
 
54
        "pushf\n"
-
 
55
        "popl %1\n"
-
 
56
       
-
 
57
        "andl $(1 << 21), %0\n" /* interrested only in ID bit */
-
 
58
        "andl $(1 << 21), %1\n"
-
 
59
        "xorl %1, %0\n"
-
 
60
        : "=r" (ret), "=r" (val)
-
 
61
    );
-
 
62
   
-
 
63
    return ret;
-
 
64
}
42
 
65
 
43
static inline void cpuid(__u32 cmd, struct cpu_info *info)
66
static inline void cpuid(__u32 cmd, struct cpu_info *info)
44
{
67
{
45
        __asm__ volatile (
68
    __asm__ volatile (
46
                "movl %4, %%eax\n"
69
        "movl %4, %%eax\n"
47
                "cpuid\n"
70
        "cpuid\n"
-
 
71
       
48
                "movl %%eax,%0\n"
72
        "movl %%eax, %0\n"
49
                "movl %%ebx,%1\n"
73
        "movl %%ebx, %1\n"
50
                "movl %%ecx,%2\n"
74
        "movl %%ecx, %2\n"
51
                "movl %%edx,%3\n"
75
        "movl %%edx, %3\n"
52
                : "=m" (info->cpuid_eax), "=m" (info->cpuid_ebx), "=m" (info->cpuid_ecx), "=m" (info->cpuid_edx)
76
        : "=m" (info->cpuid_eax), "=m" (info->cpuid_ebx), "=m" (info->cpuid_ecx), "=m" (info->cpuid_edx)
53
                : "m" (cmd)
77
        : "m" (cmd)
54
                : "eax", "ebx", "ecx", "edx"
78
        : "eax", "ebx", "ecx", "edx"
55
        );
79
    );
56
}
80
}
57
 
81
 
58
#endif
82
#endif