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 |