diff options
author | Mark Kettenis <kettenis@gnu.org> | 2004-02-07 20:45:40 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@gnu.org> | 2004-02-07 20:45:40 +0000 |
commit | 1c80067325ac5c90f84154900ac057780b7869af (patch) | |
tree | 31493e2c0cf2c040cb2283009f75c4244f307e04 | |
parent | 7d34766b6a1e38232506b9c6ebfa647e70c22463 (diff) | |
download | gdb-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/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/sparc-tdep.h | 3 | ||||
-rw-r--r-- | gdb/sparcnbsd-tdep.c | 14 |
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. */ |