L4Re - L4 Runtime Environment
cpu.h
Go to the documentation of this file.
1 
7 /*
8  * (c) 2004-2009 Author(s)
9  * economic rights: Technische Universit├Ąt Dresden (Germany)
10  * This file is part of TUD:OS and distributed under the terms of the
11  * GNU Lesser General Public License 2.1.
12  * Please see the COPYING-LGPL-2.1 file for details.
13  */
14 
15 #ifndef __L4_UTIL_CPU_H
16 #define __L4_UTIL_CPU_H
17 
18 #include <l4/sys/compiler.h>
19 
21 
27 
33 L4_INLINE int l4util_cpu_has_cpuid(void);
34 
41 L4_INLINE unsigned int l4util_cpu_capabilities(void);
42 
48 L4_INLINE unsigned int l4util_cpu_capabilities_nocheck(void);
49 
53 L4_INLINE void
54 l4util_cpu_cpuid(unsigned long mode,
55  unsigned long *eax, unsigned long *ebx,
56  unsigned long *ecx, unsigned long *edx);
57 
59 static inline void
60 l4util_cpu_pause(void)
61 {
62  __asm__ __volatile__ ("rep; nop");
63 }
64 
65 L4_INLINE int
67 {
68  unsigned long eax;
69 
70  asm volatile("pushl %%ebx \t\n"
71  "pushfl \t\n"
72  "popl %%eax \t\n" /* get eflags */
73  "movl %%eax, %%ebx \t\n" /* save it */
74  "xorl $0x200000, %%eax \t\n" /* toggle ID bit */
75  "pushl %%eax \t\n"
76  "popfl \t\n" /* set again */
77  "pushfl \t\n"
78  "popl %%eax \t\n" /* get it again */
79  "xorl %%ebx, %%eax \t\n"
80  "pushl %%ebx \t\n"
81  "popfl \t\n" /* restore saved flags */
82  "popl %%ebx \t\n"
83  : "=a" (eax)
84  : /* no input */
85  );
86 
87  return eax & 0x200000;
88 }
89 
90 L4_INLINE void
91 l4util_cpu_cpuid(unsigned long mode,
92  unsigned long *eax, unsigned long *ebx,
93  unsigned long *ecx, unsigned long *edx)
94 {
95  asm volatile("pushl %%ebx \t\n"
96  "cpuid \t\n"
97  "mov %%ebx, %%esi \t\n"
98  "popl %%ebx \t\n"
99  : "=a" (*eax),
100  "=S" (*ebx),
101  "=c" (*ecx),
102  "=d" (*edx)
103  : "a" (mode));
104 }
105 
106 L4_INLINE unsigned int
108 {
109  unsigned long dummy, capability;
110 
111  /* get CPU capabilities */
112  l4util_cpu_cpuid(1, &dummy, &dummy, &dummy, &capability);
113 
114  return capability;
115 }
116 
117 L4_INLINE unsigned int
119 {
120  if (!l4util_cpu_has_cpuid())
121  return 0; /* CPU has not cpuid instruction */
122 
124 }
125 
127 
128 #endif
129 
void l4util_cpu_cpuid(unsigned long mode, unsigned long *eax, unsigned long *ebx, unsigned long *ecx, unsigned long *edx)
Generic CPUID access function.
Definition: cpu.h:72
#define EXTERN_C_END
End section with C types and functions.
Definition: compiler.h:187
unsigned int l4util_cpu_capabilities(void)
Returns the CPU capabilities if the "cpuid" instruction is available.
Definition: cpu.h:97
L4 compiler related defines.
#define EXTERN_C_BEGIN
Start section with C types and functions.
Definition: compiler.h:186
unsigned int l4util_cpu_capabilities_nocheck(void)
Returns the CPU capabilities.
Definition: cpu.h:86
int l4util_cpu_has_cpuid(void)
Check whether the CPU supports the "cpuid" instruction.
Definition: cpu.h:66