[v6,04/15] nat/x86-cpuid.h: Add x86_cpuid_count wrapper around __get_cpuid_count.

Message ID 20230714155151.21723-5-jhb@FreeBSD.org
State New
Headers
Series Handle variable XSAVE layouts |

Commit Message

John Baldwin July 14, 2023, 3:51 p.m. UTC
  ---
 gdb/nat/x86-cpuid.h | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)
  

Comments

Simon Marchi July 26, 2023, 7:41 p.m. UTC | #1
On 7/14/23 11:51, John Baldwin wrote:
> ---
>  gdb/nat/x86-cpuid.h | 32 ++++++++++++++++++++++++++++++++
>  1 file changed, 32 insertions(+)
> 
> diff --git a/gdb/nat/x86-cpuid.h b/gdb/nat/x86-cpuid.h
> index 0955afba577..517113d45e8 100644
> --- a/gdb/nat/x86-cpuid.h
> +++ b/gdb/nat/x86-cpuid.h
> @@ -48,6 +48,30 @@ x86_cpuid (unsigned int __level,
>    return __get_cpuid (__level, __eax, __ebx, __ecx, __edx);
>  }
>  
> +/* Return cpuid data for requested cpuid level and sub-level, as found
> +   in returned eax, ebx, ecx and edx registers.  The function checks
> +   if cpuid is supported and returns 1 for valid cpuid information or
> +   0 for unsupported cpuid level.  Pointers may be non-null.  */
> +
> +static __inline int
> +x86_cpuid_count (unsigned int __level, unsigned int __sublevel,
> +		 unsigned int *__eax, unsigned int *__ebx,
> +		 unsigned int *__ecx, unsigned int *__edx)
> +{
> +  unsigned int __scratch;
> +
> +  if (__eax == nullptr)
> +    __eax = &__scratch;
> +  if (__ebx == nullptr)
> +    __ebx = &__scratch;
> +  if (__ecx == nullptr)
> +    __ecx = &__scratch;
> +  if (__edx == nullptr)
> +    __edx = &__scratch;
> +
> +  return __get_cpuid_count (__level, __sublevel, __eax, __ebx, __ecx, __edx);
> +}
> +
>  #else
>  
>  static __inline int
> @@ -58,6 +82,14 @@ x86_cpuid (unsigned int __level,
>    return 0;
>  }
>  
> +static __inline int
> +x86_cpuid_count (unsigned int __level, unsigned int __sublevel,
> +		 unsigned int *__eax, unsigned int *__ebx,
> +		 unsigned int *__ecx, unsigned int *__edx)
> +{
> +  return 0;
> +}
> +
>  #endif /* i386 && x86_64 */
>  
>  #endif /* NAT_X86_CPUID_H */
> -- 
> 2.40.0
> 

Approved-By: Simon Marchi <simon.marchi@efficios.com>

Simon
  

Patch

diff --git a/gdb/nat/x86-cpuid.h b/gdb/nat/x86-cpuid.h
index 0955afba577..517113d45e8 100644
--- a/gdb/nat/x86-cpuid.h
+++ b/gdb/nat/x86-cpuid.h
@@ -48,6 +48,30 @@  x86_cpuid (unsigned int __level,
   return __get_cpuid (__level, __eax, __ebx, __ecx, __edx);
 }
 
+/* Return cpuid data for requested cpuid level and sub-level, as found
+   in returned eax, ebx, ecx and edx registers.  The function checks
+   if cpuid is supported and returns 1 for valid cpuid information or
+   0 for unsupported cpuid level.  Pointers may be non-null.  */
+
+static __inline int
+x86_cpuid_count (unsigned int __level, unsigned int __sublevel,
+		 unsigned int *__eax, unsigned int *__ebx,
+		 unsigned int *__ecx, unsigned int *__edx)
+{
+  unsigned int __scratch;
+
+  if (__eax == nullptr)
+    __eax = &__scratch;
+  if (__ebx == nullptr)
+    __ebx = &__scratch;
+  if (__ecx == nullptr)
+    __ecx = &__scratch;
+  if (__edx == nullptr)
+    __edx = &__scratch;
+
+  return __get_cpuid_count (__level, __sublevel, __eax, __ebx, __ecx, __edx);
+}
+
 #else
 
 static __inline int
@@ -58,6 +82,14 @@  x86_cpuid (unsigned int __level,
   return 0;
 }
 
+static __inline int
+x86_cpuid_count (unsigned int __level, unsigned int __sublevel,
+		 unsigned int *__eax, unsigned int *__ebx,
+		 unsigned int *__ecx, unsigned int *__edx)
+{
+  return 0;
+}
+
 #endif /* i386 && x86_64 */
 
 #endif /* NAT_X86_CPUID_H */