[PATCH 1/2] i386-cpuid: add support for identifying a processor
Markus Metzger
markus.t.metzger@intel.com
Thu Feb 13 12:30:00 GMT 2014
Add a struct i386_cpu to identify an x86 cpu and a function i386_this_cpu
to identify the cpu we're running on.
CC: Mark Kettenis <mark.kettenis@xs4all.nl>
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
More information about the Gdb-patches
mailing list