This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
RE: [PATCH 1/2] i386-cpuid: add support for identifying a processor
- From: "Metzger, Markus T" <markus dot t dot metzger at intel dot com>
- To: Mark Kettenis <mark dot kettenis at xs4all dot nl>
- Cc: "jan dot kratochvil at redhat dot com" <jan dot kratochvil at redhat dot com>, "gdb-patches at sourceware dot org" <gdb-patches at sourceware dot org>
- Date: Thu, 13 Feb 2014 13:34:34 +0000
- Subject: RE: [PATCH 1/2] i386-cpuid: add support for identifying a processor
- Authentication-results: sourceware.org; auth=none
- References: <1392294615-16416-1-git-send-email-markus dot t dot metzger at intel dot com> <201402131329 dot s1DDTOV8031860 at glazunov dot sibelius dot xs4all dot nl>
> -----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