Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: "J. Johnston" <jjohnstn@redhat.com>
To: gdb-patches@sources.redhat.com
Subject: RFA: change to ia64-linux-tdep.c
Date: Wed, 15 Oct 2003 22:03:00 -0000	[thread overview]
Message-ID: <3F8DC432.40303@redhat.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 1335 bytes --]

The following changes the code in ia64_linux_sigcontext_register_address to use 
the fact that the sigframe has the address of the sigcontext area stored at 
offset 16 from the stack pointer.  This change avoids using a magic constant to 
find the start of the sigcontext area which may change in various kernel 
versions as fields are added or subtracted to the sigframe.

Code has been tested with signal handling test cases.

The following is an excerpt of the linux kernel sigframe.h code:

struct sigframe {
         /*
          * Place signal handler args where user-level unwinder can find them 
easily.
          * DO NOT MOVE THESE.  They are part of the IA-64 Linux ABI and there 
is         * user-level code that depends on their presence!
          */
         unsigned long arg0;             /* signum */
         unsigned long arg1;             /* siginfo pointer */
         unsigned long arg2;             /* sigcontext pointer */
         /*
          * End of architected state.
          */

Ok to Commit?

-- Jeff J.

2003-10-15  Jeff Johnston  <jjohnstn@redhat.com>

	* ia64-linux-tdep.c: Include gdbcore.h.
	(IA64_LINUX_SIGCONTEXT_OFFSET): Magic constant removed.
	(ia64_linux_sigcontext_register_addr): Find the address of the
	sigcontext area stored in the sigframe instead of using
	a magic offset constant.

[-- Attachment #2: ia64-linux-tdep.patch --]
[-- Type: text/plain, Size: 2994 bytes --]

Index: ia64-linux-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/ia64-linux-tdep.c,v
retrieving revision 1.3
diff -u -r1.3 ia64-linux-tdep.c
--- ia64-linux-tdep.c	1 Jun 2001 02:22:01 -0000	1.3
+++ ia64-linux-tdep.c	15 Oct 2003 21:54:26 -0000
@@ -21,6 +21,7 @@
 
 #include "defs.h"
 #include "arch-utils.h"
+#include "gdbcore.h"
 
 /* The sigtramp code is in a non-readable (executable-only) region
    of memory called the ``gate page''.  The addresses in question
@@ -47,40 +48,47 @@
 CORE_ADDR
 ia64_linux_sigcontext_register_address (CORE_ADDR sp, int regno)
 {
+  char buf[8];
+  CORE_ADDR sigcontext_addr = 0;
+
+  /* The address of the sigcontext area is found at offset 16 in the sigframe.  */
+  read_memory (sp + 16, buf, 8);
+  sigcontext_addr = extract_unsigned_integer (buf, 8);
+
   if (IA64_GR0_REGNUM <= regno && regno <= IA64_GR31_REGNUM)
-    return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 200 + 8 * (regno - IA64_GR0_REGNUM);
+    return sigcontext_addr + 200 + 8 * (regno - IA64_GR0_REGNUM);
   else if (IA64_BR0_REGNUM <= regno && regno <= IA64_BR7_REGNUM)
-    return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 136 + 8 * (regno - IA64_BR0_REGNUM);
+    return sigcontext_addr + 136 + 8 * (regno - IA64_BR0_REGNUM);
   else if (IA64_FR0_REGNUM <= regno && regno <= IA64_FR127_REGNUM)
-    return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 464 + 16 * (regno - IA64_FR0_REGNUM);
+    return sigcontext_addr + 464 + 16 * (regno - IA64_FR0_REGNUM);
   else
     switch (regno)
       {
       case IA64_IP_REGNUM :
-	return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 40;
+	return sigcontext_addr + 40;
       case IA64_CFM_REGNUM :
-	return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 48;
+	return sigcontext_addr + 48;
       case IA64_PSR_REGNUM :
-	return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 56;		/* user mask only */
+	return sigcontext_addr + 56;		/* user mask only */
       /* sc_ar_rsc is provided, from which we could compute bspstore, but
 	 I don't think it's worth it.  Anyway, if we want it, it's at offset
 	 64 */
       case IA64_BSP_REGNUM :
-	return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 72;
+	return sigcontext_addr + 72;
       case IA64_RNAT_REGNUM :
-	return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 80;
+	return sigcontext_addr + 80;
       case IA64_CCV_REGNUM :
-	return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 88;
+	return sigcontext_addr + 88;
       case IA64_UNAT_REGNUM :
-	return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 96;
+	return sigcontext_addr + 96;
       case IA64_FPSR_REGNUM :
-	return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 104;
+	return sigcontext_addr + 104;
       case IA64_PFS_REGNUM :
-	return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 112;
+	return sigcontext_addr + 112;
       case IA64_LC_REGNUM :
-	return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 120;
+	return sigcontext_addr + 120;
       case IA64_PR_REGNUM :
-	return sp + IA64_LINUX_SIGCONTEXT_OFFSET + 128;
+	return sigcontext_addr + 128;
       default :
 	return 0;
       }

             reply	other threads:[~2003-10-15 22:03 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-10-15 22:03 J. Johnston [this message]
2003-10-15 22:35 ` Kevin Buettner
2003-10-15 22:58   ` J. Johnston
2003-10-16  0:43     ` Kevin Buettner

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=3F8DC432.40303@redhat.com \
    --to=jjohnstn@redhat.com \
    --cc=gdb-patches@sources.redhat.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