public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [RFC/RFT] Use core regset iterators on GNU Hurd
@ 2014-11-28 15:47 Ulrich Weigand
  2014-11-30 21:57 ` Samuel Thibault
  0 siblings, 1 reply; 3+ messages in thread
From: Ulrich Weigand @ 2014-11-28 15:47 UTC (permalink / raw)
  To: gdb-patches; +Cc: ams, samuel.thibault

Hello,

GNU Hurd is one of the few remaining targets that still does not use the
new-style iterate_over_regset_sections core file logic (allowing cross-
debugging of core files and core file generation).

Fortunately, it should be straightforward to enable to generic i386 logic
here by simply providing an appropriate register map.  I've extracted the
necessary offsets from glibc headers for the Hurd.

The patch is untested so far since I don't have access to a Hurd system.
Testing by Hurd maintainers would be much appreciated.

Bye,
Ulrich


ChangeLog:

	* config/i386/i386gnu.mh (NATDEPFILES): Remove core-regset.o.
	* i386gnu-nat.c: Do not include <sys/procfs.h> or "gregset.h".
	(CREG_OFFSET, creg_offset, CREG_ADDR): Remove.
	(supply_gregset, supply_fpregset): Remove.
	* i386gnu-tdep.c (i386gnu_gregset_reg_offset): New variable.
	(i386gnu_init_abi): Set tdep->gregset_reg_offset, gregset_num_regs,
	and sizeof_gregset.

Index: binutils-gdb/gdb/config/i386/i386gnu.mh
===================================================================
--- binutils-gdb.orig/gdb/config/i386/i386gnu.mh	2014-11-11 16:31:24.724883719 +0100
+++ binutils-gdb/gdb/config/i386/i386gnu.mh	2014-11-28 15:18:34.856204985 +0100
@@ -1,6 +1,6 @@
 # Host: Intel 386 running the GNU Hurd
 NATDEPFILES= i386gnu-nat.o gnu-nat.o \
-	     x86-nat.o x86-dregs.o core-regset.o fork-child.o \
+	     x86-nat.o x86-dregs.o fork-child.o \
 	     notify_S.o process_reply_S.o msg_reply_S.o \
 	     msg_U.o exc_request_U.o exc_request_S.o
 HAVE_NATIVE_GCORE_HOST = 1
Index: binutils-gdb/gdb/i386gnu-nat.c
===================================================================
--- binutils-gdb.orig/gdb/i386gnu-nat.c	2014-11-11 16:31:26.540893961 +0100
+++ binutils-gdb/gdb/i386gnu-nat.c	2014-11-28 15:18:34.865205046 +0100
@@ -34,11 +34,6 @@
 #include "inf-child.h"
 #include "i387-tdep.h"
 
-#ifdef HAVE_SYS_PROCFS_H
-# include <sys/procfs.h>
-# include "gregset.h"
-#endif
-
 /* Offset to the thread_state_t location where REG is stored.  */
 #define REG_OFFSET(reg) offsetof (struct i386_thread_state, reg)
 
@@ -52,21 +47,7 @@ static int reg_offset[] =
   REG_OFFSET (ds), REG_OFFSET (es), REG_OFFSET (fs), REG_OFFSET (gs)
 };
 
-/* Offset to the greg_t location where REG is stored.  */
-#define CREG_OFFSET(reg) (REG_##reg * 4)
-
-/* At CREG_OFFSET[N] is the offset to the greg_t location where
-   the GDB register N is stored.  */
-static int creg_offset[] =
-{
-  CREG_OFFSET (EAX), CREG_OFFSET (ECX), CREG_OFFSET (EDX), CREG_OFFSET (EBX),
-  CREG_OFFSET (UESP), CREG_OFFSET (EBP), CREG_OFFSET (ESI), CREG_OFFSET (EDI),
-  CREG_OFFSET (EIP), CREG_OFFSET (EFL), CREG_OFFSET (CS), CREG_OFFSET (SS),
-  CREG_OFFSET (DS), CREG_OFFSET (ES), CREG_OFFSET (FS), CREG_OFFSET (GS)
-};
-
 #define REG_ADDR(state, regnum) ((char *)(state) + reg_offset[regnum])
-#define CREG_ADDR(state, regnum) ((const char *)(state) + creg_offset[regnum])
 
 \f
 /* Get the whole floating-point state of THREAD and record the values
@@ -100,24 +81,6 @@ fetch_fpregs (struct regcache *regcache,
     }
 }
 
-#ifdef HAVE_SYS_PROCFS_H
-/* These two calls are used by the core-regset.c code for
-   reading ELF core files.  */
-void
-supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregs)
-{
-  int i;
-  for (i = 0; i < I386_NUM_GREGS; i++)
-    regcache_raw_supply (regcache, i, CREG_ADDR (gregs, i));
-}
-
-void
-supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregs)
-{
-  i387_supply_fsave (regcache, -1, fpregs);
-}
-#endif
-
 /* Fetch register REGNO, or all regs if REGNO is -1.  */
 static void
 gnu_fetch_registers (struct target_ops *ops,
Index: binutils-gdb/gdb/i386gnu-tdep.c
===================================================================
--- binutils-gdb.orig/gdb/i386gnu-tdep.c	2014-11-11 16:31:26.543893979 +0100
+++ binutils-gdb/gdb/i386gnu-tdep.c	2014-11-28 15:18:34.869205072 +0100
@@ -22,6 +22,27 @@
 
 #include "i386-tdep.h"
 
+/* From <sys/ucontext.h>.  */
+static int i386gnu_gregset_reg_offset[] =
+{
+  11 * 4,		/* %eax */
+  10 * 4,		/* %ecx */
+  9 * 4,		/* %edx */
+  8 * 4,		/* %ebx */
+  17 * 4,		/* %uesp */
+  6 * 4,		/* %ebp */
+  5 * 4,		/* %esi */
+  4 * 4,		/* %edi */
+  14 * 4,		/* %eip */
+  16 * 4,		/* %efl */
+  15 * 4,		/* %cs */
+  18 * 4,		/* %ss */
+  3 * 4,		/* %ds */
+  2 * 4,		/* %es */
+  1 * 4,		/* %fs */
+  0 * 4,		/* %gs */
+};
+
 static void
 i386gnu_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
@@ -33,6 +54,10 @@ i386gnu_init_abi (struct gdbarch_info in
   set_solib_svr4_fetch_link_map_offsets
     (gdbarch, svr4_ilp32_fetch_link_map_offsets);
 
+  tdep->gregset_reg_offset = i386gnu_gregset_reg_offset;
+  tdep->gregset_num_regs = ARRAY_SIZE (i386gnu_gregset_reg_offset);
+  tdep->sizeof_gregset = 19 * 4;
+
   tdep->jb_pc_offset = 20;	/* From <bits/setjmp.h>.  */
 }
 
-- 
  Dr. Ulrich Weigand
  GNU/Linux compilers and toolchain
  Ulrich.Weigand@de.ibm.com

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-12-01 12:47 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-11-28 15:47 [RFC/RFT] Use core regset iterators on GNU Hurd Ulrich Weigand
2014-11-30 21:57 ` Samuel Thibault
2014-12-01 12:47   ` Ulrich Weigand

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).