1 /**
2 * \file
3 * \brief CPU related functions
4 *
5 * \author Frank Mehnert <fm3@os.inf.tu-dresden.de> */
6
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
20 EXTERN_C_BEGIN
21
22 /**
23 * \defgroup l4util_cpu CPU related functions
24 * \ingroup l4util_api
25 */
26 /*@{*/
27
28 /**
29 * Check whether the CPU supports the "cpuid" instruction.
30 *
31 * \return 1 if it has, 0 if it has not
32 */
33 L4_INLINE int l4util_cpu_has_cpuid(void);
34
35 /**
36 * Returns the CPU capabilities if the "cpuid" instruction is available.
37 *
38 * \return CPU capabilities if the "cpuid" instruction is available,
39 * 0 if the "cpuid" instruction is not supported.
40 */
41 L4_INLINE unsigned int l4util_cpu_capabilities(void);
42
43 /**
44 * Returns the CPU capabilities.
45 *
46 * \return CPU capabilities.
47 */
48 L4_INLINE unsigned int l4util_cpu_capabilities_nocheck(void);
49
50 /**
51 * Generic CPUID access function.
52 */
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
58 /*@}*/
59 static inline void
l4util_cpu_pause(void)60 l4util_cpu_pause(void)
61 {
62 __asm__ __volatile__ ("rep; nop");
63 }
64
65 L4_INLINE int
l4util_cpu_has_cpuid(void)66 l4util_cpu_has_cpuid(void)
67 {
68 return 1;
69 }
70
71 L4_INLINE void
l4util_cpu_cpuid(unsigned long mode,unsigned long * eax,unsigned long * ebx,unsigned long * ecx,unsigned long * edx)72 l4util_cpu_cpuid(unsigned long mode,
73 unsigned long *eax, unsigned long *ebx,
74 unsigned long *ecx, unsigned long *edx)
75 {
76 asm volatile("cpuid"
77 : "=a" (*eax),
78 "=b" (*ebx),
79 "=c" (*ecx),
80 "=d" (*edx)
81 : "a" (mode)
82 );
83 }
84
85 L4_INLINE unsigned int
l4util_cpu_capabilities_nocheck(void)86 l4util_cpu_capabilities_nocheck(void)
87 {
88 unsigned long dummy, capability;
89
90 /* get CPU capabilities */
91 l4util_cpu_cpuid(1, &dummy, &dummy, &dummy, &capability);
92
93 return capability;
94 }
95
96 L4_INLINE unsigned int
l4util_cpu_capabilities(void)97 l4util_cpu_capabilities(void)
98 {
99 if (!l4util_cpu_has_cpuid())
100 return 0; /* CPU has not cpuid instruction */
101
102 return l4util_cpu_capabilities_nocheck();
103 }
104
105 EXTERN_C_END
106
107 #endif
108
109