+2012-07-06  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * linux-nat.c (resume_lwp, linux_nat_resume): Remove LP->SIGINFO
+       clearing.
+       (save_siginfo): Remove.
+       (stop_wait_callback, linux_nat_filter_event): Remove the save_siginfo
+       call.
+       (resume_stopped_resumed_lwps): Remove LP->SIGINFO clearing.
+       (linux_nat_get_siginfo): Use PTRACE_GETSIGINFO.
+       * linux-nat.h (struct lwp_info): Remove field siginfo.
+
 2012-07-06  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Code cleanup for the next patch.
 
                                step, signo);
          lp->stopped = 0;
          lp->step = step;
-         memset (&lp->siginfo, 0, sizeof (lp->siginfo));
          lp->stopped_by_watchpoint = 0;
        }
       else
   if (linux_nat_prepare_to_resume != NULL)
     linux_nat_prepare_to_resume (lp);
   linux_ops->to_resume (linux_ops, ptid, step, signo);
-  memset (&lp->siginfo, 0, sizeof (lp->siginfo));
   lp->stopped_by_watchpoint = 0;
 
   if (debug_linux_nat)
   return status;
 }
 
-/* Save the most recent siginfo for LP.  This is currently only called
-   for SIGTRAP; some ports use the si_addr field for
-   target_stopped_data_address.  In the future, it may also be used to
-   restore the siginfo of requeued signals.  */
-
-static void
-save_siginfo (struct lwp_info *lp)
-{
-  errno = 0;
-  ptrace (PTRACE_GETSIGINFO, GET_LWP (lp->ptid),
-         (PTRACE_TYPE_ARG3) 0, &lp->siginfo);
-
-  if (errno != 0)
-    memset (&lp->siginfo, 0, sizeof (lp->siginfo));
-}
-
 /* Send a SIGSTOP to LP.  */
 
 static int
        {
          /* The thread was stopped with a signal other than SIGSTOP.  */
 
-         /* Save the trap's siginfo in case we need it later.  */
-         save_siginfo (lp);
-
          save_sigtrap (lp);
 
          if (debug_linux_nat)
     }
 
   if (linux_nat_status_is_event (status))
-    {
-      /* Save the trap's siginfo in case we need it later.  */
-      save_siginfo (lp);
-
-      save_sigtrap (lp);
-    }
+    save_sigtrap (lp);
 
   /* Check if the thread has exited.  */
   if ((WIFEXITED (status) || WIFSIGNALED (status))
       linux_ops->to_resume (linux_ops, pid_to_ptid (GET_LWP (lp->ptid)),
                            lp->step, GDB_SIGNAL_0);
       lp->stopped = 0;
-      memset (&lp->siginfo, 0, sizeof (lp->siginfo));
       lp->stopped_by_watchpoint = 0;
     }
 
 int
 linux_nat_get_siginfo (ptid_t ptid, siginfo_t *siginfo)
 {
-  struct lwp_info *lp = find_lwp_pid (ptid);
-
-  gdb_assert (lp != NULL);
+  int pid;
 
-  *siginfo = lp->siginfo;
+  pid = GET_LWP (ptid);
+  if (pid == 0)
+    pid = GET_PID (ptid);
 
+  errno = 0;
+  ptrace (PTRACE_GETSIGINFO, pid, (PTRACE_TYPE_ARG3) 0, siginfo);
+  if (errno != 0)
+    {
+      memset (siginfo, 0, sizeof (*siginfo));
+      return 0;
+    }
   return 1;
 }