* remote-mips.c (gdbthread.h): Include.

(remote_mips_ptid): Declare.
	(mips_error): Only mourn the inferior when inferior_ptid is non-null.
	(common_open): Set inferior_ptid, add it as an inferior, and
	as a thread too.  Delete FIXME comment regarding start_remote().
	(mips_close): Invoke generic_mourn_inferior().
	(mips_kill): Make sure that target_mourn_inferior is invoked.
	(mips_mourn_inferior): Don't invoke generic_mourn_inferior, as
	it's now invoked from mips_close().
	(mips_load): Don't null out inferior_ptid.  Don't call
	clear_symtab_users().
	(mips_thread_alive, mips_pid_to_str): New functions.
	(_initialize_remote_mips): Initialize remote_mips_ptid.  Initialize
	to_thread_alive and to_pid_to_str operations.
This commit is contained in:
Kevin Buettner 2010-03-05 16:18:54 +00:00
parent 26b6f1917c
commit 8eeafb51ab
2 changed files with 70 additions and 17 deletions

View File

@ -1,3 +1,21 @@
2010-03-05 Kevin Buettner <kevinb@redhat.com>
Pedro Alves <pedro@codesourcery.com>
* remote-mips.c (gdbthread.h): Include.
(remote_mips_ptid): Declare.
(mips_error): Only mourn the inferior when inferior_ptid is non-null.
(common_open): Set inferior_ptid, add it as an inferior, and
as a thread too. Delete FIXME comment regarding start_remote().
(mips_close): Invoke generic_mourn_inferior().
(mips_kill): Make sure that target_mourn_inferior is invoked.
(mips_mourn_inferior): Don't invoke generic_mourn_inferior, as
it's now invoked from mips_close().
(mips_load): Don't null out inferior_ptid. Don't call
clear_symtab_users().
(mips_thread_alive, mips_pid_to_str): New functions.
(_initialize_remote_mips): Initialize remote_mips_ptid. Initialize
to_thread_alive and to_pid_to_str operations.
2010-03-04 Tom Tromey <tromey@redhat.com>
* dwarf2read.c (skip_one_die) <DW_FORM_ref_addr>: Use offset size

View File

@ -35,6 +35,7 @@
#include "regcache.h"
#include <ctype.h>
#include "mips-tdep.h"
#include "gdbthread.h"
/* Breakpoint types. Values 0, 1, and 2 must agree with the watch
@ -440,6 +441,11 @@ struct lsi_error lsi_error_table[] =
of warnings returned by PMON when hardware breakpoints are used. */
static int monitor_warnings;
/* This is the ptid we use while we're connected to the remote. Its
value is arbitrary, as the remote-mips target doesn't have a notion of
processes or threads, but we need something non-null to place in
inferior_ptid. */
static ptid_t remote_mips_ptid;
static void
close_ports (void)
@ -483,7 +489,8 @@ mips_error (char *string,...)
close_ports ();
printf_unfiltered ("Ending remote MIPS debugging.\n");
target_mourn_inferior ();
if (!ptid_equal (inferior_ptid, null_ptid))
target_mourn_inferior ();
deprecated_throw_reason (RETURN_ERROR);
}
@ -1563,7 +1570,9 @@ device is attached to the target board (e.g., /dev/ttya).\n"
/* Switch to using remote target now. */
push_target (ops);
/* FIXME: Should we call start_remote here? */
inferior_ptid = remote_mips_ptid;
inferior_appeared (current_inferior (), ptid_get_pid (inferior_ptid));
add_thread_silent (inferior_ptid);
/* Try to figure out the processor model if possible. */
deprecated_mips_set_processor_regs_hack ();
@ -1639,6 +1648,8 @@ mips_close (int quitting)
close_ports ();
}
generic_mourn_inferior ();
}
/* Detach from the remote board. */
@ -2140,7 +2151,10 @@ static void
mips_kill (struct target_ops *ops)
{
if (!mips_wait_flag)
return;
{
target_mourn_inferior ();
return;
}
interrupt_count++;
@ -2173,6 +2187,8 @@ Give up (and stop debugging it)? ")))
serial_send_break (mips_desc);
target_mourn_inferior ();
#if 0
if (mips_is_open)
{
@ -2210,19 +2226,17 @@ Can't pass arguments to remote MIPS board; arguments ignored.");
init_wait_for_inferior ();
/* FIXME: Should we set inferior_ptid here? */
regcache_write_pc (get_current_regcache (), entry_pt);
}
/* Clean up after a process. Actually nothing to do. */
/* Clean up after a process. The bulk of the work is done in mips_close(),
which is called when unpushing the target. */
static void
mips_mourn_inferior (struct target_ops *ops)
{
if (current_ops != NULL)
unpush_target (current_ops);
generic_mourn_inferior ();
}
/* We can write a breakpoint and read the shadow contents in one
@ -3296,18 +3310,36 @@ mips_load (char *file, int from_tty)
}
if (exec_bfd)
regcache_write_pc (regcache, bfd_get_start_address (exec_bfd));
inferior_ptid = null_ptid; /* No process now */
/* This is necessary because many things were based on the PC at the time that
we attached to the monitor, which is no longer valid now that we have loaded
new code (and just changed the PC). Another way to do this might be to call
normal_stop, except that the stack may not be valid, and things would get
horribly confused... */
clear_symtab_users ();
}
/* Check to see if a thread is still alive. */
static int
mips_thread_alive (struct target_ops *ops, ptid_t ptid)
{
if (ptid_equal (ptid, remote_mips_ptid))
/* The monitor's task is always alive. */
return 1;
return 0;
}
/* Convert a thread ID to a string. Returns the string in a static
buffer. */
static char *
mips_pid_to_str (struct target_ops *ops, ptid_t ptid)
{
static char buf[64];
if (ptid_equal (ptid, remote_mips_ptid))
{
xsnprintf (buf, sizeof buf, "Thread <main>");
return buf;
}
return normal_pid_to_str (ptid);
}
/* Pass the command argument as a packet to PMON verbatim. */
@ -3351,6 +3383,8 @@ _initialize_remote_mips (void)
mips_ops.to_load = mips_load;
mips_ops.to_create_inferior = mips_create_inferior;
mips_ops.to_mourn_inferior = mips_mourn_inferior;
mips_ops.to_thread_alive = mips_thread_alive;
mips_ops.to_pid_to_str = mips_pid_to_str;
mips_ops.to_log_command = serial_log_command;
mips_ops.to_stratum = process_stratum;
mips_ops.to_has_all_memory = default_child_has_all_memory;
@ -3458,4 +3492,5 @@ Use \"on\" to enable the masking and \"off\" to disable it."),
NULL,
NULL, /* FIXME: i18n: */
&setlist, &showlist);
remote_mips_ptid = ptid_build (42000, 0, 42000);
}