aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2004-02-07 20:45:40 +0000
committerMark Kettenis <kettenis@gnu.org>2004-02-07 20:45:40 +0000
commit1c80067325ac5c90f84154900ac057780b7869af (patch)
tree31493e2c0cf2c040cb2283009f75c4244f307e04
parent7d34766b6a1e38232506b9c6ebfa647e70c22463 (diff)
downloadgdb-1c80067325ac5c90f84154900ac057780b7869af.zip
gdb-1c80067325ac5c90f84154900ac057780b7869af.tar.gz
gdb-1c80067325ac5c90f84154900ac057780b7869af.tar.bz2
* sparc-tdep.h (sparc_fetch_wcookie): New prototype.
* sparcnbsd-tdep.c (sparc32nbsd_sigcontext_saved_regs): Handle StackGhost.
-rw-r--r--gdb/ChangeLog4
-rw-r--r--gdb/sparc-tdep.h3
-rw-r--r--gdb/sparcnbsd-tdep.c14
3 files changed, 21 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 17f3bde..edf959a 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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.
diff --git a/gdb/sparc-tdep.h b/gdb/sparc-tdep.h
index 00c4136..bbfbb42 100644
--- a/gdb/sparc-tdep.h
+++ b/gdb/sparc-tdep.h
@@ -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);
diff --git a/gdb/sparcnbsd-tdep.c b/gdb/sparcnbsd-tdep.c
index 7a23ff3..b1be7eb 100644
--- a/gdb/sparcnbsd-tdep.c
+++ b/gdb/sparcnbsd-tdep.c
@@ -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. */