Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: "M.M. Kettenis" <m.m.kettenis@alumnus.utwente.nl>
To: Kris Warkentin <kewarken@qnx.com>
Cc: gdb-patches@sources.redhat.com
Subject: Re: [patch] remove deprecated core support from QNX NTO
Date: Thu, 23 Dec 2004 16:28:00 -0000	[thread overview]
Message-ID: <73193856100971104@weblx058.utsp.utwente.nl> (raw)
In-Reply-To: <41CA34EF.6040401@qnx.com>

[-- Attachment #1: Message body --]
[-- Type: text/plain, Size: 783 bytes --]

Kris Warkentin <kewarken@qnx.com> wrote:

> > Any reason why you can't use the generic register support in
> > i386-tdep.c?
>
> Actually, I take advantage of the i387 generics for the floating point
> regs since our kernel just uses the opcode to push them in the normal
> order.  Unfortunately though, our gpregs are in a different order and
> not all of them are there so we have some unique mappings.

QNX NTO is in no way special about this.  I was thinking about something like the attached patch.  Could you test that one?  This approach simply reduces the amount of code needed.

The patch also contains a unrelated change to the shared library code.  It also removes a unneeded function.  But it'd be nice if you could test that I didn't mess things up.

Mark

[-- Attachment #2: patch --]
[-- Type: application/octet-stream, Size: 5663 bytes --]

Index: i386-nto-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-nto-tdep.c,v
retrieving revision 1.16
diff -u -p -u -p -r1.16 i386-nto-tdep.c
--- i386-nto-tdep.c	10 Dec 2004 13:38:23 -0000	1.16
+++ i386-nto-tdep.c	23 Dec 2004 15:24:42 -0000
@@ -21,17 +21,22 @@
    Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include "gdb_string.h"
-#include "gdb_assert.h"
 #include "defs.h"
 #include "frame.h"
-#include "target.h"
+#include "osabi.h"
 #include "regcache.h"
-#include "solib-svr4.h"
+#include "target.h"
+
+#include "gdb_string.h"
+#include "gdb_assert.h"
+
 #include "i386-tdep.h"
-#include "nto-tdep.h"
-#include "osabi.h"
 #include "i387-tdep.h"
+#include "nto-tdep.h"
+#include "solib-svr4.h"
+
+/* FIXME: Comment.  */
+static struct nto_target_ops i386_nto_target;
 
 #ifndef X86_CPU_FXSR
 #define X86_CPU_FXSR (1L << 12)
@@ -42,47 +47,47 @@
    that is just filler.  Don't ask me, ask the kernel guys.  */
 #define NUM_GPREGS 13
 
-/* Map a GDB register number to an offset in the reg structure.  */
-static int regmap[] = {
-  (7 * 4),			/* eax */
-  (6 * 4),			/* ecx */
-  (5 * 4),			/* edx */
-  (4 * 4),			/* ebx */
-  (11 * 4),			/* esp */
-  (2 * 4),			/* epb */
-  (1 * 4),			/* esi */
-  (0 * 4),			/* edi */
-  (8 * 4),			/* eip */
-  (10 * 4),			/* eflags */
-  (9 * 4),			/* cs */
-  (12 * 4),			/* ss */
-  (-1 * 4)			/* filler */
+/* Mapping between the general-purpose registers in `struct xxx'
+   format and GDB's register cache layout.  */
+
+/* From <x86/context.h>.  */
+static int i386nto_gregset_reg_offset[] =
+{
+  7 * 4,			/* %eax */
+  6 * 4,			/* %ecx */
+  5 * 4,			/* %edx */
+  4 * 4,			/* %ebx */
+  11 * 4,			/* %esp */
+  2 * 4,			/* %epb */
+  1 * 4,			/* %esi */
+  0 * 4,			/* %edi */
+  8 * 4,			/* %eip */
+  10 * 4,			/* %eflags */
+  9 * 4,			/* %cs */
+  12 * 4,			/* %ss */
+  -1				/* filler */
 };
 
-static struct nto_target_ops i386_nto_target;
+/* Given a GDB register number REGNUM, return the offset into
+   Neutrino's register structure or -1 if the register is unknown.  */
 
-/* Given a gdb regno, return the offset into Neutrino's register structure
-   or -1 if register is unknown.  */
 static int
-nto_reg_offset (int regno)
+nto_reg_offset (int regnum)
 {
-  return (regno >= 0 && regno < NUM_GPREGS) ? regmap[regno] : -1;
+  if (regnum >= 0 && regnum < ARRAY_SIZE (i386nto_gregset_reg_offset))
+    i386nto_gregset_reg_offset[regnum];
+
+  return -1;
 }
 
 static void
 i386nto_supply_gregset (char *gpregs)
 {
-  unsigned regno;
-  int empty = 0;
+  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+  struct regset *gregset = tdep->gregset;
 
-  for (regno = 0; regno < I386_NUM_GREGS; regno++)
-    {
-      int offset = nto_reg_offset (regno);
-      if (offset == -1)
-	regcache_raw_supply (current_regcache, regno, (char *) &empty);
-      else
-	regcache_raw_supply (current_regcache, regno, gpregs + offset);
-    }
+  gdb_assert (tdep->gregset_reg_offset == i386nto_gregset_reg_offset);
+  i386_supply_gregset (gregset, current_regcache, -1, gpregs, NUM_GPREGS * 4);
 }
 
 static void
@@ -99,7 +104,7 @@ i386nto_supply_regset (int regset, char 
 {
   switch (regset)
     {
-    case NTO_REG_GENERAL:	/* QNX has different ordering of GP regs than GDB.  */
+    case NTO_REG_GENERAL:
       i386nto_supply_gregset (data);
       break;
     case NTO_REG_FLOAT:
@@ -194,39 +199,6 @@ i386nto_regset_fill (int regset, char *d
   return 0;
 }
 
-static struct link_map_offsets *
-i386nto_svr4_fetch_link_map_offsets (void)
-{
-  static struct link_map_offsets lmo;
-  static struct link_map_offsets *lmp = NULL;
-
-  if (lmp == NULL)
-    {
-      lmp = &lmo;
-
-      lmo.r_debug_size = 8;	/* The actual size is 20 bytes, but
-				   only 8 bytes are used.  */
-      lmo.r_map_offset = 4;
-      lmo.r_map_size = 4;
-
-      lmo.link_map_size = 20;	/* The actual size is 552 bytes, but
-				   only 20 bytes are used.  */
-      lmo.l_addr_offset = 0;
-      lmo.l_addr_size = 4;
-
-      lmo.l_name_offset = 4;
-      lmo.l_name_size = 4;
-
-      lmo.l_next_offset = 12;
-      lmo.l_next_size = 4;
-
-      lmo.l_prev_offset = 16;
-      lmo.l_prev_size = 4;
-    }
-
-  return lmp;
-}
-
 /* Return whether the frame preceding NEXT_FRAME corresponds to a QNX
    Neutrino sigtramp routine.  */
 
@@ -268,7 +240,7 @@ init_i386nto_ops (void)
   i386_nto_target.register_area = i386nto_register_area;
   i386_nto_target.regset_fill = i386nto_regset_fill;
   i386_nto_target.fetch_link_map_offsets =
-    i386nto_svr4_fetch_link_map_offsets;
+    svr4_ilp32_fetch_link_map_offsets;
 }
 
 static void
@@ -289,6 +261,10 @@ i386nto_init_abi (struct gdbarch_info in
   /* NTO has shared libraries.  */
   set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
 
+  tdep->gregset_reg_offset = i386nto_gregset_reg_offset;
+  tdep->gregset_num_regs = ARRAY_SIZE (i386nto_gregset_reg_offset);
+  tdep->sizeof_gregset = NUM_GPREGS * 4;
+
   tdep->sigtramp_p = i386nto_sigtramp_p;
   tdep->sigcontext_addr = i386nto_sigcontext_addr;
   tdep->sc_pc_offset = 56;
@@ -297,8 +273,8 @@ i386nto_init_abi (struct gdbarch_info in
   /* Setjmp()'s return PC saved in EDX (5).  */
   tdep->jb_pc_offset = 20;	/* 5x32 bit ints in.  */
 
-  set_solib_svr4_fetch_link_map_offsets (gdbarch,
-					 i386nto_svr4_fetch_link_map_offsets);
+  set_solib_svr4_fetch_link_map_offsets
+    (gdbarch, svr4_ilp32_fetch_link_map_offsets);
 
   /* Our loader handles solib relocations slightly differently than svr4.  */
   TARGET_SO_RELOCATE_SECTION_ADDRESSES = nto_relocate_section_addresses;

       reply	other threads:[~2004-12-23 15:35 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <41CA34EF.6040401@qnx.com>
2004-12-23 16:28 ` M.M. Kettenis [this message]
2004-12-23 17:12   ` Kris Warkentin
2004-12-23 22:31     ` Kris Warkentin
2004-12-23 22:34       ` Mark Kettenis
2004-12-22 22:03 Kris Warkentin
2004-12-23  3:02 ` Mark Kettenis
2004-12-23  9:21   ` Kris Warkentin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=73193856100971104@weblx058.utsp.utwente.nl \
    --to=m.m.kettenis@alumnus.utwente.nl \
    --cc=gdb-patches@sources.redhat.com \
    --cc=kewarken@qnx.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox