aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog4
-rw-r--r--gdb/spu-tdep.c10
2 files changed, 12 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a78ade4..65cd2ac 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,9 @@
2007-05-11 Ulrich Weigand <uweigand@de.ibm.com>
+ * spu-tdep.c (spu_frame_unwind_cache): Add comment.
+
+2007-05-11 Ulrich Weigand <uweigand@de.ibm.com>
+
* breakpoint.c (remove_breakpoint): Do not remove software
breakpoints in unmapped overlay sections.
diff --git a/gdb/spu-tdep.c b/gdb/spu-tdep.c
index e25d66e..0d82a74 100644
--- a/gdb/spu-tdep.c
+++ b/gdb/spu-tdep.c
@@ -743,13 +743,19 @@ spu_frame_unwind_cache (struct frame_info *next_frame,
/* The previous SP is equal to the CFA. */
trad_frame_set_value (info->saved_regs, SPU_SP_REGNUM, info->frame_base);
- /* The previous PC comes from the link register. In the case
- of overlay return stubs, we unwind to the real return address. */
+ /* Read full contents of the unwound link register in order to
+ be able to determine the return address. */
if (trad_frame_addr_p (info->saved_regs, SPU_LR_REGNUM))
target_read_memory (info->saved_regs[SPU_LR_REGNUM].addr, buf, 16);
else
frame_unwind_register (next_frame, SPU_LR_REGNUM, buf);
+ /* Normally, the return address is contained in the slot 0 of the
+ link register, and slots 1-3 are zero. For an overlay return,
+ slot 0 contains the address of the overlay manager return stub,
+ slot 1 contains the partition number of the overlay section to
+ be returned to, and slot 2 contains the return address within
+ that section. Return the latter address in that case. */
if (extract_unsigned_integer (buf + 8, 4) != 0)
trad_frame_set_value (info->saved_regs, SPU_PC_REGNUM,
extract_unsigned_integer (buf + 8, 4));