mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-27 01:28:46 +00:00
* procfs.c (procfs_wait): Fix argument name to match 4 Jan changes.
* Move target_signal_from_host, target_signal_to_host, and store_waitstatus from inftarg.c to target.c. procfs needs them. * target.c: Include "wait.h" and <signal.h>. * target.h, infrun.c (proceed), proceed callers: Pass new code TARGET_SIGNAL_DEFAULT instead of -1. This avoids problems with enums being treated as unsigned and is cleaner. * infrun.c (signals_info): Don't print TARGET_SIGNAL_DEFAULT or TARGET_SIGNAL_0. * infcmd.c (signal_command), infrun.c (signals_info): Don't allow user to specify numeric equivalent of TARGET_SIGNAL_DEFAULT.
This commit is contained in:
59
gdb/procfs.c
59
gdb/procfs.c
@@ -2174,48 +2174,33 @@ do_detach (signal)
|
||||
attach_flag = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
/* emulate wait() as much as possible.
|
||||
Wait for child to do something. Return pid of child, or -1 in case
|
||||
of error; store status in *OURSTATUS.
|
||||
|
||||
LOCAL FUNCTION
|
||||
Not sure why we can't
|
||||
just use wait(), but it seems to have problems when applied to a
|
||||
process being controlled with the /proc interface.
|
||||
|
||||
procfs_wait -- emulate wait() as much as possible
|
||||
Wait for child to do something. Return pid of child, or -1 in case
|
||||
of error; store status through argument pointer STATUS.
|
||||
We have a race problem here with no obvious solution. We need to let
|
||||
the inferior run until it stops on an event of interest, which means
|
||||
that we need to use the PIOCWSTOP ioctl. However, we cannot use this
|
||||
ioctl if the process is already stopped on something that is not an
|
||||
event of interest, or the call will hang indefinitely. Thus we first
|
||||
use PIOCSTATUS to see if the process is not stopped. If not, then we
|
||||
use PIOCWSTOP. But during the window between the two, if the process
|
||||
stops for any reason that is not an event of interest (such as a job
|
||||
control signal) then gdb will hang. One possible workaround is to set
|
||||
an alarm to wake up every minute of so and check to see if the process
|
||||
is still running, and if so, then reissue the PIOCWSTOP. But this is
|
||||
a real kludge, so has not been implemented. FIXME: investigate
|
||||
alternatives.
|
||||
|
||||
|
||||
SYNOPSIS
|
||||
|
||||
int procfs_wait (int pid, int *statloc)
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
Try to emulate wait() as much as possible. Not sure why we can't
|
||||
just use wait(), but it seems to have problems when applied to a
|
||||
process being controlled with the /proc interface.
|
||||
|
||||
NOTES
|
||||
|
||||
We have a race problem here with no obvious solution. We need to let
|
||||
the inferior run until it stops on an event of interest, which means
|
||||
that we need to use the PIOCWSTOP ioctl. However, we cannot use this
|
||||
ioctl if the process is already stopped on something that is not an
|
||||
event of interest, or the call will hang indefinitely. Thus we first
|
||||
use PIOCSTATUS to see if the process is not stopped. If not, then we
|
||||
use PIOCWSTOP. But during the window between the two, if the process
|
||||
stops for any reason that is not an event of interest (such as a job
|
||||
control signal) then gdb will hang. One possible workaround is to set
|
||||
an alarm to wake up every minute of so and check to see if the process
|
||||
is still running, and if so, then reissue the PIOCWSTOP. But this is
|
||||
a real kludge, so has not been implemented. FIXME: investigate
|
||||
alternatives.
|
||||
|
||||
FIXME: Investigate why wait() seems to have problems with programs
|
||||
being control by /proc routines.
|
||||
|
||||
*/
|
||||
FIXME: Investigate why wait() seems to have problems with programs
|
||||
being control by /proc routines. */
|
||||
|
||||
static int
|
||||
procfs_wait (pid, statloc)
|
||||
procfs_wait (pid, ourstatus)
|
||||
int pid;
|
||||
struct target_waitstatus *ourstatus;
|
||||
{
|
||||
|
||||
@@ -407,7 +407,7 @@ adapt_create_inferior (execfile, args, env)
|
||||
expect_prompt ();
|
||||
#else
|
||||
insert_breakpoints (); /* Needed to get correct instruction in cache */
|
||||
proceed(entry_pt, -1, 0);
|
||||
proceed(entry_pt, TARGET_SIGNAL_DEFAULT, 0);
|
||||
#endif
|
||||
|
||||
} else {
|
||||
|
||||
@@ -285,7 +285,7 @@ eb_create_inferior (execfile, args, env)
|
||||
target_terminal_inferior ();
|
||||
|
||||
/* insert_step_breakpoint (); FIXME, do we need this? */
|
||||
proceed ((CORE_ADDR)entry_pt, -1, 0); /* Let 'er rip... */
|
||||
proceed ((CORE_ADDR)entry_pt, TARGET_SIGNAL_DEFAULT, 0); /* Let 'er rip... */
|
||||
}
|
||||
|
||||
/* Translate baud rates from integers to damn B_codes. Unix should
|
||||
|
||||
@@ -1616,7 +1616,8 @@ es1800_create_inferior (execfile, args, env)
|
||||
/* trap_expected = 0; */
|
||||
/* insert_step_breakpoint (); FIXME, do we need this? */
|
||||
|
||||
proceed ((CORE_ADDR) entry_pt, -1, 0); /* Let 'er rip... */
|
||||
/* Let 'er rip... */
|
||||
proceed ((CORE_ADDR) entry_pt, TARGET_SIGNAL_DEFAULT, 0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -485,7 +485,7 @@ hms_create_inferior (execfile, args, env)
|
||||
expect_prompt ();
|
||||
|
||||
insert_breakpoints (); /* Needed to get correct instruction in cache */
|
||||
proceed (entry_pt, -1, 0);
|
||||
proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0);
|
||||
}
|
||||
|
||||
/* Open a connection to a remote debugger.
|
||||
|
||||
@@ -1339,7 +1339,7 @@ mips_create_inferior (execfile, args, env)
|
||||
|
||||
/* FIXME: Should we set inferior_pid here? */
|
||||
|
||||
proceed (entry_pt, -1, 0);
|
||||
proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0);
|
||||
}
|
||||
|
||||
/* Clean up after a process. Actually nothing to do. */
|
||||
|
||||
@@ -180,7 +180,7 @@ Assuming you are at NYU debuging a kernel, i.e., no need to download.\n\n");
|
||||
init_wait_for_inferior ();
|
||||
clear_proceed_status ();
|
||||
stop_soon_quietly = 1;
|
||||
proceed(-1,-1,0);
|
||||
proceed (-1, TARGET_SIGNAL_DEFAULT, 0);
|
||||
normal_stop ();
|
||||
}
|
||||
/**************************************************** REMOTE_MOURN_INFERIOR */
|
||||
|
||||
@@ -309,7 +309,9 @@ monitor_create_inferior (execfile, args, env)
|
||||
target_terminal_inferior ();
|
||||
|
||||
/* insert_step_breakpoint (); FIXME, do we need this? */
|
||||
proceed ((CORE_ADDR)entry_pt, -1, 0); /* Let 'er rip... */
|
||||
|
||||
/* Let 'er rip... */
|
||||
proceed ((CORE_ADDR)entry_pt, TARGET_SIGNAL_DEFAULT, 0);
|
||||
}
|
||||
|
||||
/* Open a connection to a remote debugger.
|
||||
|
||||
@@ -609,7 +609,8 @@ nindy_create_inferior (execfile, args, env)
|
||||
target_terminal_inferior ();
|
||||
|
||||
/* insert_step_breakpoint (); FIXME, do we need this? */
|
||||
proceed ((CORE_ADDR)entry_pt, -1, 0); /* Let 'er rip... */
|
||||
/* Let 'er rip... */
|
||||
proceed ((CORE_ADDR)entry_pt, TARGET_SIGNAL_DEFAULT, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -196,7 +196,7 @@ gdbsim_create_inferior (exec_file, args, env)
|
||||
|
||||
inferior_pid = 42;
|
||||
insert_breakpoints (); /* Needed to get correct instruction in cache */
|
||||
proceed (entry_pt, -1, 0);
|
||||
proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0);
|
||||
}
|
||||
|
||||
/* The open routine takes the rest of the parameters from the command,
|
||||
|
||||
@@ -267,7 +267,8 @@ st2000_create_inferior (execfile, args, env)
|
||||
target_terminal_inferior ();
|
||||
|
||||
/* insert_step_breakpoint (); FIXME, do we need this? */
|
||||
proceed ((CORE_ADDR)entry_pt, -1, 0); /* Let 'er rip... */
|
||||
/* Let 'er rip... */
|
||||
proceed ((CORE_ADDR)entry_pt, TARGET_SIGNAL_DEFAULT, 0);
|
||||
}
|
||||
|
||||
/* Open a connection to a remote debugger.
|
||||
|
||||
@@ -167,7 +167,7 @@ udi_create_inferior (execfile, args, env)
|
||||
|
||||
init_wait_for_inferior ();
|
||||
clear_proceed_status ();
|
||||
proceed(-1,-1,0);
|
||||
proceed (-1, TARGET_SIGNAL_DEFAULT, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -235,7 +235,7 @@ vx_create_inferior (exec_file, args, env)
|
||||
stop_soon_quietly = 0;
|
||||
|
||||
/* insert_step_breakpoint (); FIXME, do we need this? */
|
||||
proceed(-1, -1, 0);
|
||||
proceed (-1, TARGET_SIGNAL_DEFAULT, 0);
|
||||
}
|
||||
|
||||
/* Fill ARGSTRUCT in argc/argv form with the arguments from the
|
||||
|
||||
@@ -158,7 +158,7 @@ sim_create_inferior (execfile, args, env)
|
||||
sim_clear_breakpoints ();
|
||||
init_wait_for_inferior ();
|
||||
insert_breakpoints ();
|
||||
proceed (entry_pt, -1, 0);
|
||||
proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0);
|
||||
}
|
||||
#if 0
|
||||
static void
|
||||
|
||||
Reference in New Issue
Block a user