1
diff -ur gdb-orig/gdb/spu-tdep.c gdb-6.6/gdb/spu-tdep.c
2
--- gdb-orig/gdb/spu-tdep.c 2007-02-23 20:57:25.774954000 +0100
3
+++ gdb-6.6/gdb/spu-tdep.c 2007-02-23 21:39:41.265946040 +0100
6
spu_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
8
- return frame_unwind_register_unsigned (next_frame, SPU_PC_REGNUM);
9
+ CORE_ADDR pc = frame_unwind_register_unsigned (next_frame, SPU_PC_REGNUM);
10
+ /* Mask off interrupt enable bit. */
16
return frame_unwind_register_unsigned (next_frame, SPU_SP_REGNUM);
20
+spu_read_pc (ptid_t ptid)
22
+ CORE_ADDR pc = read_register_pid (SPU_PC_REGNUM, ptid);
23
+ /* Mask off interrupt enable bit. */
28
+spu_write_pc (CORE_ADDR pc, ptid_t ptid)
30
+ /* Keep interrupt enabled state unchanged. */
31
+ CORE_ADDR old_pc = read_register_pid (SPU_PC_REGNUM, ptid);
32
+ write_register_pid (SPU_PC_REGNUM, (pc & -4) | (old_pc & 3), ptid);
36
/* Function calling convention. */
41
regcache_cooked_read (current_regcache, SPU_PC_REGNUM, buf);
42
- pc = extract_unsigned_integer (buf, 4);
43
+ /* Mask off interrupt enable bit. */
44
+ pc = extract_unsigned_integer (buf, 4) & -4;
46
if (target_read_memory (pc, buf, 4))
49
instruction is a PPE-assisted call, in which case it is at PC + 8.
50
Wrap around LS limit to be on the safe side. */
51
if ((insn & 0xffffff00) == 0x00002100)
52
- next_pc = (pc + 8) & (SPU_LS_SIZE - 1) & -4;
53
+ next_pc = (pc + 8) & (SPU_LS_SIZE - 1);
55
- next_pc = (pc + 4) & (SPU_LS_SIZE - 1) & -4;
56
+ next_pc = (pc + 4) & (SPU_LS_SIZE - 1);
58
insert_single_step_breakpoint (next_pc);
60
@@ -1113,10 +1132,10 @@
63
regcache_cooked_read_part (current_regcache, reg, 0, 4, buf);
64
- target += extract_unsigned_integer (buf, 4);
65
+ target += extract_unsigned_integer (buf, 4) & -4;
68
- target = target & (SPU_LS_SIZE - 1) & -4;
69
+ target = target & (SPU_LS_SIZE - 1);
70
if (target != next_pc)
71
insert_single_step_breakpoint (target);
74
set_gdbarch_num_pseudo_regs (gdbarch, SPU_NUM_PSEUDO_REGS);
75
set_gdbarch_sp_regnum (gdbarch, SPU_SP_REGNUM);
76
set_gdbarch_pc_regnum (gdbarch, SPU_PC_REGNUM);
77
+ set_gdbarch_read_pc (gdbarch, spu_read_pc);
78
+ set_gdbarch_write_pc (gdbarch, spu_write_pc);
79
set_gdbarch_register_name (gdbarch, spu_register_name);
80
set_gdbarch_register_type (gdbarch, spu_register_type);
81
set_gdbarch_pseudo_register_read (gdbarch, spu_pseudo_register_read);