xref: /netbsd-src/external/gpl3/gdb/dist/gdb/nat/x86-cpuid.h (revision 3c1fc90558e617ed004b24a1348e6b0fa6e739e3)
1 /* C API for x86 cpuid insn.
2    Copyright (C) 2007-2024 Free Software Foundation, Inc.
3 
4    This file is part of GDB.
5 
6    This file is free software; you can redistribute it and/or modify it
7    under the terms of the GNU General Public License as published by the
8    Free Software Foundation; either version 3, or (at your option) any
9    later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18 
19 #ifndef NAT_X86_CPUID_H
20 #define NAT_X86_CPUID_H
21 
22 /* Always include the header for the cpu bit defines.  */
23 #include "x86-gcc-cpuid.h"
24 
25 #ifndef __cplusplus
26 /* This header file is also used in C code for some test-cases, so define
27    nullptr in C terms to avoid a compilation error.  */
28 #define nullptr ((void *) 0)
29 #endif
30 
31 /* Return cpuid data for requested cpuid level, as found in returned
32    eax, ebx, ecx and edx registers.  The function checks if cpuid is
33    supported and returns 1 for valid cpuid information or 0 for
34    unsupported cpuid level.  Pointers may be non-null.  */
35 
36 static __inline int
37 x86_cpuid (unsigned int __level,
38 	    unsigned int *__eax, unsigned int *__ebx,
39 	    unsigned int *__ecx, unsigned int *__edx)
40 {
41   unsigned int __scratch;
42 
43   if (!__eax)
44     __eax = &__scratch;
45   if (!__ebx)
46     __ebx = &__scratch;
47   if (!__ecx)
48     __ecx = &__scratch;
49   if (!__edx)
50     __edx = &__scratch;
51 
52   return __get_cpuid (__level, __eax, __ebx, __ecx, __edx);
53 }
54 
55 /* Return cpuid data for requested cpuid level and sub-level, as found
56    in returned eax, ebx, ecx and edx registers.  The function checks
57    if cpuid is supported and returns 1 for valid cpuid information or
58    0 for unsupported cpuid level.  Pointers may be non-null.  */
59 
60 static __inline int
61 x86_cpuid_count (unsigned int __level, unsigned int __sublevel,
62 		 unsigned int *__eax, unsigned int *__ebx,
63 		 unsigned int *__ecx, unsigned int *__edx)
64 {
65   unsigned int __scratch;
66 
67   if (__eax == nullptr)
68     __eax = &__scratch;
69   if (__ebx == nullptr)
70     __ebx = &__scratch;
71   if (__ecx == nullptr)
72     __ecx = &__scratch;
73   if (__edx == nullptr)
74     __edx = &__scratch;
75 
76   return __get_cpuid_count (__level, __sublevel, __eax, __ebx, __ecx, __edx);
77 }
78 
79 #ifndef __cplusplus
80 /* Avoid leaking this local definition beyond the scope of this header
81    file.  */
82 #undef nullptr
83 #endif
84 
85 #endif /* NAT_X86_CPUID_H */
86