static void exec_one_dummy_insn (struct regcache *regcache) { #define DUMMY_INSN_ADDR AIX_TEXT_SEGMENT_BASE+0x200 struct gdbarch *gdbarch = get_regcache_arch (regcache); int ret, status, pid; CORE_ADDR prev_pc; void *bp; /* We plant one dummy breakpoint into DUMMY_INSN_ADDR address. We assume that this address will never be executed again by the real code. */ bp = deprecated_insert_raw_breakpoint (gdbarch, NULL, DUMMY_INSN_ADDR); /* You might think this could be done with a single ptrace call, and you'd be correct for just about every platform I've ever worked on. However, rs6000-ibm-aix4.1.3 seems to have screwed this up -- the inferior never hits the breakpoint (it's also worth noting powerpc-ibm-aix4.1.3 works correctly). */ prev_pc = regcache_read_pc (regcache); regcache_write_pc (regcache, DUMMY_INSN_ADDR); if (ARCH64 ()) ret = rs6000_ptrace64 (PT_CONTINUE, ptid_get_pid (inferior_ptid), 1, 0, NULL); else ret = rs6000_ptrace32 (PT_CONTINUE, ptid_get_pid (inferior_ptid), (int *) 1, 0, NULL); if (ret != 0) perror (_("pt_continue")); do { pid = waitpid (ptid_get_pid (inferior_ptid), &status, 0); } while (pid != ptid_get_pid (inferior_ptid)); regcache_write_pc (regcache, prev_pc); deprecated_remove_raw_breakpoint (gdbarch, bp); }
void default_skip_permanent_breakpoint (struct regcache *regcache) { struct gdbarch *gdbarch = get_regcache_arch (regcache); CORE_ADDR current_pc = regcache_read_pc (regcache); int bp_len; gdbarch_breakpoint_from_pc (gdbarch, ¤t_pc, &bp_len); current_pc += bp_len; regcache_write_pc (regcache, current_pc); }