2004-11-08 Andrew Cagney <cagney@gnu.org>
[deliverable/binutils-gdb.git] / gdb / infttrace.c
index 7f0910f5711c83337181216402fad17c1f58f0b0..4171651f6440252877b78fdeec7c9238641c9760 100644 (file)
@@ -1,7 +1,7 @@
 /* Low level Unix child interface to ttrace, for GDB when running under HP-UX.
-   Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998,
-   1999, 2000, 2001
-   Free Software Foundation, Inc.
+
+   Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
+   1998, 1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -27,6 +27,8 @@
 #include "gdb_string.h"
 #include "gdb_wait.h"
 #include "command.h"
+#include "gdbthread.h"
+#include "infttrace.h"
 
 /* We need pstat functionality so that we can get the exec file
    for a process we attach to.
 #undef  NO_FLAGS
 #endif
 
-#ifdef USG
-#include <sys/types.h>
-#endif
-
 #include <sys/param.h>
 #include <sys/dir.h>
 #include <signal.h>
 #endif
 
 #include "gdbcore.h"
-#ifndef        NO_SYS_FILE
+#ifdef HAVE_SYS_FILE_H
 #include <sys/file.h>
 #endif
 
@@ -141,12 +139,6 @@ static startup_semaphore_t startup_semaphore;
 static int vforking_child_pid = 0;
 static int vfork_in_flight = 0;
 
-/* To support PREPARE_TO_PROCEED (hppa_prepare_to_proceed).
- */
-static pid_t old_gdb_pid = 0;
-static pid_t reported_pid = 0;
-static int reported_bpt = 0;
-
 /* 1 if ok as results of a ttrace or ttrace_wait call, 0 otherwise.
  */
 #define TT_OK( _status, _errno ) \
@@ -2896,9 +2888,6 @@ ptrace_wait (ptid_t ptid, int *status)
       *status = _SIGTRAP;
     }
 
-  target_post_wait (pid_to_ptid (tsp.tts_pid), *status);
-
-
 #ifdef THREAD_DEBUG
   if (debug_on)
     printf ("Done waiting, pid is %d, tid %d\n", real_pid, real_tid);
@@ -2911,12 +2900,6 @@ ptrace_wait (ptid_t ptid, int *status)
    */
   return_pid = map_to_gdb_tid (real_tid);
 
-  /* Remember this for later use in "hppa_prepare_to_proceed".
-   */
-  old_gdb_pid = PIDGET (inferior_ptid);
-  reported_pid = return_pid;
-  reported_bpt = ((tsp.tts_event & TTEVT_SIGNAL) && (5 == tsp.tts_u.tts_signal.tts_signo));
-
   if (real_tid == 0 || return_pid == 0)
     {
       warning ("Internal error: process-wait failed.");
@@ -2947,7 +2930,7 @@ ptrace_wait (ptid_t ptid, int *status)
    child_acknowledge_created_inferior.)
  */
 int
-parent_attach_all (void)
+parent_attach_all (int p1, PTRACE_ARG3_TYPE p2, int p3)
 {
   int tt_status;
 
@@ -3674,7 +3657,7 @@ call_ptrace (int pt_request, int gdb_tid, PTRACE_ARG3_TYPE addr, int data)
          there's no need for any "break" statements.
        */
     case PT_SETTRC:
-      return parent_attach_all ();
+      return parent_attach_all (0, 0, 0);
 
     case PT_RUREGS:
       tt_status = read_from_register_save_state (gdb_tid,
@@ -3856,7 +3839,7 @@ kill_inferior (void)
 }
 
 
-#ifndef CHILD_RESUME
+#ifndef DEPRECATED_CHILD_RESUME
 
 /* Sanity check a thread about to be continued.
  */
@@ -3951,7 +3934,7 @@ threads_continue_all_but_one (lwpid_t gdb_tid, int signal)
        * state.tts_flags & TTS_STATEMASK == TTS_WASSUSPENDED
        */
       if (debug_on)
-       if (state.tts_flags & TTS_STATEMASK != TTS_WASSUSPENDED)
+       if ((state.tts_flags & TTS_STATEMASK) != TTS_WASSUSPENDED)
          printf ("About to continue non-stopped thread %d\n", scan_tid);
 #endif
 
@@ -4085,7 +4068,7 @@ threads_continue_all_with_signals (lwpid_t gdb_tid, int signal)
 
 #ifdef THREAD_DEBUG
       if (debug_on)
-       if (state.tts_flags & TTS_STATEMASK != TTS_WASSUSPENDED)
+       if ((state.tts_flags & TTS_STATEMASK) != TTS_WASSUSPENDED)
          warning ("About to continue non-stopped thread %d\n", scan_tid);
 #endif
 
@@ -4267,7 +4250,7 @@ threads_continue_one_with_signal (lwpid_t gdb_tid, int signal)
 }
 #endif
 
-#ifndef CHILD_RESUME
+#ifndef DEPRECATED_CHILD_RESUME
 
 /* Resume execution of the inferior process.
 
@@ -4523,7 +4506,15 @@ child_resume (ptid_t ptid, int step, enum target_signal signal)
         pending signal will be passed to the inferior.  interrupt.exp
         in the testsuite does this precise thing and fails due to the
         unwanted signal delivery to the inferior.  */
-      if (resume_all_threads)
+      /* drow/2002-12-05: However, note that we must use TT_PROC_CONTINUE
+        if we are tracing a vfork.  */
+      if (vfork_in_flight)
+       {
+         call_ttrace (TT_PROC_CONTINUE, tid, TT_NIL, TT_NIL, TT_NIL);
+         clear_all_handled ();
+         clear_all_stepping_mode ();
+       }
+      else if (resume_all_threads)
        {
 #ifdef THREAD_DEBUG
          if (debug_on)
@@ -4560,10 +4551,8 @@ child_resume (ptid_t ptid, int step, enum target_signal signal)
 #endif
 
 }
