This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[COMMIT] frv-linux-tdep.c: Adjust an RT signal related constant


I've just committed that patch below.  Thanks to Richard Sandiford for
finding the problem and suggesting the fix.  (This patch looks bigger
than it really is; it only touches one line of executable code.  The
rest of the changes are updates to comments.)

	* frv-linux-tdep.c (frv_linux_sigcontext_reg_addr): Update comments.
	Adjust incorrectly computed constant for realtime signal frame.

Index: frv-linux-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/frv-linux-tdep.c,v
retrieving revision 1.5
diff -u -p -r1.5 frv-linux-tdep.c
--- frv-linux-tdep.c	11 Feb 2005 18:13:49 -0000	1.5
+++ frv-linux-tdep.c	18 Mar 2005 20:20:38 -0000
@@ -67,14 +67,14 @@ frv_linux_pc_in_sigtramp (CORE_ADDR pc, 
   return retval;
 }
 
-/* Given NEXT_FRAME, "callee" frame of the sigtramp frame that we
+/* Given NEXT_FRAME, the "callee" frame of the sigtramp frame that we
    wish to decode, and REGNO, one of the frv register numbers defined
    in frv-tdep.h, return the address of the saved register (corresponding
    to REGNO) in the sigtramp frame.  Return -1 if the register is not
    found in the sigtramp frame.  The magic numbers in the code below
    were computed by examining the following kernel structs:
 
-   From arch/frvnommu/signal.c:
+   From arch/frv/kernel/signal.c:
 
       struct sigframe
       {
@@ -96,7 +96,7 @@ frv_linux_pc_in_sigtramp (CORE_ADDR pc, 
 	      uint32_t retcode[2];
       };
 
-   From include/asm-frvnommu/ucontext.h:
+   From include/asm-frv/ucontext.h:
 
       struct ucontext {
 	      unsigned long		uc_flags;
@@ -106,14 +106,22 @@ frv_linux_pc_in_sigtramp (CORE_ADDR pc, 
 	      sigset_t		uc_sigmask;
       };
 
-   From include/asm-frvnommu/sigcontext.h:
+   From include/asm-frv/signal.h:
+
+      typedef struct sigaltstack {
+	      void *ss_sp;
+	      int ss_flags;
+	      size_t ss_size;
+      } stack_t;
+
+   From include/asm-frv/sigcontext.h:
 
       struct sigcontext {
 	      struct user_context	sc_context;
 	      unsigned long		sc_oldmask;
       } __attribute__((aligned(8)));
 
-   From include/asm-frvnommu/registers.h:
+   From include/asm-frv/registers.h:
       struct user_int_regs
       {
 	      unsigned long		psr;
@@ -184,15 +192,19 @@ frv_linux_sigcontext_reg_addr (struct fr
       else if (tramp_type == RT_SIGTRAMP)
 	{
 	  /* For a realtime sigtramp frame, SP + 12 contains a pointer
-	     to the a ucontext struct.  The ucontext struct contains
-	     a sigcontext struct starting 12 bytes in.  */
+ 	     to the a ucontext struct.  The ucontext struct contains a
+ 	     sigcontext struct starting 24 bytes in.  (The offset of
+ 	     uc_mcontext within struct ucontext is derived as follows: 
+ 	     stack_t is a 12-byte struct and struct sigcontext is
+ 	     8-byte aligned.  This gives an offset of 8 + 12 + 4 (for
+ 	     padding) = 24.) */
 	  if (target_read_memory (sp + 12, buf, sizeof buf) != 0)
 	    {
 	      warning (_("Can't read realtime sigtramp frame."));
 	      return 0;
 	    }
 	  sc_addr = extract_unsigned_integer (buf, sizeof buf);
-	  sc_addr += 12;
+ 	  sc_addr += 24;
 	}
       else
 	internal_error (__FILE__, __LINE__, _("not a signal trampoline"));


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]