This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 1/2] i386-cpuid: add support for identifying a processor


> From: Markus Metzger <markus.t.metzger@intel.com>
> Date: Thu, 13 Feb 2014 13:30:14 +0100
> 
> Add a struct i386_cpu to identify an x86 cpu and a function i386_this_cpu
> to identify the cpu we're running on.

This code really has no place in GDB.  The only reason this was
accepted in the linux-btrace.c is as a workaround for the fact that
Linux kernels advertised this feature on hardware where it was broken.
Moving this code in its own file and making it generally available
only encourages misuse.

> 2014-02-13  Markus Metzger  <markus.t.metzger@intel.com>
> 
> 	* common/i386-cpuid.h (i386_cpu_vendor, i386_cpu)
> 	(i386_this_cpu): New.
> 	* common/i386-cpuid.c (i386_this_cpu): New.
> 	* Makefile.in: (SFILES): Added i386-cpuid.c.
> 	(HFILES_NO_SRCDIR): Added i386-cpuid.h.
> 	(COMMON_OBS): Added i386-cpuid.o.
> 	(i386-cpuid.o): New target.
> 
> gdbserver/
> 	* Makefile.in: (SFILES): Added i386-cpuid.c.
> 	(OBS): Added i386-cpuid.o.
> 	(i386-cpuid.o): New target.
> 
> 
> ---
>  gdb/Makefile.in           |  9 ++++--
>  gdb/common/i386-cpuid.c   | 74 +++++++++++++++++++++++++++++++++++++++++++++++
>  gdb/common/i386-cpuid.h   | 33 +++++++++++++++++++++
>  gdb/gdbserver/Makefile.in |  9 ++++--
>  4 files changed, 121 insertions(+), 4 deletions(-)
>  create mode 100644 gdb/common/i386-cpuid.c
> 
> diff --git a/gdb/Makefile.in b/gdb/Makefile.in
> index ea56854..212cb93 100644
> --- a/gdb/Makefile.in
> +++ b/gdb/Makefile.in
> @@ -839,7 +839,8 @@ SFILES = ada-exp.y ada-lang.c ada-typeprint.c ada-valprint.c ada-tasks.c \
>  	common/gdb_vecs.c common/common-utils.c common/xml-utils.c \
>  	common/ptid.c common/buffer.c gdb-dlfcn.c common/agent.c \
>  	common/format.c common/filestuff.c btrace.c record-btrace.c ctf.c \
> -	target/waitstatus.c common/print-utils.c common/rsp-low.c
> +	target/waitstatus.c common/print-utils.c common/rsp-low.c \
> +	common/i386-cpuid.c
>  
>  LINTFILES = $(SFILES) $(YYFILES) $(CONFIG_SRCS) init.c
>  
> @@ -1021,7 +1022,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \
>  	gdb_vecs.o jit.o progspace.o skip.o probe.o \
>  	common-utils.o buffer.o ptid.o gdb-dlfcn.o common-agent.o \
>  	format.o registry.o btrace.o record-btrace.o waitstatus.o \
> -	print-utils.o rsp-low.o
> +	print-utils.o rsp-low.o i386-cpuid.o
>  
>  TSOBS = inflow.o
>  
> @@ -2150,6 +2151,10 @@ rsp-low.o: ${srcdir}/common/rsp-low.c
>  	$(COMPILE) $(srcdir)/common/rsp-low.c
>  	$(POSTCOMPILE)
>  
> +i386-cpuid.o: ${srcdir}/common/i386-cpuid.c
> +	$(COMPILE) $(srcdir)/common/i386-cpuid.c
> +	$(POSTCOMPILE)
> +
>  #
>  # gdb/target/ dependencies
>  #
> diff --git a/gdb/common/i386-cpuid.c b/gdb/common/i386-cpuid.c
> new file mode 100644
> index 0000000..7ac05d4
> --- /dev/null
> +++ b/gdb/common/i386-cpuid.c
> @@ -0,0 +1,74 @@
> +/*
> +   Copyright (C) 2014 Free Software Foundation, Inc.
> +
> +   This file is part of GDB.
> +
> +   This file is free software; you can redistribute it and/or modify it
> +   under the terms of the GNU General Public License as published by the
> +   Free Software Foundation; either version 3, or (at your option) any
> +   later version.
> +
> +   This program is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +   GNU General Public License for more details.
> +
> +   You should have received a copy of the GNU General Public License
> +   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
> +
> +#include "i386-cpuid.h"
> +
> +#if defined(__i386__) || defined(__x86_64__)
> +
> +/* See i386-cpuid.h.  */
> +
> +struct i386_cpu
> +i386_this_cpu (void)
> +{
> +  struct i386_cpu cpu;
> +  unsigned int eax, ebx, ecx, edx;
> +  int ok;
> +
> +  cpu.vendor = CV_UNKNOWN;
> +
> +  ok = i386_cpuid (0, &eax, &ebx, &ecx, &edx);
> +  if (ok != 0)
> +    {
> +      if (ebx == signature_INTEL_ebx && ecx == signature_INTEL_ecx
> +	  && edx == signature_INTEL_edx)
> +	{
> +	  unsigned int cpuid, ignore;
> +
> +	  ok = i386_cpuid (1, &cpuid, &ignore, &ignore, &ignore);
> +	  if (ok != 0)
> +	    {
> +	      cpu.vendor = CV_INTEL;
> +
> +	      cpu.family = (cpuid >> 8) & 0xf;
> +	      cpu.model = (cpuid >> 4) & 0xf;
> +	      cpu.stepping = cpuid & 0xf;
> +
> +	      if (cpu.family == 0x6)
> +		cpu.model += (cpuid >> 12) & 0xf0;
> +	    }
> +	}
> +    }
> +
> +  return cpu;
> +}
> +
> +#else /* i386 && x86_64 */
> +
> +/* See i386-cpuid.h.  */
> +
> +struct i386_cpu
> +i386_this_cpu (void)
> +{
> +  struct i386_cpu cpu;
> +
> +  cpu.vendor = CV_UNKNOWN;
> +
> +  return cpu;
> +}
> +
> +#endif /* i386 && x86_64 */
> diff --git a/gdb/common/i386-cpuid.h b/gdb/common/i386-cpuid.h
> index 9aea054..1ed0251 100644
> --- a/gdb/common/i386-cpuid.h
> +++ b/gdb/common/i386-cpuid.h
> @@ -22,6 +22,35 @@
>  /* Always include the header for the cpu bit defines.  */
>  #include "i386-gcc-cpuid.h"
>  
> +/* An enumeration of cpu vendors.  */
> +
> +enum i386_cpu_vendor
> +{
> +  /* We do not know this vendor.  */
> +  CV_UNKNOWN,
> +
> +  /* Intel.  */
> +  CV_INTEL
> +};
> +
> +/* A cpu identifier.  */
> +
> +struct i386_cpu
> +{
> +  /* The processor vendor.  */
> +  enum i386_cpu_vendor vendor;
> +
> +  /* The cpu family.  */
> +  unsigned short family;
> +
> +  /* The cpu model.  */
> +  unsigned char model;
> +
> +  /* The cpu stepping.  */
> +  unsigned char stepping;
> +};
> +
> +
>  #if defined(__i386__) || defined(__x86_64__)
>  
>  /* Return cpuid data for requested cpuid level, as found in returned
> @@ -60,4 +89,8 @@ i386_cpuid (unsigned int __level,
>  
>  #endif /* i386 && x86_64 */
>  
> +/* Identify the cpu we're running on.  */
> +
> +extern struct i386_cpu i386_this_cpu (void);
> +
>  #endif /* I386_CPUID_COMMON_H */
> diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
> index 5f69ddb..52d0248 100644
> --- a/gdb/gdbserver/Makefile.in
> +++ b/gdb/gdbserver/Makefile.in
> @@ -164,7 +164,7 @@ SFILES=	$(srcdir)/gdbreplay.c $(srcdir)/inferiors.c $(srcdir)/dll.c \
>  	$(srcdir)/common/buffer.c $(srcdir)/common/linux-btrace.c \
>  	$(srcdir)/common/filestuff.c $(srcdir)/target/waitstatus.c \
>  	$(srcdir)/common/mips-linux-watch.c $(srcdir)/common/print-utils.c \
> -	$(srcdir)/common/rsp-low.c
> +	$(srcdir)/common/rsp-low.c $(srcdir)/common/i386-cpuid.c
>  
>  DEPFILES = @GDBSERVER_DEPFILES@
>  
> @@ -177,7 +177,8 @@ OBS = agent.o ax.o inferiors.o regcache.o remote-utils.o server.o signals.o \
>        target.o waitstatus.o utils.o debug.o version.o vec.o gdb_vecs.o \
>        mem-break.o hostio.o event-loop.o tracepoint.o xml-utils.o \
>        common-utils.o ptid.o buffer.o format.o filestuff.o dll.o notif.o \
> -      tdesc.o print-utils.o rsp-low.o $(XML_BUILTIN) $(DEPFILES) $(LIBOBJS)
> +      tdesc.o print-utils.o rsp-low.o i386-cpuid.o $(XML_BUILTIN) $(DEPFILES) \
> +      $(LIBOBJS)
>  GDBREPLAY_OBS = gdbreplay.o version.o
>  GDBSERVER_LIBS = @GDBSERVER_LIBS@
>  XM_CLIBS = @LIBS@
> @@ -537,6 +538,10 @@ mips-linux-watch.o: ../common/mips-linux-watch.c
>  	$(COMPILE) $<
>  	$(POSTCOMPILE)
>  
> +i386-cpuid.o: ../common/i386-cpuid.c
> +	$(COMPILE) $<
> +	$(POSTCOMPILE)
> +
>  # Native object files rules from ../nat
>  
>  linux-waitpid.o: ../nat/linux-waitpid.c
> -- 
> 1.8.3.1
> 
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]