syslinux-3.08-2 sources from FC4
[bootcd.git] / syslinux / com32 / include / sys / cpu.h
1 #ifndef _CPU_H
2 #define _CPU_H
3
4 #include <inttypes.h>
5
6 static inline uint64_t rdtsc(void)
7 {
8   uint64_t v;
9   asm volatile("rdtsc" : "=A" (v));
10   return v;
11 }
12
13 static inline uint32_t rdtscl(void)
14 {
15   uint32_t v;
16   asm volatile("rdtsc" : "=a" (v) : : "edx");
17   return v;
18 }
19
20 static inline uint32_t cpuid_eax(uint32_t level)
21 {
22   uint32_t v;
23
24   asm("cpuid" : "=a" (v) : "a" (level) : "ebx", "ecx", "edx");
25   return v;
26 }
27 static inline uint32_t cpuid_ebx(uint32_t level)
28 {
29   uint32_t v;
30
31   asm("cpuid" : "=b" (v),  "+a" (level) : : "ecx", "edx");
32   return v;
33 }
34 static inline uint32_t cpuid_ecx(uint32_t level)
35 {
36   uint32_t v;
37
38   asm("cpuid" : "=c" (v), "+a" (level) : : "ebx", "edx");
39   return v;
40 }
41 static inline uint32_t cpuid_edx(uint32_t level)
42 {
43   uint32_t v;
44
45   asm("cpuid" : "=d" (v), "+a" (level) : : "ebx", "ecx");
46   return v;
47 }
48
49 static inline uint64_t rdmsr(uint32_t msr)
50 {
51   uint64_t v;
52   
53   asm volatile("rdmsr" : "=A" (v) : "c" (msr));
54   return v;
55 }
56 static inline void wrmsr(uint64_t v, uint32_t msr)
57 {
58   asm volatile("wrmsr" : : "A" (v), "c" (msr));
59 }
60
61 static inline void cpu_relax(void)
62 {
63   asm volatile("rep ; nop");
64 }
65
66 /* These are local cli/sti; not SMP-safe!!! */
67
68 static inline void cli(void)
69 {
70   asm volatile("cli");
71 }
72
73 static inline void sti(void)
74 {
75   asm volatile("sti");
76 }
77
78 #endif