-#endif /* CHILD_RESUME */
+#endif /* DEPRECATED_CHILD_RESUME */
 \f
-
-#ifdef ATTACH_DETACH
 /*
  * Like it says.
  *
@@ -4735,10 +4724,8 @@ update_thread_state_after_attach (int pid, attach_continue_t kind_of_go)
 
   attach_flag = 1;
 }
-#endif /* ATTACH_DETACH */
 \f
 
-#ifdef ATTACH_DETACH
 /* Start debugging the process whose number is PID.
  * (A _real_ pid).
  */
@@ -4805,7 +4792,6 @@ detach (int signal)
 
   /* Process-state? */
 }
-#endif /* ATTACH_DETACH */
 \f
 
 /* Default the type of the ttrace transfer to int.  */
@@ -4829,28 +4815,28 @@ _initialize_kernel_u_addr (void)
    to debugger memory starting at MYADDR.   Copy to inferior if
    WRITE is nonzero.  TARGET is ignored.
 
-   Returns the length copied, which is either the LEN argument or zero.
-   This xfer function does not do partial moves, since child_ops
-   doesn't allow memory operations to cross below us in the target stack
-   anyway.  */
+   Returns the length copied, which is either the LEN argument or
+   zero.  This xfer function does not do partial moves, since
+   deprecated_child_ops doesn't allow memory operations to cross below
+   us in the target stack anyway.  */
 
 int
 child_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
                   struct mem_attrib *attrib,
                   struct target_ops *target)
 {
-  register int i;
+  int i;
   /* Round starting address down to longword boundary.  */
-  register CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (TTRACE_XFER_TYPE);
+  CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (TTRACE_XFER_TYPE);
   /* Round ending address up; get number of longwords that makes.  */
-  register int count
+  int count
   = (((memaddr + len) - addr) + sizeof (TTRACE_XFER_TYPE) - 1)
   / sizeof (TTRACE_XFER_TYPE);
   /* Allocate buffer of that many longwords.  */
   /* FIXME (alloca): This code, cloned from infptrace.c, is unsafe
      because it uses alloca to allocate a buffer of arbitrary size.
      For very large xfers, this could crash GDB's stack.  */
-  register TTRACE_XFER_TYPE *buffer
+  TTRACE_XFER_TYPE *buffer
     = (TTRACE_XFER_TYPE *) alloca (count * sizeof (TTRACE_XFER_TYPE));
 
   if (write)
@@ -5042,9 +5028,7 @@ pre_fork_inferior (void)
     }
 }
 
-/* Called via #define REQUIRE_ATTACH from inftarg.c,
- * ultimately from "follow_inferior_fork" in infrun.c,
- * itself called from "resume".
+/* Called from child_follow_fork in hppah-nat.c.
  *
  * This seems to be intended to attach after a fork or
  * vfork, while "attach" is used to attach to a pid
@@ -5372,8 +5356,7 @@ hppa_insert_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len, int type)
    watchpoints.
  */
 int
-hppa_remove_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len,
-                          enum bptype type)
+hppa_remove_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len, int type)
 {
   CORE_ADDR page_start;
   int dictionary_is_empty;
@@ -5433,7 +5416,7 @@ hppa_remove_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len,
    hardware support.
  */
 int
-hppa_can_use_hw_watchpoint (enum bptype type, int cnt, enum bptype ot)
+hppa_can_use_hw_watchpoint (int type, int cnt, int ot)
 {
   return (type == bp_hardware_watchpoint);
 }
@@ -5530,64 +5513,6 @@ hppa_pid_or_tid_to_str (ptid_t ptid)
 }
 \f
 
-/* If the current pid is not the pid this module reported
- * from "ptrace_wait" with the most recent event, then the
- * user has switched threads.
- *
- * If the last reported event was a breakpoint, then return
- * the old thread id, else return 0.
- */
-pid_t
-hppa_switched_threads (pid_t gdb_pid)
-{
-  if (gdb_pid == old_gdb_pid)
-    {
-      /*
-       * Core gdb is working with the same pid that it
-       * was before we reported the last event.  This
-       * is ok: e.g. we reported hitting a thread-specific
-       * breakpoint, but we were reporting the wrong
-       * thread, so the core just ignored the event.
-       *
-       * No thread switch has happened.
-       */
-      return (pid_t) 0;
-    }
-  else if (gdb_pid == reported_pid)
-    {
-      /*
-       * Core gdb is working with the pid we reported, so
-       * any continue or step will be able to figure out
-       * that it needs to step over any hit breakpoints
-       * without our (i.e. PREPARE_TO_PROCEED's) help.
-       */
-      return (pid_t) 0;
-    }
-  else if (!reported_bpt)
-    {
-      /*
-       * The core switched, but we didn't just report a
-       * breakpoint, so there's no just-hit breakpoint
-       * instruction at "reported_pid"'s PC, and thus there
-       * is no need to step over it.
-       */
-      return (pid_t) 0;
-    }
-  else
-    {
-      /* There's been a real switch, and we reported
-       * a hit breakpoint.  Let "hppa_prepare_to_proceed"
-       * know, so it can see whether the breakpoint is
-       * still active.
-       */
-      return reported_pid;
-    }
-
-  /* Keep compiler happy with an obvious return at the end.
-   */
-  return (pid_t) 0;
-}
-
 void
 hppa_ensure_vforking_parent_remains_stopped (int pid)
 {
This page took 0.031156 seconds and 4 git commands to generate.