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

* Re: [RFC/RFT] Use core regset iterators on GNU Hurd
  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
  0 siblings, 1 reply; 3+ messages in thread
From: Samuel Thibault @ 2014-11-30 21:57 UTC (permalink / raw)
  To: Ulrich Weigand; +Cc: gdb-patches, ams

Hello,

Ulrich Weigand, le Fri 28 Nov 2014 16:47:44 +0100, a écrit :
> The patch is untested so far since I don't have access to a Hurd system.
> Testing by Hurd maintainers would be much appreciated.

Yes, it does work, thanks.

At first I was wondering why not using the REG_EAX etc. macros instead
of hardcoding values, and then realized one of the goal is
cross-portability :)

Samuel

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

* Re: [RFC/RFT] Use core regset iterators on GNU Hurd
  2014-11-30 21:57 ` Samuel Thibault
@ 2014-12-01 12:47   ` Ulrich Weigand
  0 siblings, 0 replies; 3+ messages in thread
From: Ulrich Weigand @ 2014-12-01 12:47 UTC (permalink / raw)
  To: Samuel Thibault; +Cc: gdb-patches, ams

Samuel Thibault wrote:
> Ulrich Weigand, le Fri 28 Nov 2014 16:47:44 +0100, a écrit :
> > The patch is untested so far since I don't have access to a Hurd system.
> > Testing by Hurd maintainers would be much appreciated.
> 
> Yes, it does work, thanks.

Excellent!  Thanks for verifying.  I've now checked the patch in.

> At first I was wondering why not using the REG_EAX etc. macros instead
> of hardcoding values, and then realized one of the goal is
> cross-portability :)

Exactly, that's the goal :-)

Bye,
Ulrich

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