[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