From: Pedro Alves Date: Tue, 14 Oct 2008 23:39:29 +0000 (+0000) Subject: * infrun.c (displaced_step_prepare): Switch thread temporarily X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ad53cd71541c9a208dc896f1d7b5a8adbc0d856c;p=binutils-gdb.git * infrun.c (displaced_step_prepare): Switch thread temporarily while we're here. (displaced_step_fixup): Make sure target_resume sees ptid as inferior_ptid. Add debug output. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d1347138803..6bf93581720 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2008-10-14 Pedro Alves + + * infrun.c (displaced_step_prepare): Switch thread temporarily + while we're here. + (displaced_step_fixup): Make sure target_resume sees ptid as + inferior_ptid. Add debug output. + 2008-10-14 Pedro Alves Remove dead code. diff --git a/gdb/infrun.c b/gdb/infrun.c index 0aefa25ffc9..f60f938b3fc 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -629,7 +629,7 @@ displaced_step_dump_bytes (struct ui_file *file, static int displaced_step_prepare (ptid_t ptid) { - struct cleanup *old_cleanups; + struct cleanup *old_cleanups, *ignore_cleanups; struct regcache *regcache = get_thread_regcache (ptid); struct gdbarch *gdbarch = get_regcache_arch (regcache); CORE_ADDR original, copy; @@ -681,6 +681,9 @@ displaced_step_prepare (ptid_t ptid) displaced_step_clear (); + old_cleanups = save_inferior_ptid (); + inferior_ptid = ptid; + original = regcache_read_pc (regcache); copy = gdbarch_displaced_step_location (gdbarch); @@ -688,8 +691,8 @@ displaced_step_prepare (ptid_t ptid) /* Save the original contents of the copy area. */ displaced_step_saved_copy = xmalloc (len); - old_cleanups = make_cleanup (free_current_contents, - &displaced_step_saved_copy); + ignore_cleanups = make_cleanup (free_current_contents, + &displaced_step_saved_copy); read_memory (copy, displaced_step_saved_copy, len); if (debug_displaced) { @@ -699,7 +702,7 @@ displaced_step_prepare (ptid_t ptid) }; closure = gdbarch_displaced_step_copy_insn (gdbarch, - original, copy, regcache); + original, copy, regcache); /* We don't support the fully-simulated case at present. */ gdb_assert (closure); @@ -709,11 +712,13 @@ displaced_step_prepare (ptid_t ptid) /* Resume execution at the copy. */ regcache_write_pc (regcache, copy); - discard_cleanups (old_cleanups); + discard_cleanups (ignore_cleanups); + + do_cleanups (old_cleanups); if (debug_displaced) fprintf_unfiltered (gdb_stdlog, "displaced: displaced pc to 0x%s\n", - paddr_nz (copy)); + paddr_nz (copy)); /* Save the information we need to fix things up if the step succeeds. */ @@ -801,9 +806,22 @@ displaced_step_fixup (ptid_t event_ptid, enum target_signal signal) "displaced: stepping queued %s now\n", target_pid_to_str (ptid)); - displaced_step_ptid = null_ptid; displaced_step_prepare (ptid); + context_switch (ptid); + + if (debug_displaced) + { + struct regcache *resume_regcache = get_thread_regcache (ptid); + CORE_ADDR actual_pc = regcache_read_pc (resume_regcache); + gdb_byte buf[4]; + + fprintf_unfiltered (gdb_stdlog, "displaced: run 0x%s: ", + paddr_nz (actual_pc)); + read_memory (actual_pc, buf, sizeof (buf)); + displaced_step_dump_bytes (gdb_stdlog, buf, sizeof (buf)); + } + target_resume (ptid, 1, TARGET_SIGNAL_0); } }