Tue Nov 5 10:21:02 1996 Michael Snyder <msnyder@cleaver.cygnus.com>
[deliverable/binutils-gdb.git] / gdb / procfs.c
index eceb8baef0193fd8854e4f65496a0b4dd27f931b..f5e93fc5f9d62c8852f42bfcf7321009eb6070b8 100644 (file)
@@ -119,8 +119,6 @@ static struct pollfd *poll_list; /* pollfds used for waiting on /proc */
 
 static int num_poll_list = 0;  /* Number of entries in poll_list */
 
-static int last_resume_pid = -1; /* Last pid used with procfs_resume */
-
 /*  Much of the information used in the /proc interface, particularly for
     printing status information, is kept as tables of structures of the
     following form.  These tables can be used to map numeric values to
@@ -368,6 +366,50 @@ static char *syscall_table[MAX_SYSCALLS];
 
 /* Prototypes for local functions */
 
+static void procfs_stop PARAMS ((void));
+
+static int procfs_thread_alive PARAMS ((int));
+
+static int procfs_can_run PARAMS ((void));
+
+static void procfs_mourn_inferior PARAMS ((void));
+
+static void procfs_fetch_registers PARAMS ((int));
+
+static int procfs_wait PARAMS ((int, struct target_waitstatus *));
+
+static void procfs_open PARAMS ((char *, int));
+
+static void procfs_files_info PARAMS ((struct target_ops *));
+
+static void procfs_prepare_to_store PARAMS ((void));
+
+static void procfs_detach PARAMS ((char *, int));
+
+static void procfs_attach PARAMS ((char *, int));
+
+static void proc_set_exec_trap PARAMS ((void));
+
+static int procfs_init_inferior PARAMS ((int));
+
+static struct procinfo *create_procinfo PARAMS ((int));
+
+static void procfs_store_registers PARAMS ((int));
+
+static int procfs_xfer_memory PARAMS ((CORE_ADDR, char *, int, int, struct target_ops *));
+
+static void procfs_kill_inferior PARAMS ((void));
+
+static char *sigcodedesc PARAMS ((siginfo_t *));
+
+static char *sigcodename PARAMS ((siginfo_t *));
+
+static struct procinfo *wait_fd PARAMS ((void));
+
+static void remove_fd PARAMS ((struct procinfo *));
+
+static void add_fd PARAMS ((struct procinfo *));
+
 static void set_proc_siginfo PARAMS ((struct procinfo *, int));
 
 static void init_syscall_table PARAMS ((void));
@@ -587,8 +629,10 @@ static struct procinfo *
 wait_fd ()
 {
   struct procinfo *pi;
+#ifndef LOSING_POLL
   int num_fds;
   int i;
+#endif
 
   set_sigint_trap ();  /* Causes SIGINT to be passed on to the
                           attached process. */
@@ -1774,10 +1818,10 @@ procfs_init_inferior (pid)
 
   pip = create_procinfo (pid);
 
+#ifndef PIOCSSPCACT
   procfs_set_syscall_trap (pip, SYS_exit, PROCFS_SYSCALL_ENTRY,
                           procfs_exit_handler);
 
-#ifndef PRFS_STOPEXEC
 #ifdef SYS_exec
   procfs_set_syscall_trap (pip, SYS_exec, PROCFS_SYSCALL_EXIT,
                           procfs_exec_handler);
@@ -1790,7 +1834,7 @@ procfs_init_inferior (pid)
   procfs_set_syscall_trap (pip, SYS_execve, PROCFS_SYSCALL_EXIT,
                           procfs_exec_handler);
 #endif
-#endif  /* PRFS_STOPEXEC */
+#endif  /* PIOCSSPCACT */
 
   /* Setup traps on exit from sproc() */
 
@@ -1938,7 +1982,10 @@ proc_set_exec_trap ()
 
 #ifdef PIOCSSPCACT
   /* Under Alpha OSF/1 we have to use a PIOCSSPCACT ioctl to trace
-     exits from exec system calls because of the user level loader.  */
+     exits from exec system calls because of the user level loader.
+     Starting with OSF/1-4.0, tracing the entry to the exit system
+     call no longer works. So we have to use PRFS_STOPTERM to trace
+     termination of the inferior.  */
   {
     int prfs_flags;
 
@@ -1948,7 +1995,7 @@ proc_set_exec_trap ()
        gdb_flush (gdb_stderr);
        _exit (127);
       }
-    prfs_flags |= PRFS_STOPEXEC;
+    prfs_flags |= PRFS_STOPEXEC | PRFS_STOPTERM;
     if (ioctl (fd, PIOCSSPCACT, &prfs_flags) < 0)
       {
        perror (procname);
@@ -1956,7 +2003,7 @@ proc_set_exec_trap ()
        _exit (127);
       }
   }
-#else
+#else /* PIOCSSPCACT */
   /* GW: Rationale...
      Not all systems with /proc have all the exec* syscalls with the same
      names.  On the SGI, for example, there is no SYS_exec, but there
@@ -1978,7 +2025,6 @@ proc_set_exec_trap ()
       gdb_flush (gdb_stderr);
       _exit (127);
     }
-#endif
 
   praddset (&entryset, SYS_exit);
 
@@ -1988,6 +2034,7 @@ proc_set_exec_trap ()
       gdb_flush (gdb_stderr);
       _exit (126);
     }
+#endif /* PIOCSSPCACT */
 
   /* Turn off inherit-on-fork flag so that all grand-children of gdb
      start with tracing flags cleared. */
@@ -2287,7 +2334,6 @@ static int
 do_attach (pid)
      int pid;
 {
-  int result;
   struct procinfo *pi;
 
   pi = (struct procinfo *) xmalloc (sizeof (struct procinfo));
@@ -2411,7 +2457,6 @@ static void
 do_detach (signal)
      int signal;
 {
-  int result;
   struct procinfo *pi;
 
   pi = current_procinfo;
@@ -2602,6 +2647,27 @@ procfs_wait (pid, ourstatus)
                error ("PR_SYSEXIT, unhandled system call %d", what);
          }
          break;
+#ifdef PR_DEAD
+       case (short)PR_DEAD:
+         {
+           int dummy;
+
+           /* The inferior process is about to terminate.
+              pr_what has the process's exit or return value.
+              A PIOCRUN ioctl must be used to restart the process so it
+              can finish exiting.  */
+
+           pi->prrun.pr_flags = PRCFAULT;
+
+           if (ioctl (pi->fd, PIOCRUN, &pi->prrun) != 0)
+             perror_with_name (pi->pathname);
+
+           if (wait (&dummy) < 0)
+             rtnval = -1;
+           statval = pi->prstatus.pr_what;
+         }
+         break;
+#endif
        case PR_REQUESTED:
          statval = (SIGSTOP << 8) | 0177;
          break;
@@ -3833,7 +3899,9 @@ modify_inherit_on_fork_flag (fd, flag)
      int fd;
      int flag;
 {
+#ifdef PIOCSET
   long pr_flags;
+#endif
   int retval;
 
 #ifdef PIOCSET                 /* New method */
@@ -3884,7 +3952,9 @@ modify_run_on_last_close_flag (fd, flag)
      int fd;
      int flag;
 {
+#ifdef PIOCSET
   long pr_flags;
+#endif
   int retval;
 
 #ifdef PIOCSET                 /* New method */
This page took 0.025092 seconds and 4 git commands to generate.