* sparc-tdep.h (sparc_fetch_wcookie): New prototype.
authorMark Kettenis <kettenis@gnu.org>
Sat, 7 Feb 2004 20:45:40 +0000 (20:45 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sat, 7 Feb 2004 20:45:40 +0000 (20:45 +0000)
* sparcnbsd-tdep.c (sparc32nbsd_sigcontext_saved_regs): Handle
StackGhost.

gdb/ChangeLog
gdb/sparc-tdep.h
gdb/sparcnbsd-tdep.c

index 17f3bde..edf959a 100644 (file)
@@ -1,5 +1,9 @@
 2004-02-07  Mark Kettenis  <kettenis@gnu.org>
 
+       * sparc-tdep.h (sparc_fetch_wcookie): New prototype.
+       * sparcnbsd-tdep.c (sparc32nbsd_sigcontext_saved_regs): Handle
+       StackGhost.
+
        * sparc-tdep.c (sparc32_frame_prev_register): Rename local
        variable `i6' to `i7'.
        (sparc_supply_rwindow, sparc_collect_rwindow): Likewise.
index 00c4136..bbfbb42 100644 (file)
@@ -147,6 +147,9 @@ struct sparc_frame_cache
 /* Fetch the instruction at PC.  */
 extern unsigned long sparc_fetch_instruction (CORE_ADDR pc);
 
+/* Fetch StackGhost Per-Process XOR cookie.  */
+extern ULONGEST sparc_fetch_wcookie (void);
+
 extern CORE_ADDR sparc_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc,
                                         struct sparc_frame_cache *cache);
 
index 7a23ff3..b1be7eb 100644 (file)
@@ -141,6 +141,20 @@ sparc32nbsd_sigcontext_saved_regs (struct frame_info *next_frame)
        regnum <= SPARC_I7_REGNUM; regnum++, addr += 4)
     saved_regs[regnum].addr = addr;
 
+  /* Handle StackGhost.  */
+  {
+    ULONGEST wcookie = sparc_fetch_wcookie ();
+
+    if (wcookie != 0)
+      {
+       ULONGEST i7;
+
+       addr = saved_regs[SPARC_I7_REGNUM].addr;
+       i7 = get_frame_memory_unsigned (next_frame, addr, 4);
+       trad_frame_set_value (saved_regs, SPARC_I7_REGNUM, i7 ^ wcookie);
+      }
+  }
+
   /* The floating-point registers are only saved if the EF bit in %prs
      has been set.  */