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


> -----Original Message-----
> From: gdb-patches-owner@sourceware.org [mailto:gdb-patches-
> owner@sourceware.org] On Behalf Of Mark Kettenis
> Sent: Thursday, February 13, 2014 2:29 PM


> > 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.

I need this for btrace so I thought I'd make it available to others, too.
I'm OK to leave it in the btrace area.  I'll send another patch.

Thanks,
Markus.



> > 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
> >
> >
Intel GmbH
Dornacher Strasse 1
85622 Feldkirchen/Muenchen, Deutschland
Sitz der Gesellschaft: Feldkirchen bei Muenchen
Geschaeftsfuehrer: Christian Lamprechter, Hannes Schwaderer, Douglas Lusk
Registergericht: Muenchen HRB 47456
Ust.-IdNr./VAT Registration No.: DE129385895
Citibank Frankfurt a.M. (BLZ 502 109 00) 600119052


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