1b725ae77Skettenis /* Low level interface to ptrace, for the remote server for GDB.
2b725ae77Skettenis    Copyright 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004
3b725ae77Skettenis    Free Software Foundation, Inc.
4b725ae77Skettenis 
5b725ae77Skettenis    This file is part of GDB.
6b725ae77Skettenis 
7b725ae77Skettenis    This program is free software; you can redistribute it and/or modify
8b725ae77Skettenis    it under the terms of the GNU General Public License as published by
9b725ae77Skettenis    the Free Software Foundation; either version 2 of the License, or
10b725ae77Skettenis    (at your option) any later version.
11b725ae77Skettenis 
12b725ae77Skettenis    This program is distributed in the hope that it will be useful,
13b725ae77Skettenis    but WITHOUT ANY WARRANTY; without even the implied warranty of
14b725ae77Skettenis    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15b725ae77Skettenis    GNU General Public License for more details.
16b725ae77Skettenis 
17b725ae77Skettenis    You should have received a copy of the GNU General Public License
18b725ae77Skettenis    along with this program; if not, write to the Free Software
19b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330,
20b725ae77Skettenis    Boston, MA 02111-1307, USA.  */
21b725ae77Skettenis 
22b725ae77Skettenis #include "server.h"
23b725ae77Skettenis #include "linux-low.h"
24b725ae77Skettenis 
25b725ae77Skettenis #include <sys/wait.h>
26b725ae77Skettenis #include <stdio.h>
27b725ae77Skettenis #include <sys/param.h>
28b725ae77Skettenis #include <sys/dir.h>
29b725ae77Skettenis #include <sys/ptrace.h>
30b725ae77Skettenis #include <sys/user.h>
31b725ae77Skettenis #include <signal.h>
32b725ae77Skettenis #include <sys/ioctl.h>
33b725ae77Skettenis #include <fcntl.h>
34b725ae77Skettenis #include <string.h>
35b725ae77Skettenis #include <stdlib.h>
36b725ae77Skettenis #include <unistd.h>
37b725ae77Skettenis #include <errno.h>
38*11efff7fSkettenis #include <sys/syscall.h>
39b725ae77Skettenis 
40b725ae77Skettenis /* ``all_threads'' is keyed by the LWP ID - it should be the thread ID instead,
41b725ae77Skettenis    however.  This requires changing the ID in place when we go from !using_threads
42b725ae77Skettenis    to using_threads, immediately.
43b725ae77Skettenis 
44b725ae77Skettenis    ``all_processes'' is keyed by the process ID - which on Linux is (presently)
45b725ae77Skettenis    the same as the LWP ID.  */
46b725ae77Skettenis 
47b725ae77Skettenis struct inferior_list all_processes;
48b725ae77Skettenis 
49b725ae77Skettenis /* FIXME this is a bit of a hack, and could be removed.  */
50b725ae77Skettenis int stopping_threads;
51b725ae77Skettenis 
52b725ae77Skettenis /* FIXME make into a target method?  */
53b725ae77Skettenis int using_threads;
54b725ae77Skettenis 
55b725ae77Skettenis static void linux_resume_one_process (struct inferior_list_entry *entry,
56b725ae77Skettenis 				      int step, int signal);
57b725ae77Skettenis static void linux_resume (struct thread_resume *resume_info);
58b725ae77Skettenis static void stop_all_processes (void);
59b725ae77Skettenis static int linux_wait_for_event (struct thread_info *child);
60b725ae77Skettenis 
61b725ae77Skettenis struct pending_signals
62b725ae77Skettenis {
63b725ae77Skettenis   int signal;
64b725ae77Skettenis   struct pending_signals *prev;
65b725ae77Skettenis };
66b725ae77Skettenis 
67b725ae77Skettenis #define PTRACE_ARG3_TYPE long
68b725ae77Skettenis #define PTRACE_XFER_TYPE long
69b725ae77Skettenis 
70b725ae77Skettenis #ifdef HAVE_LINUX_REGSETS
71b725ae77Skettenis static int use_regsets_p = 1;
72b725ae77Skettenis #endif
73b725ae77Skettenis 
74b725ae77Skettenis int debug_threads = 0;
75b725ae77Skettenis 
76b725ae77Skettenis #define pid_of(proc) ((proc)->head.id)
77b725ae77Skettenis 
78b725ae77Skettenis /* FIXME: Delete eventually.  */
79b725ae77Skettenis #define inferior_pid (pid_of (get_thread_process (current_inferior)))
80b725ae77Skettenis 
81b725ae77Skettenis /* This function should only be called if the process got a SIGTRAP.
82b725ae77Skettenis    The SIGTRAP could mean several things.
83b725ae77Skettenis 
84b725ae77Skettenis    On i386, where decr_pc_after_break is non-zero:
85b725ae77Skettenis    If we were single-stepping this process using PTRACE_SINGLESTEP,
86b725ae77Skettenis    we will get only the one SIGTRAP (even if the instruction we
87b725ae77Skettenis    stepped over was a breakpoint).  The value of $eip will be the
88b725ae77Skettenis    next instruction.
89b725ae77Skettenis    If we continue the process using PTRACE_CONT, we will get a
90b725ae77Skettenis    SIGTRAP when we hit a breakpoint.  The value of $eip will be
91b725ae77Skettenis    the instruction after the breakpoint (i.e. needs to be
92b725ae77Skettenis    decremented).  If we report the SIGTRAP to GDB, we must also
93b725ae77Skettenis    report the undecremented PC.  If we cancel the SIGTRAP, we
94b725ae77Skettenis    must resume at the decremented PC.
95b725ae77Skettenis 
96b725ae77Skettenis    (Presumably, not yet tested) On a non-decr_pc_after_break machine
97b725ae77Skettenis    with hardware or kernel single-step:
98b725ae77Skettenis    If we single-step over a breakpoint instruction, our PC will
99b725ae77Skettenis    point at the following instruction.  If we continue and hit a
100b725ae77Skettenis    breakpoint instruction, our PC will point at the breakpoint
101b725ae77Skettenis    instruction.  */
102b725ae77Skettenis 
103b725ae77Skettenis static CORE_ADDR
get_stop_pc(void)104b725ae77Skettenis get_stop_pc (void)
105b725ae77Skettenis {
106b725ae77Skettenis   CORE_ADDR stop_pc = (*the_low_target.get_pc) ();
107b725ae77Skettenis 
108b725ae77Skettenis   if (get_thread_process (current_inferior)->stepping)
109b725ae77Skettenis     return stop_pc;
110b725ae77Skettenis   else
111b725ae77Skettenis     return stop_pc - the_low_target.decr_pc_after_break;
112b725ae77Skettenis }
113b725ae77Skettenis 
114b725ae77Skettenis static void *
add_process(int pid)115b725ae77Skettenis add_process (int pid)
116b725ae77Skettenis {
117b725ae77Skettenis   struct process_info *process;
118b725ae77Skettenis 
119b725ae77Skettenis   process = (struct process_info *) malloc (sizeof (*process));
120b725ae77Skettenis   memset (process, 0, sizeof (*process));
121b725ae77Skettenis 
122b725ae77Skettenis   process->head.id = pid;
123b725ae77Skettenis 
124b725ae77Skettenis   /* Default to tid == lwpid == pid.  */
125b725ae77Skettenis   process->tid = pid;
126b725ae77Skettenis   process->lwpid = pid;
127b725ae77Skettenis 
128b725ae77Skettenis   add_inferior_to_list (&all_processes, &process->head);
129b725ae77Skettenis 
130b725ae77Skettenis   return process;
131b725ae77Skettenis }
132b725ae77Skettenis 
133b725ae77Skettenis /* Start an inferior process and returns its pid.
134b725ae77Skettenis    ALLARGS is a vector of program-name and args. */
135b725ae77Skettenis 
136b725ae77Skettenis static int
linux_create_inferior(char * program,char ** allargs)137b725ae77Skettenis linux_create_inferior (char *program, char **allargs)
138b725ae77Skettenis {
139b725ae77Skettenis   void *new_process;
140b725ae77Skettenis   int pid;
141b725ae77Skettenis 
142b725ae77Skettenis   pid = fork ();
143b725ae77Skettenis   if (pid < 0)
144b725ae77Skettenis     perror_with_name ("fork");
145b725ae77Skettenis 
146b725ae77Skettenis   if (pid == 0)
147b725ae77Skettenis     {
148b725ae77Skettenis       ptrace (PTRACE_TRACEME, 0, 0, 0);
149b725ae77Skettenis 
150b725ae77Skettenis       signal (__SIGRTMIN + 1, SIG_DFL);
151b725ae77Skettenis 
152b725ae77Skettenis       setpgid (0, 0);
153b725ae77Skettenis 
154b725ae77Skettenis       execv (program, allargs);
155b725ae77Skettenis 
156b725ae77Skettenis       fprintf (stderr, "Cannot exec %s: %s.\n", program,
157b725ae77Skettenis 	       strerror (errno));
158b725ae77Skettenis       fflush (stderr);
159b725ae77Skettenis       _exit (0177);
160b725ae77Skettenis     }
161b725ae77Skettenis 
162b725ae77Skettenis   new_process = add_process (pid);
163b725ae77Skettenis   add_thread (pid, new_process);
164b725ae77Skettenis 
165b725ae77Skettenis   return pid;
166b725ae77Skettenis }
167b725ae77Skettenis 
168b725ae77Skettenis /* Attach to an inferior process.  */
169b725ae77Skettenis 
170b725ae77Skettenis void
linux_attach_lwp(int pid,int tid)171b725ae77Skettenis linux_attach_lwp (int pid, int tid)
172b725ae77Skettenis {
173b725ae77Skettenis   struct process_info *new_process;
174b725ae77Skettenis 
175b725ae77Skettenis   if (ptrace (PTRACE_ATTACH, pid, 0, 0) != 0)
176b725ae77Skettenis     {
177b725ae77Skettenis       fprintf (stderr, "Cannot attach to process %d: %s (%d)\n", pid,
178b725ae77Skettenis 	       strerror (errno), errno);
179b725ae77Skettenis       fflush (stderr);
180b725ae77Skettenis 
181b725ae77Skettenis       /* If we fail to attach to an LWP, just return.  */
182b725ae77Skettenis       if (!using_threads)
183b725ae77Skettenis 	_exit (0177);
184b725ae77Skettenis       return;
185b725ae77Skettenis     }
186b725ae77Skettenis 
187b725ae77Skettenis   new_process = (struct process_info *) add_process (pid);
188b725ae77Skettenis   add_thread (tid, new_process);
189b725ae77Skettenis 
190b725ae77Skettenis   /* The next time we wait for this LWP we'll see a SIGSTOP as PTRACE_ATTACH
191b725ae77Skettenis      brings it to a halt.  We should ignore that SIGSTOP and resume the process
192b725ae77Skettenis      (unless this is the first process, in which case the flag will be cleared
193b725ae77Skettenis      in linux_attach).
194b725ae77Skettenis 
195b725ae77Skettenis      On the other hand, if we are currently trying to stop all threads, we
196b725ae77Skettenis      should treat the new thread as if we had sent it a SIGSTOP.  This works
197b725ae77Skettenis      because we are guaranteed that add_process added us to the end of the
198b725ae77Skettenis      list, and so the new thread has not yet reached wait_for_sigstop (but
199b725ae77Skettenis      will).  */
200b725ae77Skettenis   if (! stopping_threads)
201b725ae77Skettenis     new_process->stop_expected = 1;
202b725ae77Skettenis }
203b725ae77Skettenis 
204b725ae77Skettenis int
linux_attach(int pid)205b725ae77Skettenis linux_attach (int pid)
206b725ae77Skettenis {
207b725ae77Skettenis   struct process_info *process;
208b725ae77Skettenis 
209b725ae77Skettenis   linux_attach_lwp (pid, pid);
210b725ae77Skettenis 
211b725ae77Skettenis   /* Don't ignore the initial SIGSTOP if we just attached to this process.  */
212b725ae77Skettenis   process = (struct process_info *) find_inferior_id (&all_processes, pid);
213b725ae77Skettenis   process->stop_expected = 0;
214b725ae77Skettenis 
215b725ae77Skettenis   return 0;
216b725ae77Skettenis }
217b725ae77Skettenis 
218b725ae77Skettenis /* Kill the inferior process.  Make us have no inferior.  */
219b725ae77Skettenis 
220b725ae77Skettenis static void
linux_kill_one_process(struct inferior_list_entry * entry)221b725ae77Skettenis linux_kill_one_process (struct inferior_list_entry *entry)
222b725ae77Skettenis {
223b725ae77Skettenis   struct thread_info *thread = (struct thread_info *) entry;
224b725ae77Skettenis   struct process_info *process = get_thread_process (thread);
225b725ae77Skettenis   int wstat;
226b725ae77Skettenis 
227*11efff7fSkettenis   /* We avoid killing the first thread here, because of a Linux kernel (at
228*11efff7fSkettenis      least 2.6.0-test7 through 2.6.8-rc4) bug; if we kill the parent before
229*11efff7fSkettenis      the children get a chance to be reaped, it will remain a zombie
230*11efff7fSkettenis      forever.  */
231*11efff7fSkettenis   if (entry == all_threads.head)
232*11efff7fSkettenis     return;
233*11efff7fSkettenis 
234b725ae77Skettenis   do
235b725ae77Skettenis     {
236b725ae77Skettenis       ptrace (PTRACE_KILL, pid_of (process), 0, 0);
237b725ae77Skettenis 
238b725ae77Skettenis       /* Make sure it died.  The loop is most likely unnecessary.  */
239b725ae77Skettenis       wstat = linux_wait_for_event (thread);
240b725ae77Skettenis     } while (WIFSTOPPED (wstat));
241b725ae77Skettenis }
242b725ae77Skettenis 
243b725ae77Skettenis static void
linux_kill(void)244b725ae77Skettenis linux_kill (void)
245b725ae77Skettenis {
246*11efff7fSkettenis   struct thread_info *thread = (struct thread_info *) all_threads.head;
247*11efff7fSkettenis   struct process_info *process = get_thread_process (thread);
248*11efff7fSkettenis   int wstat;
249*11efff7fSkettenis 
250b725ae77Skettenis   for_each_inferior (&all_threads, linux_kill_one_process);
251*11efff7fSkettenis 
252*11efff7fSkettenis   /* See the comment in linux_kill_one_process.  We did not kill the first
253*11efff7fSkettenis      thread in the list, so do so now.  */
254*11efff7fSkettenis   do
255*11efff7fSkettenis     {
256*11efff7fSkettenis       ptrace (PTRACE_KILL, pid_of (process), 0, 0);
257*11efff7fSkettenis 
258*11efff7fSkettenis       /* Make sure it died.  The loop is most likely unnecessary.  */
259*11efff7fSkettenis       wstat = linux_wait_for_event (thread);
260*11efff7fSkettenis     } while (WIFSTOPPED (wstat));
261b725ae77Skettenis }
262b725ae77Skettenis 
263b725ae77Skettenis static void
linux_detach_one_process(struct inferior_list_entry * entry)264b725ae77Skettenis linux_detach_one_process (struct inferior_list_entry *entry)
265b725ae77Skettenis {
266b725ae77Skettenis   struct thread_info *thread = (struct thread_info *) entry;
267b725ae77Skettenis   struct process_info *process = get_thread_process (thread);
268b725ae77Skettenis 
269b725ae77Skettenis   ptrace (PTRACE_DETACH, pid_of (process), 0, 0);
270b725ae77Skettenis }
271b725ae77Skettenis 
272b725ae77Skettenis static void
linux_detach(void)273b725ae77Skettenis linux_detach (void)
274b725ae77Skettenis {
275b725ae77Skettenis   for_each_inferior (&all_threads, linux_detach_one_process);
276b725ae77Skettenis }
277b725ae77Skettenis 
278b725ae77Skettenis /* Return nonzero if the given thread is still alive.  */
279b725ae77Skettenis static int
linux_thread_alive(int tid)280b725ae77Skettenis linux_thread_alive (int tid)
281b725ae77Skettenis {
282b725ae77Skettenis   if (find_inferior_id (&all_threads, tid) != NULL)
283b725ae77Skettenis     return 1;
284b725ae77Skettenis   else
285b725ae77Skettenis     return 0;
286b725ae77Skettenis }
287b725ae77Skettenis 
288b725ae77Skettenis /* Return nonzero if this process stopped at a breakpoint which
289b725ae77Skettenis    no longer appears to be inserted.  Also adjust the PC
290b725ae77Skettenis    appropriately to resume where the breakpoint used to be.  */
291b725ae77Skettenis static int
check_removed_breakpoint(struct process_info * event_child)292b725ae77Skettenis check_removed_breakpoint (struct process_info *event_child)
293b725ae77Skettenis {
294b725ae77Skettenis   CORE_ADDR stop_pc;
295b725ae77Skettenis   struct thread_info *saved_inferior;
296b725ae77Skettenis 
297b725ae77Skettenis   if (event_child->pending_is_breakpoint == 0)
298b725ae77Skettenis     return 0;
299b725ae77Skettenis 
300b725ae77Skettenis   if (debug_threads)
301b725ae77Skettenis     fprintf (stderr, "Checking for breakpoint.\n");
302b725ae77Skettenis 
303b725ae77Skettenis   saved_inferior = current_inferior;
304b725ae77Skettenis   current_inferior = get_process_thread (event_child);
305b725ae77Skettenis 
306b725ae77Skettenis   stop_pc = get_stop_pc ();
307b725ae77Skettenis 
308b725ae77Skettenis   /* If the PC has changed since we stopped, then we shouldn't do
309b725ae77Skettenis      anything.  This happens if, for instance, GDB handled the
310b725ae77Skettenis      decr_pc_after_break subtraction itself.  */
311b725ae77Skettenis   if (stop_pc != event_child->pending_stop_pc)
312b725ae77Skettenis     {
313b725ae77Skettenis       if (debug_threads)
314b725ae77Skettenis 	fprintf (stderr, "Ignoring, PC was changed.\n");
315b725ae77Skettenis 
316b725ae77Skettenis       event_child->pending_is_breakpoint = 0;
317b725ae77Skettenis       current_inferior = saved_inferior;
318b725ae77Skettenis       return 0;
319b725ae77Skettenis     }
320b725ae77Skettenis 
321b725ae77Skettenis   /* If the breakpoint is still there, we will report hitting it.  */
322b725ae77Skettenis   if ((*the_low_target.breakpoint_at) (stop_pc))
323b725ae77Skettenis     {
324b725ae77Skettenis       if (debug_threads)
325b725ae77Skettenis 	fprintf (stderr, "Ignoring, breakpoint is still present.\n");
326b725ae77Skettenis       current_inferior = saved_inferior;
327b725ae77Skettenis       return 0;
328b725ae77Skettenis     }
329b725ae77Skettenis 
330b725ae77Skettenis   if (debug_threads)
331b725ae77Skettenis     fprintf (stderr, "Removed breakpoint.\n");
332b725ae77Skettenis 
333b725ae77Skettenis   /* For decr_pc_after_break targets, here is where we perform the
334b725ae77Skettenis      decrement.  We go immediately from this function to resuming,
335b725ae77Skettenis      and can not safely call get_stop_pc () again.  */
336b725ae77Skettenis   if (the_low_target.set_pc != NULL)
337b725ae77Skettenis     (*the_low_target.set_pc) (stop_pc);
338b725ae77Skettenis 
339b725ae77Skettenis   /* We consumed the pending SIGTRAP.  */
340b725ae77Skettenis   event_child->pending_is_breakpoint = 0;
341b725ae77Skettenis   event_child->status_pending_p = 0;
342b725ae77Skettenis   event_child->status_pending = 0;
343b725ae77Skettenis 
344b725ae77Skettenis   current_inferior = saved_inferior;
345b725ae77Skettenis   return 1;
346b725ae77Skettenis }
347b725ae77Skettenis 
348b725ae77Skettenis /* Return 1 if this process has an interesting status pending.  This function
349b725ae77Skettenis    may silently resume an inferior process.  */
350b725ae77Skettenis static int
status_pending_p(struct inferior_list_entry * entry,void * dummy)351b725ae77Skettenis status_pending_p (struct inferior_list_entry *entry, void *dummy)
352b725ae77Skettenis {
353b725ae77Skettenis   struct process_info *process = (struct process_info *) entry;
354b725ae77Skettenis 
355b725ae77Skettenis   if (process->status_pending_p)
356b725ae77Skettenis     if (check_removed_breakpoint (process))
357b725ae77Skettenis       {
358b725ae77Skettenis 	/* This thread was stopped at a breakpoint, and the breakpoint
359b725ae77Skettenis 	   is now gone.  We were told to continue (or step...) all threads,
360b725ae77Skettenis 	   so GDB isn't trying to single-step past this breakpoint.
361b725ae77Skettenis 	   So instead of reporting the old SIGTRAP, pretend we got to
362b725ae77Skettenis 	   the breakpoint just after it was removed instead of just
363b725ae77Skettenis 	   before; resume the process.  */
364b725ae77Skettenis 	linux_resume_one_process (&process->head, 0, 0);
365b725ae77Skettenis 	return 0;
366b725ae77Skettenis       }
367b725ae77Skettenis 
368b725ae77Skettenis   return process->status_pending_p;
369b725ae77Skettenis }
370b725ae77Skettenis 
371b725ae77Skettenis static void
linux_wait_for_process(struct process_info ** childp,int * wstatp)372b725ae77Skettenis linux_wait_for_process (struct process_info **childp, int *wstatp)
373b725ae77Skettenis {
374b725ae77Skettenis   int ret;
375b725ae77Skettenis   int to_wait_for = -1;
376b725ae77Skettenis 
377b725ae77Skettenis   if (*childp != NULL)
378b725ae77Skettenis     to_wait_for = (*childp)->lwpid;
379b725ae77Skettenis 
380b725ae77Skettenis   while (1)
381b725ae77Skettenis     {
382b725ae77Skettenis       ret = waitpid (to_wait_for, wstatp, WNOHANG);
383b725ae77Skettenis 
384b725ae77Skettenis       if (ret == -1)
385b725ae77Skettenis 	{
386b725ae77Skettenis 	  if (errno != ECHILD)
387b725ae77Skettenis 	    perror_with_name ("waitpid");
388b725ae77Skettenis 	}
389b725ae77Skettenis       else if (ret > 0)
390b725ae77Skettenis 	break;
391b725ae77Skettenis 
392b725ae77Skettenis       ret = waitpid (to_wait_for, wstatp, WNOHANG | __WCLONE);
393b725ae77Skettenis 
394b725ae77Skettenis       if (ret == -1)
395b725ae77Skettenis 	{
396b725ae77Skettenis 	  if (errno != ECHILD)
397b725ae77Skettenis 	    perror_with_name ("waitpid (WCLONE)");
398b725ae77Skettenis 	}
399b725ae77Skettenis       else if (ret > 0)
400b725ae77Skettenis 	break;
401b725ae77Skettenis 
402b725ae77Skettenis       usleep (1000);
403b725ae77Skettenis     }
404b725ae77Skettenis 
405b725ae77Skettenis   if (debug_threads
406b725ae77Skettenis       && (!WIFSTOPPED (*wstatp)
407b725ae77Skettenis 	  || (WSTOPSIG (*wstatp) != 32
408b725ae77Skettenis 	      && WSTOPSIG (*wstatp) != 33)))
409b725ae77Skettenis     fprintf (stderr, "Got an event from %d (%x)\n", ret, *wstatp);
410b725ae77Skettenis 
411b725ae77Skettenis   if (to_wait_for == -1)
412b725ae77Skettenis     *childp = (struct process_info *) find_inferior_id (&all_processes, ret);
413b725ae77Skettenis 
414b725ae77Skettenis   (*childp)->stopped = 1;
415b725ae77Skettenis   (*childp)->pending_is_breakpoint = 0;
416b725ae77Skettenis 
417b725ae77Skettenis   if (debug_threads
418b725ae77Skettenis       && WIFSTOPPED (*wstatp))
419b725ae77Skettenis     {
420b725ae77Skettenis       current_inferior = (struct thread_info *)
421b725ae77Skettenis 	find_inferior_id (&all_threads, (*childp)->tid);
422b725ae77Skettenis       /* For testing only; i386_stop_pc prints out a diagnostic.  */
423b725ae77Skettenis       if (the_low_target.get_pc != NULL)
424b725ae77Skettenis 	get_stop_pc ();
425b725ae77Skettenis     }
426b725ae77Skettenis }
427b725ae77Skettenis 
428b725ae77Skettenis static int
linux_wait_for_event(struct thread_info * child)429b725ae77Skettenis linux_wait_for_event (struct thread_info *child)
430b725ae77Skettenis {
431b725ae77Skettenis   CORE_ADDR stop_pc;
432b725ae77Skettenis   struct process_info *event_child;
433b725ae77Skettenis   int wstat;
434b725ae77Skettenis 
435b725ae77Skettenis   /* Check for a process with a pending status.  */
436b725ae77Skettenis   /* It is possible that the user changed the pending task's registers since
437b725ae77Skettenis      it stopped.  We correctly handle the change of PC if we hit a breakpoint
438b725ae77Skettenis      (in check_removed_breakpoint); signals should be reported anyway.  */
439b725ae77Skettenis   if (child == NULL)
440b725ae77Skettenis     {
441b725ae77Skettenis       event_child = (struct process_info *)
442b725ae77Skettenis 	find_inferior (&all_processes, status_pending_p, NULL);
443b725ae77Skettenis       if (debug_threads && event_child)
444b725ae77Skettenis 	fprintf (stderr, "Got a pending child %d\n", event_child->lwpid);
445b725ae77Skettenis     }
446b725ae77Skettenis   else
447b725ae77Skettenis     {
448b725ae77Skettenis       event_child = get_thread_process (child);
449b725ae77Skettenis       if (event_child->status_pending_p
450b725ae77Skettenis 	  && check_removed_breakpoint (event_child))
451b725ae77Skettenis 	event_child = NULL;
452b725ae77Skettenis     }
453b725ae77Skettenis 
454b725ae77Skettenis   if (event_child != NULL)
455b725ae77Skettenis     {
456b725ae77Skettenis       if (event_child->status_pending_p)
457b725ae77Skettenis 	{
458b725ae77Skettenis 	  if (debug_threads)
459b725ae77Skettenis 	    fprintf (stderr, "Got an event from pending child %d (%04x)\n",
460b725ae77Skettenis 		     event_child->lwpid, event_child->status_pending);
461b725ae77Skettenis 	  wstat = event_child->status_pending;
462b725ae77Skettenis 	  event_child->status_pending_p = 0;
463b725ae77Skettenis 	  event_child->status_pending = 0;
464b725ae77Skettenis 	  current_inferior = get_process_thread (event_child);
465b725ae77Skettenis 	  return wstat;
466b725ae77Skettenis 	}
467b725ae77Skettenis     }
468b725ae77Skettenis 
469b725ae77Skettenis   /* We only enter this loop if no process has a pending wait status.  Thus
470b725ae77Skettenis      any action taken in response to a wait status inside this loop is
471b725ae77Skettenis      responding as soon as we detect the status, not after any pending
472b725ae77Skettenis      events.  */
473b725ae77Skettenis   while (1)
474b725ae77Skettenis     {
475b725ae77Skettenis       if (child == NULL)
476b725ae77Skettenis 	event_child = NULL;
477b725ae77Skettenis       else
478b725ae77Skettenis 	event_child = get_thread_process (child);
479b725ae77Skettenis 
480b725ae77Skettenis       linux_wait_for_process (&event_child, &wstat);
481b725ae77Skettenis 
482b725ae77Skettenis       if (event_child == NULL)
483b725ae77Skettenis 	error ("event from unknown child");
484b725ae77Skettenis 
485b725ae77Skettenis       current_inferior = (struct thread_info *)
486b725ae77Skettenis 	find_inferior_id (&all_threads, event_child->tid);
487b725ae77Skettenis 
488b725ae77Skettenis       if (using_threads)
489b725ae77Skettenis 	{
490b725ae77Skettenis 	  /* Check for thread exit.  */
491b725ae77Skettenis 	  if (! WIFSTOPPED (wstat))
492b725ae77Skettenis 	    {
493b725ae77Skettenis 	      if (debug_threads)
494b725ae77Skettenis 		fprintf (stderr, "Thread %d (LWP %d) exiting\n",
495b725ae77Skettenis 			 event_child->tid, event_child->head.id);
496b725ae77Skettenis 
497b725ae77Skettenis 	      /* If the last thread is exiting, just return.  */
498b725ae77Skettenis 	      if (all_threads.head == all_threads.tail)
499b725ae77Skettenis 		return wstat;
500b725ae77Skettenis 
501b725ae77Skettenis 	      dead_thread_notify (event_child->tid);
502b725ae77Skettenis 
503b725ae77Skettenis 	      remove_inferior (&all_processes, &event_child->head);
504b725ae77Skettenis 	      free (event_child);
505b725ae77Skettenis 	      remove_thread (current_inferior);
506b725ae77Skettenis 	      current_inferior = (struct thread_info *) all_threads.head;
507b725ae77Skettenis 
508b725ae77Skettenis 	      /* If we were waiting for this particular child to do something...
509b725ae77Skettenis 		 well, it did something.  */
510b725ae77Skettenis 	      if (child != NULL)
511b725ae77Skettenis 		return wstat;
512b725ae77Skettenis 
513b725ae77Skettenis 	      /* Wait for a more interesting event.  */
514b725ae77Skettenis 	      continue;
515b725ae77Skettenis 	    }
516b725ae77Skettenis 
517b725ae77Skettenis 	  if (WIFSTOPPED (wstat)
518b725ae77Skettenis 	      && WSTOPSIG (wstat) == SIGSTOP
519b725ae77Skettenis 	      && event_child->stop_expected)
520b725ae77Skettenis 	    {
521b725ae77Skettenis 	      if (debug_threads)
522b725ae77Skettenis 		fprintf (stderr, "Expected stop.\n");
523b725ae77Skettenis 	      event_child->stop_expected = 0;
524b725ae77Skettenis 	      linux_resume_one_process (&event_child->head,
525b725ae77Skettenis 					event_child->stepping, 0);
526b725ae77Skettenis 	      continue;
527b725ae77Skettenis 	    }
528b725ae77Skettenis 
529b725ae77Skettenis 	  /* FIXME drow/2002-06-09: Get signal numbers from the inferior's
530b725ae77Skettenis 	     thread library?  */
531b725ae77Skettenis 	  if (WIFSTOPPED (wstat)
532b725ae77Skettenis 	      && (WSTOPSIG (wstat) == __SIGRTMIN
533b725ae77Skettenis 		  || WSTOPSIG (wstat) == __SIGRTMIN + 1))
534b725ae77Skettenis 	    {
535b725ae77Skettenis 	      if (debug_threads)
536b725ae77Skettenis 		fprintf (stderr, "Ignored signal %d for %d (LWP %d).\n",
537b725ae77Skettenis 			 WSTOPSIG (wstat), event_child->tid,
538b725ae77Skettenis 			 event_child->head.id);
539b725ae77Skettenis 	      linux_resume_one_process (&event_child->head,
540b725ae77Skettenis 					event_child->stepping,
541b725ae77Skettenis 					WSTOPSIG (wstat));
542b725ae77Skettenis 	      continue;
543b725ae77Skettenis 	    }
544b725ae77Skettenis 	}
545b725ae77Skettenis 
546b725ae77Skettenis       /* If this event was not handled above, and is not a SIGTRAP, report
547b725ae77Skettenis 	 it.  */
548b725ae77Skettenis       if (!WIFSTOPPED (wstat) || WSTOPSIG (wstat) != SIGTRAP)
549b725ae77Skettenis 	return wstat;
550b725ae77Skettenis 
551b725ae77Skettenis       /* If this target does not support breakpoints, we simply report the
552b725ae77Skettenis 	 SIGTRAP; it's of no concern to us.  */
553b725ae77Skettenis       if (the_low_target.get_pc == NULL)
554b725ae77Skettenis 	return wstat;
555b725ae77Skettenis 
556b725ae77Skettenis       stop_pc = get_stop_pc ();
557b725ae77Skettenis 
558b725ae77Skettenis       /* bp_reinsert will only be set if we were single-stepping.
559b725ae77Skettenis 	 Notice that we will resume the process after hitting
560b725ae77Skettenis 	 a gdbserver breakpoint; single-stepping to/over one
561b725ae77Skettenis 	 is not supported (yet).  */
562b725ae77Skettenis       if (event_child->bp_reinsert != 0)
563b725ae77Skettenis 	{
564b725ae77Skettenis 	  if (debug_threads)
565b725ae77Skettenis 	    fprintf (stderr, "Reinserted breakpoint.\n");
566b725ae77Skettenis 	  reinsert_breakpoint (event_child->bp_reinsert);
567b725ae77Skettenis 	  event_child->bp_reinsert = 0;
568b725ae77Skettenis 
569b725ae77Skettenis 	  /* Clear the single-stepping flag and SIGTRAP as we resume.  */
570b725ae77Skettenis 	  linux_resume_one_process (&event_child->head, 0, 0);
571b725ae77Skettenis 	  continue;
572b725ae77Skettenis 	}
573b725ae77Skettenis 
574b725ae77Skettenis       if (debug_threads)
575b725ae77Skettenis 	fprintf (stderr, "Hit a (non-reinsert) breakpoint.\n");
576b725ae77Skettenis 
577b725ae77Skettenis       if (check_breakpoints (stop_pc) != 0)
578b725ae77Skettenis 	{
579b725ae77Skettenis 	  /* We hit one of our own breakpoints.  We mark it as a pending
580b725ae77Skettenis 	     breakpoint, so that check_removed_breakpoint () will do the PC
581b725ae77Skettenis 	     adjustment for us at the appropriate time.  */
582b725ae77Skettenis 	  event_child->pending_is_breakpoint = 1;
583b725ae77Skettenis 	  event_child->pending_stop_pc = stop_pc;
584b725ae77Skettenis 
585b725ae77Skettenis 	  /* Now we need to put the breakpoint back.  We continue in the event
586b725ae77Skettenis 	     loop instead of simply replacing the breakpoint right away,
587b725ae77Skettenis 	     in order to not lose signals sent to the thread that hit the
588b725ae77Skettenis 	     breakpoint.  Unfortunately this increases the window where another
589b725ae77Skettenis 	     thread could sneak past the removed breakpoint.  For the current
590b725ae77Skettenis 	     use of server-side breakpoints (thread creation) this is
591b725ae77Skettenis 	     acceptable; but it needs to be considered before this breakpoint
592b725ae77Skettenis 	     mechanism can be used in more general ways.  For some breakpoints
593b725ae77Skettenis 	     it may be necessary to stop all other threads, but that should
594b725ae77Skettenis 	     be avoided where possible.
595b725ae77Skettenis 
596b725ae77Skettenis 	     If breakpoint_reinsert_addr is NULL, that means that we can
597b725ae77Skettenis 	     use PTRACE_SINGLESTEP on this platform.  Uninsert the breakpoint,
598b725ae77Skettenis 	     mark it for reinsertion, and single-step.
599b725ae77Skettenis 
600b725ae77Skettenis 	     Otherwise, call the target function to figure out where we need
601b725ae77Skettenis 	     our temporary breakpoint, create it, and continue executing this
602b725ae77Skettenis 	     process.  */
603b725ae77Skettenis 	  if (the_low_target.breakpoint_reinsert_addr == NULL)
604b725ae77Skettenis 	    {
605b725ae77Skettenis 	      event_child->bp_reinsert = stop_pc;
606b725ae77Skettenis 	      uninsert_breakpoint (stop_pc);
607b725ae77Skettenis 	      linux_resume_one_process (&event_child->head, 1, 0);
608b725ae77Skettenis 	    }
609b725ae77Skettenis 	  else
610b725ae77Skettenis 	    {
611b725ae77Skettenis 	      reinsert_breakpoint_by_bp
612b725ae77Skettenis 		(stop_pc, (*the_low_target.breakpoint_reinsert_addr) ());
613b725ae77Skettenis 	      linux_resume_one_process (&event_child->head, 0, 0);
614b725ae77Skettenis 	    }
615b725ae77Skettenis 
616b725ae77Skettenis 	  continue;
617b725ae77Skettenis 	}
618b725ae77Skettenis 
619b725ae77Skettenis       /* If we were single-stepping, we definitely want to report the
620b725ae77Skettenis 	 SIGTRAP.  The single-step operation has completed, so also
621b725ae77Skettenis          clear the stepping flag; in general this does not matter,
622b725ae77Skettenis 	 because the SIGTRAP will be reported to the client, which
623b725ae77Skettenis 	 will give us a new action for this thread, but clear it for
624b725ae77Skettenis 	 consistency anyway.  It's safe to clear the stepping flag
625b725ae77Skettenis          because the only consumer of get_stop_pc () after this point
626b725ae77Skettenis 	 is check_removed_breakpoint, and pending_is_breakpoint is not
627b725ae77Skettenis 	 set.  It might be wiser to use a step_completed flag instead.  */
628b725ae77Skettenis       if (event_child->stepping)
629b725ae77Skettenis 	{
630b725ae77Skettenis 	  event_child->stepping = 0;
631b725ae77Skettenis 	  return wstat;
632b725ae77Skettenis 	}
633b725ae77Skettenis 
634b725ae77Skettenis       /* A SIGTRAP that we can't explain.  It may have been a breakpoint.
635b725ae77Skettenis 	 Check if it is a breakpoint, and if so mark the process information
636b725ae77Skettenis 	 accordingly.  This will handle both the necessary fiddling with the
637b725ae77Skettenis 	 PC on decr_pc_after_break targets and suppressing extra threads
638b725ae77Skettenis 	 hitting a breakpoint if two hit it at once and then GDB removes it
639b725ae77Skettenis 	 after the first is reported.  Arguably it would be better to report
640b725ae77Skettenis 	 multiple threads hitting breakpoints simultaneously, but the current
641b725ae77Skettenis 	 remote protocol does not allow this.  */
642b725ae77Skettenis       if ((*the_low_target.breakpoint_at) (stop_pc))
643b725ae77Skettenis 	{
644b725ae77Skettenis 	  event_child->pending_is_breakpoint = 1;
645b725ae77Skettenis 	  event_child->pending_stop_pc = stop_pc;
646b725ae77Skettenis 	}
647b725ae77Skettenis 
648b725ae77Skettenis       return wstat;
649b725ae77Skettenis     }
650b725ae77Skettenis 
651b725ae77Skettenis   /* NOTREACHED */
652b725ae77Skettenis   return 0;
653b725ae77Skettenis }
654b725ae77Skettenis 
655b725ae77Skettenis /* Wait for process, returns status.  */
656b725ae77Skettenis 
657b725ae77Skettenis static unsigned char
linux_wait(char * status)658b725ae77Skettenis linux_wait (char *status)
659b725ae77Skettenis {
660b725ae77Skettenis   int w;
661b725ae77Skettenis   struct thread_info *child = NULL;
662b725ae77Skettenis 
663b725ae77Skettenis retry:
664b725ae77Skettenis   /* If we were only supposed to resume one thread, only wait for
665b725ae77Skettenis      that thread - if it's still alive.  If it died, however - which
666b725ae77Skettenis      can happen if we're coming from the thread death case below -
667b725ae77Skettenis      then we need to make sure we restart the other threads.  We could
668b725ae77Skettenis      pick a thread at random or restart all; restarting all is less
669b725ae77Skettenis      arbitrary.  */
670b725ae77Skettenis   if (cont_thread > 0)
671b725ae77Skettenis     {
672b725ae77Skettenis       child = (struct thread_info *) find_inferior_id (&all_threads,
673b725ae77Skettenis 						       cont_thread);
674b725ae77Skettenis 
675b725ae77Skettenis       /* No stepping, no signal - unless one is pending already, of course.  */
676b725ae77Skettenis       if (child == NULL)
677b725ae77Skettenis 	{
678b725ae77Skettenis 	  struct thread_resume resume_info;
679b725ae77Skettenis 	  resume_info.thread = -1;
680b725ae77Skettenis 	  resume_info.step = resume_info.sig = resume_info.leave_stopped = 0;
681b725ae77Skettenis 	  linux_resume (&resume_info);
682b725ae77Skettenis 	}
683b725ae77Skettenis     }
684b725ae77Skettenis 
685b725ae77Skettenis   enable_async_io ();
686b725ae77Skettenis   unblock_async_io ();
687b725ae77Skettenis   w = linux_wait_for_event (child);
688b725ae77Skettenis   stop_all_processes ();
689b725ae77Skettenis   disable_async_io ();
690b725ae77Skettenis 
691b725ae77Skettenis   /* If we are waiting for a particular child, and it exited,
692b725ae77Skettenis      linux_wait_for_event will return its exit status.  Similarly if
693b725ae77Skettenis      the last child exited.  If this is not the last child, however,
694b725ae77Skettenis      do not report it as exited until there is a 'thread exited' response
695b725ae77Skettenis      available in the remote protocol.  Instead, just wait for another event.
696b725ae77Skettenis      This should be safe, because if the thread crashed we will already
697b725ae77Skettenis      have reported the termination signal to GDB; that should stop any
698b725ae77Skettenis      in-progress stepping operations, etc.
699b725ae77Skettenis 
700b725ae77Skettenis      Report the exit status of the last thread to exit.  This matches
701b725ae77Skettenis      LinuxThreads' behavior.  */
702b725ae77Skettenis 
703b725ae77Skettenis   if (all_threads.head == all_threads.tail)
704b725ae77Skettenis     {
705b725ae77Skettenis       if (WIFEXITED (w))
706b725ae77Skettenis 	{
707b725ae77Skettenis 	  fprintf (stderr, "\nChild exited with retcode = %x \n", WEXITSTATUS (w));
708b725ae77Skettenis 	  *status = 'W';
709b725ae77Skettenis 	  clear_inferiors ();
710b725ae77Skettenis 	  free (all_processes.head);
711b725ae77Skettenis 	  all_processes.head = all_processes.tail = NULL;
712b725ae77Skettenis 	  return ((unsigned char) WEXITSTATUS (w));
713b725ae77Skettenis 	}
714b725ae77Skettenis       else if (!WIFSTOPPED (w))
715b725ae77Skettenis 	{
716b725ae77Skettenis 	  fprintf (stderr, "\nChild terminated with signal = %x \n", WTERMSIG (w));
717b725ae77Skettenis 	  *status = 'X';
718b725ae77Skettenis 	  clear_inferiors ();
719b725ae77Skettenis 	  free (all_processes.head);
720b725ae77Skettenis 	  all_processes.head = all_processes.tail = NULL;
721b725ae77Skettenis 	  return ((unsigned char) WTERMSIG (w));
722b725ae77Skettenis 	}
723b725ae77Skettenis     }
724b725ae77Skettenis   else
725b725ae77Skettenis     {
726b725ae77Skettenis       if (!WIFSTOPPED (w))
727b725ae77Skettenis 	goto retry;
728b725ae77Skettenis     }
729b725ae77Skettenis 
730b725ae77Skettenis   *status = 'T';
731b725ae77Skettenis   return ((unsigned char) WSTOPSIG (w));
732b725ae77Skettenis }
733b725ae77Skettenis 
734*11efff7fSkettenis /* Send a signal to an LWP.  For LinuxThreads, kill is enough; however, if
735*11efff7fSkettenis    thread groups are in use, we need to use tkill.  */
736*11efff7fSkettenis 
737*11efff7fSkettenis static int
kill_lwp(int lwpid,int signo)738*11efff7fSkettenis kill_lwp (int lwpid, int signo)
739*11efff7fSkettenis {
740*11efff7fSkettenis   static int tkill_failed;
741*11efff7fSkettenis 
742*11efff7fSkettenis   errno = 0;
743*11efff7fSkettenis 
744*11efff7fSkettenis #ifdef SYS_tkill
745*11efff7fSkettenis   if (!tkill_failed)
746*11efff7fSkettenis     {
747*11efff7fSkettenis       int ret = syscall (SYS_tkill, lwpid, signo);
748*11efff7fSkettenis       if (errno != ENOSYS)
749*11efff7fSkettenis         return ret;
750*11efff7fSkettenis       errno = 0;
751*11efff7fSkettenis       tkill_failed = 1;
752*11efff7fSkettenis     }
753*11efff7fSkettenis #endif
754*11efff7fSkettenis 
755*11efff7fSkettenis   return kill (lwpid, signo);
756*11efff7fSkettenis }
757*11efff7fSkettenis 
758b725ae77Skettenis static void
send_sigstop(struct inferior_list_entry * entry)759b725ae77Skettenis send_sigstop (struct inferior_list_entry *entry)
760b725ae77Skettenis {
761b725ae77Skettenis   struct process_info *process = (struct process_info *) entry;
762b725ae77Skettenis 
763b725ae77Skettenis   if (process->stopped)
764b725ae77Skettenis     return;
765b725ae77Skettenis 
766b725ae77Skettenis   /* If we already have a pending stop signal for this process, don't
767b725ae77Skettenis      send another.  */
768b725ae77Skettenis   if (process->stop_expected)
769b725ae77Skettenis     {
770b725ae77Skettenis       process->stop_expected = 0;
771b725ae77Skettenis       return;
772b725ae77Skettenis     }
773b725ae77Skettenis 
774b725ae77Skettenis   if (debug_threads)
775b725ae77Skettenis     fprintf (stderr, "Sending sigstop to process %d\n", process->head.id);
776b725ae77Skettenis 
777*11efff7fSkettenis   kill_lwp (process->head.id, SIGSTOP);
778b725ae77Skettenis   process->sigstop_sent = 1;
779b725ae77Skettenis }
780b725ae77Skettenis 
781b725ae77Skettenis static void
wait_for_sigstop(struct inferior_list_entry * entry)782b725ae77Skettenis wait_for_sigstop (struct inferior_list_entry *entry)
783b725ae77Skettenis {
784b725ae77Skettenis   struct process_info *process = (struct process_info *) entry;
785b725ae77Skettenis   struct thread_info *saved_inferior, *thread;
786b725ae77Skettenis   int wstat, saved_tid;
787b725ae77Skettenis 
788b725ae77Skettenis   if (process->stopped)
789b725ae77Skettenis     return;
790b725ae77Skettenis 
791b725ae77Skettenis   saved_inferior = current_inferior;
792b725ae77Skettenis   saved_tid = ((struct inferior_list_entry *) saved_inferior)->id;
793b725ae77Skettenis   thread = (struct thread_info *) find_inferior_id (&all_threads,
794b725ae77Skettenis 						    process->tid);
795b725ae77Skettenis   wstat = linux_wait_for_event (thread);
796b725ae77Skettenis 
797b725ae77Skettenis   /* If we stopped with a non-SIGSTOP signal, save it for later
798b725ae77Skettenis      and record the pending SIGSTOP.  If the process exited, just
799b725ae77Skettenis      return.  */
800b725ae77Skettenis   if (WIFSTOPPED (wstat)
801b725ae77Skettenis       && WSTOPSIG (wstat) != SIGSTOP)
802b725ae77Skettenis     {
803b725ae77Skettenis       if (debug_threads)
804b725ae77Skettenis 	fprintf (stderr, "Stopped with non-sigstop signal\n");
805b725ae77Skettenis       process->status_pending_p = 1;
806b725ae77Skettenis       process->status_pending = wstat;
807b725ae77Skettenis       process->stop_expected = 1;
808b725ae77Skettenis     }
809b725ae77Skettenis 
810b725ae77Skettenis   if (linux_thread_alive (saved_tid))
811b725ae77Skettenis     current_inferior = saved_inferior;
812b725ae77Skettenis   else
813b725ae77Skettenis     {
814b725ae77Skettenis       if (debug_threads)
815b725ae77Skettenis 	fprintf (stderr, "Previously current thread died.\n");
816b725ae77Skettenis 
817b725ae77Skettenis       /* Set a valid thread as current.  */
818b725ae77Skettenis       set_desired_inferior (0);
819b725ae77Skettenis     }
820b725ae77Skettenis }
821b725ae77Skettenis 
822b725ae77Skettenis static void
stop_all_processes(void)823b725ae77Skettenis stop_all_processes (void)
824b725ae77Skettenis {
825b725ae77Skettenis   stopping_threads = 1;
826b725ae77Skettenis   for_each_inferior (&all_processes, send_sigstop);
827b725ae77Skettenis   for_each_inferior (&all_processes, wait_for_sigstop);
828b725ae77Skettenis   stopping_threads = 0;
829b725ae77Skettenis }
830b725ae77Skettenis 
831b725ae77Skettenis /* Resume execution of the inferior process.
832b725ae77Skettenis    If STEP is nonzero, single-step it.
833b725ae77Skettenis    If SIGNAL is nonzero, give it that signal.  */
834b725ae77Skettenis 
835b725ae77Skettenis static void
linux_resume_one_process(struct inferior_list_entry * entry,int step,int signal)836b725ae77Skettenis linux_resume_one_process (struct inferior_list_entry *entry,
837b725ae77Skettenis 			  int step, int signal)
838b725ae77Skettenis {
839b725ae77Skettenis   struct process_info *process = (struct process_info *) entry;
840b725ae77Skettenis   struct thread_info *saved_inferior;
841b725ae77Skettenis 
842b725ae77Skettenis   if (process->stopped == 0)
843b725ae77Skettenis     return;
844b725ae77Skettenis 
845b725ae77Skettenis   /* If we have pending signals or status, and a new signal, enqueue the
846b725ae77Skettenis      signal.  Also enqueue the signal if we are waiting to reinsert a
847b725ae77Skettenis      breakpoint; it will be picked up again below.  */
848b725ae77Skettenis   if (signal != 0
849b725ae77Skettenis       && (process->status_pending_p || process->pending_signals != NULL
850b725ae77Skettenis 	  || process->bp_reinsert != 0))
851b725ae77Skettenis     {
852b725ae77Skettenis       struct pending_signals *p_sig;
853b725ae77Skettenis       p_sig = malloc (sizeof (*p_sig));
854b725ae77Skettenis       p_sig->prev = process->pending_signals;
855b725ae77Skettenis       p_sig->signal = signal;
856b725ae77Skettenis       process->pending_signals = p_sig;
857b725ae77Skettenis     }
858b725ae77Skettenis 
859b725ae77Skettenis   if (process->status_pending_p && !check_removed_breakpoint (process))
860b725ae77Skettenis     return;
861b725ae77Skettenis 
862b725ae77Skettenis   saved_inferior = current_inferior;
863b725ae77Skettenis   current_inferior = get_process_thread (process);
864b725ae77Skettenis 
865b725ae77Skettenis   if (debug_threads)
866b725ae77Skettenis     fprintf (stderr, "Resuming process %d (%s, signal %d, stop %s)\n", inferior_pid,
867b725ae77Skettenis 	     step ? "step" : "continue", signal,
868b725ae77Skettenis 	     process->stop_expected ? "expected" : "not expected");
869b725ae77Skettenis 
870b725ae77Skettenis   /* This bit needs some thinking about.  If we get a signal that
871b725ae77Skettenis      we must report while a single-step reinsert is still pending,
872b725ae77Skettenis      we often end up resuming the thread.  It might be better to
873b725ae77Skettenis      (ew) allow a stack of pending events; then we could be sure that
874b725ae77Skettenis      the reinsert happened right away and not lose any signals.
875b725ae77Skettenis 
876b725ae77Skettenis      Making this stack would also shrink the window in which breakpoints are
877b725ae77Skettenis      uninserted (see comment in linux_wait_for_process) but not enough for
878b725ae77Skettenis      complete correctness, so it won't solve that problem.  It may be
879b725ae77Skettenis      worthwhile just to solve this one, however.  */
880b725ae77Skettenis   if (process->bp_reinsert != 0)
881b725ae77Skettenis     {
882b725ae77Skettenis       if (debug_threads)
883b725ae77Skettenis 	fprintf (stderr, "  pending reinsert at %08lx", (long)process->bp_reinsert);
884b725ae77Skettenis       if (step == 0)
885b725ae77Skettenis 	fprintf (stderr, "BAD - reinserting but not stepping.\n");
886b725ae77Skettenis       step = 1;
887b725ae77Skettenis 
888b725ae77Skettenis       /* Postpone any pending signal.  It was enqueued above.  */
889b725ae77Skettenis       signal = 0;
890b725ae77Skettenis     }
891b725ae77Skettenis 
892b725ae77Skettenis   check_removed_breakpoint (process);
893b725ae77Skettenis 
894b725ae77Skettenis   if (debug_threads && the_low_target.get_pc != NULL)
895b725ae77Skettenis     {
896b725ae77Skettenis       fprintf (stderr, "  ");
897b725ae77Skettenis       (long) (*the_low_target.get_pc) ();
898b725ae77Skettenis     }
899b725ae77Skettenis 
900b725ae77Skettenis   /* If we have pending signals, consume one unless we are trying to reinsert
901b725ae77Skettenis      a breakpoint.  */
902b725ae77Skettenis   if (process->pending_signals != NULL && process->bp_reinsert == 0)
903b725ae77Skettenis     {
904b725ae77Skettenis       struct pending_signals **p_sig;
905b725ae77Skettenis 
906b725ae77Skettenis       p_sig = &process->pending_signals;
907b725ae77Skettenis       while ((*p_sig)->prev != NULL)
908b725ae77Skettenis 	p_sig = &(*p_sig)->prev;
909b725ae77Skettenis 
910b725ae77Skettenis       signal = (*p_sig)->signal;
911b725ae77Skettenis       free (*p_sig);
912b725ae77Skettenis       *p_sig = NULL;
913b725ae77Skettenis     }
914b725ae77Skettenis 
915b725ae77Skettenis   regcache_invalidate_one ((struct inferior_list_entry *)
916b725ae77Skettenis 			   get_process_thread (process));
917b725ae77Skettenis   errno = 0;
918b725ae77Skettenis   process->stopped = 0;
919b725ae77Skettenis   process->stepping = step;
920b725ae77Skettenis   ptrace (step ? PTRACE_SINGLESTEP : PTRACE_CONT, process->lwpid, 0, signal);
921b725ae77Skettenis 
922b725ae77Skettenis   current_inferior = saved_inferior;
923b725ae77Skettenis   if (errno)
924b725ae77Skettenis     perror_with_name ("ptrace");
925b725ae77Skettenis }
926b725ae77Skettenis 
927b725ae77Skettenis static struct thread_resume *resume_ptr;
928b725ae77Skettenis 
929b725ae77Skettenis /* This function is called once per thread.  We look up the thread
930b725ae77Skettenis    in RESUME_PTR, and mark the thread with a pointer to the appropriate
931b725ae77Skettenis    resume request.
932b725ae77Skettenis 
933b725ae77Skettenis    This algorithm is O(threads * resume elements), but resume elements
934b725ae77Skettenis    is small (and will remain small at least until GDB supports thread
935b725ae77Skettenis    suspension).  */
936b725ae77Skettenis static void
linux_set_resume_request(struct inferior_list_entry * entry)937b725ae77Skettenis linux_set_resume_request (struct inferior_list_entry *entry)
938b725ae77Skettenis {
939b725ae77Skettenis   struct process_info *process;
940b725ae77Skettenis   struct thread_info *thread;
941b725ae77Skettenis   int ndx;
942b725ae77Skettenis 
943b725ae77Skettenis   thread = (struct thread_info *) entry;
944b725ae77Skettenis   process = get_thread_process (thread);
945b725ae77Skettenis 
946b725ae77Skettenis   ndx = 0;
947b725ae77Skettenis   while (resume_ptr[ndx].thread != -1 && resume_ptr[ndx].thread != entry->id)
948b725ae77Skettenis     ndx++;
949b725ae77Skettenis 
950b725ae77Skettenis   process->resume = &resume_ptr[ndx];
951b725ae77Skettenis }
952b725ae77Skettenis 
953b725ae77Skettenis /* This function is called once per thread.  We check the thread's resume
954b725ae77Skettenis    request, which will tell us whether to resume, step, or leave the thread
955b725ae77Skettenis    stopped; and what signal, if any, it should be sent.  For threads which
956b725ae77Skettenis    we aren't explicitly told otherwise, we preserve the stepping flag; this
957b725ae77Skettenis    is used for stepping over gdbserver-placed breakpoints.  */
958b725ae77Skettenis 
959b725ae77Skettenis static void
linux_continue_one_thread(struct inferior_list_entry * entry)960b725ae77Skettenis linux_continue_one_thread (struct inferior_list_entry *entry)
961b725ae77Skettenis {
962b725ae77Skettenis   struct process_info *process;
963b725ae77Skettenis   struct thread_info *thread;
964b725ae77Skettenis   int step;
965b725ae77Skettenis 
966b725ae77Skettenis   thread = (struct thread_info *) entry;
967b725ae77Skettenis   process = get_thread_process (thread);
968b725ae77Skettenis 
969b725ae77Skettenis   if (process->resume->leave_stopped)
970b725ae77Skettenis     return;
971b725ae77Skettenis 
972b725ae77Skettenis   if (process->resume->thread == -1)
973b725ae77Skettenis     step = process->stepping || process->resume->step;
974b725ae77Skettenis   else
975b725ae77Skettenis     step = process->resume->step;
976b725ae77Skettenis 
977b725ae77Skettenis   linux_resume_one_process (&process->head, step, process->resume->sig);
978b725ae77Skettenis 
979b725ae77Skettenis   process->resume = NULL;
980b725ae77Skettenis }
981b725ae77Skettenis 
982b725ae77Skettenis /* This function is called once per thread.  We check the thread's resume
983b725ae77Skettenis    request, which will tell us whether to resume, step, or leave the thread
984b725ae77Skettenis    stopped; and what signal, if any, it should be sent.  We queue any needed
985b725ae77Skettenis    signals, since we won't actually resume.  We already have a pending event
986b725ae77Skettenis    to report, so we don't need to preserve any step requests; they should
987b725ae77Skettenis    be re-issued if necessary.  */
988b725ae77Skettenis 
989b725ae77Skettenis static void
linux_queue_one_thread(struct inferior_list_entry * entry)990b725ae77Skettenis linux_queue_one_thread (struct inferior_list_entry *entry)
991b725ae77Skettenis {
992b725ae77Skettenis   struct process_info *process;
993b725ae77Skettenis   struct thread_info *thread;
994b725ae77Skettenis 
995b725ae77Skettenis   thread = (struct thread_info *) entry;
996b725ae77Skettenis   process = get_thread_process (thread);
997b725ae77Skettenis 
998b725ae77Skettenis   if (process->resume->leave_stopped)
999b725ae77Skettenis     return;
1000b725ae77Skettenis 
1001b725ae77Skettenis   /* If we have a new signal, enqueue the signal.  */
1002b725ae77Skettenis   if (process->resume->sig != 0)
1003b725ae77Skettenis     {
1004b725ae77Skettenis       struct pending_signals *p_sig;
1005b725ae77Skettenis       p_sig = malloc (sizeof (*p_sig));
1006b725ae77Skettenis       p_sig->prev = process->pending_signals;
1007b725ae77Skettenis       p_sig->signal = process->resume->sig;
1008b725ae77Skettenis       process->pending_signals = p_sig;
1009b725ae77Skettenis     }
1010b725ae77Skettenis 
1011b725ae77Skettenis   process->resume = NULL;
1012b725ae77Skettenis }
1013b725ae77Skettenis 
1014b725ae77Skettenis /* Set DUMMY if this process has an interesting status pending.  */
1015b725ae77Skettenis static int
resume_status_pending_p(struct inferior_list_entry * entry,void * flag_p)1016b725ae77Skettenis resume_status_pending_p (struct inferior_list_entry *entry, void *flag_p)
1017b725ae77Skettenis {
1018b725ae77Skettenis   struct process_info *process = (struct process_info *) entry;
1019b725ae77Skettenis 
1020b725ae77Skettenis   /* Processes which will not be resumed are not interesting, because
1021b725ae77Skettenis      we might not wait for them next time through linux_wait.  */
1022b725ae77Skettenis   if (process->resume->leave_stopped)
1023b725ae77Skettenis     return 0;
1024b725ae77Skettenis 
1025b725ae77Skettenis   /* If this thread has a removed breakpoint, we won't have any
1026b725ae77Skettenis      events to report later, so check now.  check_removed_breakpoint
1027b725ae77Skettenis      may clear status_pending_p.  We avoid calling check_removed_breakpoint
1028b725ae77Skettenis      for any thread that we are not otherwise going to resume - this
1029b725ae77Skettenis      lets us preserve stopped status when two threads hit a breakpoint.
1030b725ae77Skettenis      GDB removes the breakpoint to single-step a particular thread
1031b725ae77Skettenis      past it, then re-inserts it and resumes all threads.  We want
1032b725ae77Skettenis      to report the second thread without resuming it in the interim.  */
1033b725ae77Skettenis   if (process->status_pending_p)
1034b725ae77Skettenis     check_removed_breakpoint (process);
1035b725ae77Skettenis 
1036b725ae77Skettenis   if (process->status_pending_p)
1037b725ae77Skettenis     * (int *) flag_p = 1;
1038b725ae77Skettenis 
1039b725ae77Skettenis   return 0;
1040b725ae77Skettenis }
1041b725ae77Skettenis 
1042b725ae77Skettenis static void
linux_resume(struct thread_resume * resume_info)1043b725ae77Skettenis linux_resume (struct thread_resume *resume_info)
1044b725ae77Skettenis {
1045b725ae77Skettenis   int pending_flag;
1046b725ae77Skettenis 
1047b725ae77Skettenis   /* Yes, the use of a global here is rather ugly.  */
1048b725ae77Skettenis   resume_ptr = resume_info;
1049b725ae77Skettenis 
1050b725ae77Skettenis   for_each_inferior (&all_threads, linux_set_resume_request);
1051b725ae77Skettenis 
1052b725ae77Skettenis   /* If there is a thread which would otherwise be resumed, which
1053b725ae77Skettenis      has a pending status, then don't resume any threads - we can just
1054b725ae77Skettenis      report the pending status.  Make sure to queue any signals
1055b725ae77Skettenis      that would otherwise be sent.  */
1056b725ae77Skettenis   pending_flag = 0;
1057b725ae77Skettenis   find_inferior (&all_processes, resume_status_pending_p, &pending_flag);
1058b725ae77Skettenis 
1059b725ae77Skettenis   if (debug_threads)
1060b725ae77Skettenis     {
1061b725ae77Skettenis       if (pending_flag)
1062b725ae77Skettenis 	fprintf (stderr, "Not resuming, pending status\n");
1063b725ae77Skettenis       else
1064b725ae77Skettenis 	fprintf (stderr, "Resuming, no pending status\n");
1065b725ae77Skettenis     }
1066b725ae77Skettenis 
1067b725ae77Skettenis   if (pending_flag)
1068b725ae77Skettenis     for_each_inferior (&all_threads, linux_queue_one_thread);
1069b725ae77Skettenis   else
1070b725ae77Skettenis     {
1071b725ae77Skettenis       block_async_io ();
1072b725ae77Skettenis       enable_async_io ();
1073b725ae77Skettenis       for_each_inferior (&all_threads, linux_continue_one_thread);
1074b725ae77Skettenis     }
1075b725ae77Skettenis }
1076b725ae77Skettenis 
1077b725ae77Skettenis #ifdef HAVE_LINUX_USRREGS
1078b725ae77Skettenis 
1079b725ae77Skettenis int
register_addr(int regnum)1080b725ae77Skettenis register_addr (int regnum)
1081b725ae77Skettenis {
1082b725ae77Skettenis   int addr;
1083b725ae77Skettenis 
1084b725ae77Skettenis   if (regnum < 0 || regnum >= the_low_target.num_regs)
1085b725ae77Skettenis     error ("Invalid register number %d.", regnum);
1086b725ae77Skettenis 
1087b725ae77Skettenis   addr = the_low_target.regmap[regnum];
1088b725ae77Skettenis 
1089b725ae77Skettenis   return addr;
1090b725ae77Skettenis }
1091b725ae77Skettenis 
1092b725ae77Skettenis /* Fetch one register.  */
1093b725ae77Skettenis static void
fetch_register(int regno)1094b725ae77Skettenis fetch_register (int regno)
1095b725ae77Skettenis {
1096b725ae77Skettenis   CORE_ADDR regaddr;
1097b725ae77Skettenis   register int i;
1098b725ae77Skettenis   char *buf;
1099b725ae77Skettenis 
1100b725ae77Skettenis   if (regno >= the_low_target.num_regs)
1101b725ae77Skettenis     return;
1102b725ae77Skettenis   if ((*the_low_target.cannot_fetch_register) (regno))
1103b725ae77Skettenis     return;
1104b725ae77Skettenis 
1105b725ae77Skettenis   regaddr = register_addr (regno);
1106b725ae77Skettenis   if (regaddr == -1)
1107b725ae77Skettenis     return;
1108b725ae77Skettenis   buf = alloca (register_size (regno));
1109b725ae77Skettenis   for (i = 0; i < register_size (regno); i += sizeof (PTRACE_XFER_TYPE))
1110b725ae77Skettenis     {
1111b725ae77Skettenis       errno = 0;
1112b725ae77Skettenis       *(PTRACE_XFER_TYPE *) (buf + i) =
1113b725ae77Skettenis 	ptrace (PTRACE_PEEKUSER, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, 0);
1114b725ae77Skettenis       regaddr += sizeof (PTRACE_XFER_TYPE);
1115b725ae77Skettenis       if (errno != 0)
1116b725ae77Skettenis 	{
1117b725ae77Skettenis 	  /* Warning, not error, in case we are attached; sometimes the
1118b725ae77Skettenis 	     kernel doesn't let us at the registers.  */
1119b725ae77Skettenis 	  char *err = strerror (errno);
1120b725ae77Skettenis 	  char *msg = alloca (strlen (err) + 128);
1121b725ae77Skettenis 	  sprintf (msg, "reading register %d: %s", regno, err);
1122b725ae77Skettenis 	  error (msg);
1123b725ae77Skettenis 	  goto error_exit;
1124b725ae77Skettenis 	}
1125b725ae77Skettenis     }
1126b725ae77Skettenis   supply_register (regno, buf);
1127b725ae77Skettenis 
1128b725ae77Skettenis error_exit:;
1129b725ae77Skettenis }
1130b725ae77Skettenis 
1131b725ae77Skettenis /* Fetch all registers, or just one, from the child process.  */
1132b725ae77Skettenis static void
usr_fetch_inferior_registers(int regno)1133b725ae77Skettenis usr_fetch_inferior_registers (int regno)
1134b725ae77Skettenis {
1135b725ae77Skettenis   if (regno == -1 || regno == 0)
1136b725ae77Skettenis     for (regno = 0; regno < the_low_target.num_regs; regno++)
1137b725ae77Skettenis       fetch_register (regno);
1138b725ae77Skettenis   else
1139b725ae77Skettenis     fetch_register (regno);
1140b725ae77Skettenis }
1141b725ae77Skettenis 
1142b725ae77Skettenis /* Store our register values back into the inferior.
1143b725ae77Skettenis    If REGNO is -1, do this for all registers.
1144b725ae77Skettenis    Otherwise, REGNO specifies which register (so we can save time).  */
1145b725ae77Skettenis static void
usr_store_inferior_registers(int regno)1146b725ae77Skettenis usr_store_inferior_registers (int regno)
1147b725ae77Skettenis {
1148b725ae77Skettenis   CORE_ADDR regaddr;
1149b725ae77Skettenis   int i;
1150b725ae77Skettenis   char *buf;
1151b725ae77Skettenis 
1152b725ae77Skettenis   if (regno >= 0)
1153b725ae77Skettenis     {
1154b725ae77Skettenis       if (regno >= the_low_target.num_regs)
1155b725ae77Skettenis 	return;
1156b725ae77Skettenis 
1157b725ae77Skettenis       if ((*the_low_target.cannot_store_register) (regno) == 1)
1158b725ae77Skettenis 	return;
1159b725ae77Skettenis 
1160b725ae77Skettenis       regaddr = register_addr (regno);
1161b725ae77Skettenis       if (regaddr == -1)
1162b725ae77Skettenis 	return;
1163b725ae77Skettenis       errno = 0;
1164b725ae77Skettenis       buf = alloca (register_size (regno));
1165b725ae77Skettenis       collect_register (regno, buf);
1166b725ae77Skettenis       for (i = 0; i < register_size (regno); i += sizeof (PTRACE_XFER_TYPE))
1167b725ae77Skettenis 	{
1168b725ae77Skettenis 	  errno = 0;
1169b725ae77Skettenis 	  ptrace (PTRACE_POKEUSER, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
1170b725ae77Skettenis 		  *(PTRACE_XFER_TYPE *) (buf + i));
1171b725ae77Skettenis 	  if (errno != 0)
1172b725ae77Skettenis 	    {
1173b725ae77Skettenis 	      if ((*the_low_target.cannot_store_register) (regno) == 0)
1174b725ae77Skettenis 		{
1175b725ae77Skettenis 		  char *err = strerror (errno);
1176b725ae77Skettenis 		  char *msg = alloca (strlen (err) + 128);
1177b725ae77Skettenis 		  sprintf (msg, "writing register %d: %s",
1178b725ae77Skettenis 			   regno, err);
1179b725ae77Skettenis 		  error (msg);
1180b725ae77Skettenis 		  return;
1181b725ae77Skettenis 		}
1182b725ae77Skettenis 	    }
1183b725ae77Skettenis 	  regaddr += sizeof (PTRACE_XFER_TYPE);
1184b725ae77Skettenis 	}
1185b725ae77Skettenis     }
1186b725ae77Skettenis   else
1187b725ae77Skettenis     for (regno = 0; regno < the_low_target.num_regs; regno++)
1188b725ae77Skettenis       usr_store_inferior_registers (regno);
1189b725ae77Skettenis }
1190b725ae77Skettenis #endif /* HAVE_LINUX_USRREGS */
1191b725ae77Skettenis 
1192b725ae77Skettenis 
1193b725ae77Skettenis 
1194b725ae77Skettenis #ifdef HAVE_LINUX_REGSETS
1195b725ae77Skettenis 
1196b725ae77Skettenis static int
regsets_fetch_inferior_registers()1197b725ae77Skettenis regsets_fetch_inferior_registers ()
1198b725ae77Skettenis {
1199b725ae77Skettenis   struct regset_info *regset;
1200b725ae77Skettenis 
1201b725ae77Skettenis   regset = target_regsets;
1202b725ae77Skettenis 
1203b725ae77Skettenis   while (regset->size >= 0)
1204b725ae77Skettenis     {
1205b725ae77Skettenis       void *buf;
1206b725ae77Skettenis       int res;
1207b725ae77Skettenis 
1208b725ae77Skettenis       if (regset->size == 0)
1209b725ae77Skettenis 	{
1210b725ae77Skettenis 	  regset ++;
1211b725ae77Skettenis 	  continue;
1212b725ae77Skettenis 	}
1213b725ae77Skettenis 
1214b725ae77Skettenis       buf = malloc (regset->size);
1215b725ae77Skettenis       res = ptrace (regset->get_request, inferior_pid, 0, buf);
1216b725ae77Skettenis       if (res < 0)
1217b725ae77Skettenis 	{
1218b725ae77Skettenis 	  if (errno == EIO)
1219b725ae77Skettenis 	    {
1220b725ae77Skettenis 	      /* If we get EIO on the first regset, do not try regsets again.
1221b725ae77Skettenis 		 If we get EIO on a later regset, disable that regset.  */
1222b725ae77Skettenis 	      if (regset == target_regsets)
1223b725ae77Skettenis 		{
1224b725ae77Skettenis 		  use_regsets_p = 0;
1225b725ae77Skettenis 		  return -1;
1226b725ae77Skettenis 		}
1227b725ae77Skettenis 	      else
1228b725ae77Skettenis 		{
1229b725ae77Skettenis 		  regset->size = 0;
1230b725ae77Skettenis 		  continue;
1231b725ae77Skettenis 		}
1232b725ae77Skettenis 	    }
1233b725ae77Skettenis 	  else
1234b725ae77Skettenis 	    {
1235b725ae77Skettenis 	      char s[256];
1236b725ae77Skettenis 	      sprintf (s, "ptrace(regsets_fetch_inferior_registers) PID=%d",
1237b725ae77Skettenis 		       inferior_pid);
1238b725ae77Skettenis 	      perror (s);
1239b725ae77Skettenis 	    }
1240b725ae77Skettenis 	}
1241b725ae77Skettenis       regset->store_function (buf);
1242b725ae77Skettenis       regset ++;
1243b725ae77Skettenis     }
1244b725ae77Skettenis   return 0;
1245b725ae77Skettenis }
1246b725ae77Skettenis 
1247b725ae77Skettenis static int
regsets_store_inferior_registers()1248b725ae77Skettenis regsets_store_inferior_registers ()
1249b725ae77Skettenis {
1250b725ae77Skettenis   struct regset_info *regset;
1251b725ae77Skettenis 
1252b725ae77Skettenis   regset = target_regsets;
1253b725ae77Skettenis 
1254b725ae77Skettenis   while (regset->size >= 0)
1255b725ae77Skettenis     {
1256b725ae77Skettenis       void *buf;
1257b725ae77Skettenis       int res;
1258b725ae77Skettenis 
1259b725ae77Skettenis       if (regset->size == 0)
1260b725ae77Skettenis 	{
1261b725ae77Skettenis 	  regset ++;
1262b725ae77Skettenis 	  continue;
1263b725ae77Skettenis 	}
1264b725ae77Skettenis 
1265b725ae77Skettenis       buf = malloc (regset->size);
1266b725ae77Skettenis       regset->fill_function (buf);
1267b725ae77Skettenis       res = ptrace (regset->set_request, inferior_pid, 0, buf);
1268b725ae77Skettenis       if (res < 0)
1269b725ae77Skettenis 	{
1270b725ae77Skettenis 	  if (errno == EIO)
1271b725ae77Skettenis 	    {
1272b725ae77Skettenis 	      /* If we get EIO on the first regset, do not try regsets again.
1273b725ae77Skettenis 		 If we get EIO on a later regset, disable that regset.  */
1274b725ae77Skettenis 	      if (regset == target_regsets)
1275b725ae77Skettenis 		{
1276b725ae77Skettenis 		  use_regsets_p = 0;
1277b725ae77Skettenis 		  return -1;
1278b725ae77Skettenis 		}
1279b725ae77Skettenis 	      else
1280b725ae77Skettenis 		{
1281b725ae77Skettenis 		  regset->size = 0;
1282b725ae77Skettenis 		  continue;
1283b725ae77Skettenis 		}
1284b725ae77Skettenis 	    }
1285b725ae77Skettenis 	  else
1286b725ae77Skettenis 	    {
1287b725ae77Skettenis 	      perror ("Warning: ptrace(regsets_store_inferior_registers)");
1288b725ae77Skettenis 	    }
1289b725ae77Skettenis 	}
1290b725ae77Skettenis       regset ++;
1291b725ae77Skettenis       free (buf);
1292b725ae77Skettenis     }
1293b725ae77Skettenis   return 0;
1294b725ae77Skettenis }
1295b725ae77Skettenis 
1296b725ae77Skettenis #endif /* HAVE_LINUX_REGSETS */
1297b725ae77Skettenis 
1298b725ae77Skettenis 
1299b725ae77Skettenis void
linux_fetch_registers(int regno)1300b725ae77Skettenis linux_fetch_registers (int regno)
1301b725ae77Skettenis {
1302b725ae77Skettenis #ifdef HAVE_LINUX_REGSETS
1303b725ae77Skettenis   if (use_regsets_p)
1304b725ae77Skettenis     {
1305b725ae77Skettenis       if (regsets_fetch_inferior_registers () == 0)
1306b725ae77Skettenis 	return;
1307b725ae77Skettenis     }
1308b725ae77Skettenis #endif
1309b725ae77Skettenis #ifdef HAVE_LINUX_USRREGS
1310b725ae77Skettenis   usr_fetch_inferior_registers (regno);
1311b725ae77Skettenis #endif
1312b725ae77Skettenis }
1313b725ae77Skettenis 
1314b725ae77Skettenis void
linux_store_registers(int regno)1315b725ae77Skettenis linux_store_registers (int regno)
1316b725ae77Skettenis {
1317b725ae77Skettenis #ifdef HAVE_LINUX_REGSETS
1318b725ae77Skettenis   if (use_regsets_p)
1319b725ae77Skettenis     {
1320b725ae77Skettenis       if (regsets_store_inferior_registers () == 0)
1321b725ae77Skettenis 	return;
1322b725ae77Skettenis     }
1323b725ae77Skettenis #endif
1324b725ae77Skettenis #ifdef HAVE_LINUX_USRREGS
1325b725ae77Skettenis   usr_store_inferior_registers (regno);
1326b725ae77Skettenis #endif
1327b725ae77Skettenis }
1328b725ae77Skettenis 
1329b725ae77Skettenis 
1330b725ae77Skettenis /* Copy LEN bytes from inferior's memory starting at MEMADDR
1331b725ae77Skettenis    to debugger memory starting at MYADDR.  */
1332b725ae77Skettenis 
1333b725ae77Skettenis static int
linux_read_memory(CORE_ADDR memaddr,char * myaddr,int len)1334b725ae77Skettenis linux_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
1335b725ae77Skettenis {
1336b725ae77Skettenis   register int i;
1337b725ae77Skettenis   /* Round starting address down to longword boundary.  */
1338b725ae77Skettenis   register CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (PTRACE_XFER_TYPE);
1339b725ae77Skettenis   /* Round ending address up; get number of longwords that makes.  */
1340b725ae77Skettenis   register int count
1341b725ae77Skettenis     = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1)
1342b725ae77Skettenis       / sizeof (PTRACE_XFER_TYPE);
1343b725ae77Skettenis   /* Allocate buffer of that many longwords.  */
1344b725ae77Skettenis   register PTRACE_XFER_TYPE *buffer
1345b725ae77Skettenis     = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
1346b725ae77Skettenis 
1347b725ae77Skettenis   /* Read all the longwords */
1348b725ae77Skettenis   for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
1349b725ae77Skettenis     {
1350b725ae77Skettenis       errno = 0;
1351b725ae77Skettenis       buffer[i] = ptrace (PTRACE_PEEKTEXT, inferior_pid, (PTRACE_ARG3_TYPE) addr, 0);
1352b725ae77Skettenis       if (errno)
1353b725ae77Skettenis 	return errno;
1354b725ae77Skettenis     }
1355b725ae77Skettenis 
1356b725ae77Skettenis   /* Copy appropriate bytes out of the buffer.  */
1357b725ae77Skettenis   memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)), len);
1358b725ae77Skettenis 
1359b725ae77Skettenis   return 0;
1360b725ae77Skettenis }
1361b725ae77Skettenis 
1362b725ae77Skettenis /* Copy LEN bytes of data from debugger memory at MYADDR
1363b725ae77Skettenis    to inferior's memory at MEMADDR.
1364b725ae77Skettenis    On failure (cannot write the inferior)
1365b725ae77Skettenis    returns the value of errno.  */
1366b725ae77Skettenis 
1367b725ae77Skettenis static int
linux_write_memory(CORE_ADDR memaddr,const char * myaddr,int len)1368b725ae77Skettenis linux_write_memory (CORE_ADDR memaddr, const char *myaddr, int len)
1369b725ae77Skettenis {
1370b725ae77Skettenis   register int i;
1371b725ae77Skettenis   /* Round starting address down to longword boundary.  */
1372b725ae77Skettenis   register CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (PTRACE_XFER_TYPE);
1373b725ae77Skettenis   /* Round ending address up; get number of longwords that makes.  */
1374b725ae77Skettenis   register int count
1375b725ae77Skettenis   = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1) / sizeof (PTRACE_XFER_TYPE);
1376b725ae77Skettenis   /* Allocate buffer of that many longwords.  */
1377b725ae77Skettenis   register PTRACE_XFER_TYPE *buffer = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
1378b725ae77Skettenis   extern int errno;
1379b725ae77Skettenis 
1380b725ae77Skettenis   if (debug_threads)
1381b725ae77Skettenis     {
1382b725ae77Skettenis       fprintf (stderr, "Writing %02x to %08lx\n", (unsigned)myaddr[0], (long)memaddr);
1383b725ae77Skettenis     }
1384b725ae77Skettenis 
1385b725ae77Skettenis   /* Fill start and end extra bytes of buffer with existing memory data.  */
1386b725ae77Skettenis 
1387b725ae77Skettenis   buffer[0] = ptrace (PTRACE_PEEKTEXT, inferior_pid,
1388b725ae77Skettenis 		      (PTRACE_ARG3_TYPE) addr, 0);
1389b725ae77Skettenis 
1390b725ae77Skettenis   if (count > 1)
1391b725ae77Skettenis     {
1392b725ae77Skettenis       buffer[count - 1]
1393b725ae77Skettenis 	= ptrace (PTRACE_PEEKTEXT, inferior_pid,
1394b725ae77Skettenis 		  (PTRACE_ARG3_TYPE) (addr + (count - 1)
1395b725ae77Skettenis 				      * sizeof (PTRACE_XFER_TYPE)),
1396b725ae77Skettenis 		  0);
1397b725ae77Skettenis     }
1398b725ae77Skettenis 
1399b725ae77Skettenis   /* Copy data to be written over corresponding part of buffer */
1400b725ae77Skettenis 
1401b725ae77Skettenis   memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)), myaddr, len);
1402b725ae77Skettenis 
1403b725ae77Skettenis   /* Write the entire buffer.  */
1404b725ae77Skettenis 
1405b725ae77Skettenis   for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
1406b725ae77Skettenis     {
1407b725ae77Skettenis       errno = 0;
1408b725ae77Skettenis       ptrace (PTRACE_POKETEXT, inferior_pid, (PTRACE_ARG3_TYPE) addr, buffer[i]);
1409b725ae77Skettenis       if (errno)
1410b725ae77Skettenis 	return errno;
1411b725ae77Skettenis     }
1412b725ae77Skettenis 
1413b725ae77Skettenis   return 0;
1414b725ae77Skettenis }
1415b725ae77Skettenis 
1416b725ae77Skettenis static void
linux_look_up_symbols(void)1417b725ae77Skettenis linux_look_up_symbols (void)
1418b725ae77Skettenis {
1419b725ae77Skettenis #ifdef USE_THREAD_DB
1420b725ae77Skettenis   if (using_threads)
1421b725ae77Skettenis     return;
1422b725ae77Skettenis 
1423b725ae77Skettenis   using_threads = thread_db_init ();
1424b725ae77Skettenis #endif
1425b725ae77Skettenis }
1426b725ae77Skettenis 
1427b725ae77Skettenis static void
linux_send_signal(int signum)1428b725ae77Skettenis linux_send_signal (int signum)
1429b725ae77Skettenis {
1430b725ae77Skettenis   extern int signal_pid;
1431b725ae77Skettenis 
1432b725ae77Skettenis   if (cont_thread > 0)
1433b725ae77Skettenis     {
1434b725ae77Skettenis       struct process_info *process;
1435b725ae77Skettenis 
1436b725ae77Skettenis       process = get_thread_process (current_inferior);
1437*11efff7fSkettenis       kill_lwp (process->lwpid, signum);
1438b725ae77Skettenis     }
1439b725ae77Skettenis   else
1440*11efff7fSkettenis     kill_lwp (signal_pid, signum);
1441b725ae77Skettenis }
1442b725ae77Skettenis 
1443b725ae77Skettenis /* Copy LEN bytes from inferior's auxiliary vector starting at OFFSET
1444b725ae77Skettenis    to debugger memory starting at MYADDR.  */
1445b725ae77Skettenis 
1446b725ae77Skettenis static int
linux_read_auxv(CORE_ADDR offset,char * myaddr,unsigned int len)1447b725ae77Skettenis linux_read_auxv (CORE_ADDR offset, char *myaddr, unsigned int len)
1448b725ae77Skettenis {
1449b725ae77Skettenis   char filename[PATH_MAX];
1450b725ae77Skettenis   int fd, n;
1451b725ae77Skettenis 
1452b725ae77Skettenis   snprintf (filename, sizeof filename, "/proc/%d/auxv", inferior_pid);
1453b725ae77Skettenis 
1454b725ae77Skettenis   fd = open (filename, O_RDONLY);
1455b725ae77Skettenis   if (fd < 0)
1456b725ae77Skettenis     return -1;
1457b725ae77Skettenis 
1458b725ae77Skettenis   if (offset != (CORE_ADDR) 0
1459b725ae77Skettenis       && lseek (fd, (off_t) offset, SEEK_SET) != (off_t) offset)
1460b725ae77Skettenis     n = -1;
1461b725ae77Skettenis   else
1462b725ae77Skettenis     n = read (fd, myaddr, len);
1463b725ae77Skettenis 
1464b725ae77Skettenis   close (fd);
1465b725ae77Skettenis 
1466b725ae77Skettenis   return n;
1467b725ae77Skettenis }
1468b725ae77Skettenis 
1469b725ae77Skettenis 
1470b725ae77Skettenis static struct target_ops linux_target_ops = {
1471b725ae77Skettenis   linux_create_inferior,
1472b725ae77Skettenis   linux_attach,
1473b725ae77Skettenis   linux_kill,
1474b725ae77Skettenis   linux_detach,
1475b725ae77Skettenis   linux_thread_alive,
1476b725ae77Skettenis   linux_resume,
1477b725ae77Skettenis   linux_wait,
1478b725ae77Skettenis   linux_fetch_registers,
1479b725ae77Skettenis   linux_store_registers,
1480b725ae77Skettenis   linux_read_memory,
1481b725ae77Skettenis   linux_write_memory,
1482b725ae77Skettenis   linux_look_up_symbols,
1483b725ae77Skettenis   linux_send_signal,
1484b725ae77Skettenis   linux_read_auxv,
1485b725ae77Skettenis };
1486b725ae77Skettenis 
1487b725ae77Skettenis static void
linux_init_signals()1488b725ae77Skettenis linux_init_signals ()
1489b725ae77Skettenis {
1490b725ae77Skettenis   /* FIXME drow/2002-06-09: As above, we should check with LinuxThreads
1491b725ae77Skettenis      to find what the cancel signal actually is.  */
1492b725ae77Skettenis   signal (__SIGRTMIN+1, SIG_IGN);
1493b725ae77Skettenis }
1494b725ae77Skettenis 
1495b725ae77Skettenis void
initialize_low(void)1496b725ae77Skettenis initialize_low (void)
1497b725ae77Skettenis {
1498b725ae77Skettenis   using_threads = 0;
1499b725ae77Skettenis   set_target_ops (&linux_target_ops);
1500b725ae77Skettenis   set_breakpoint_data (the_low_target.breakpoint,
1501b725ae77Skettenis 		       the_low_target.breakpoint_len);
1502b725ae77Skettenis   init_registers ();
1503b725ae77Skettenis   linux_init_signals ();
1504b725ae77Skettenis }
1505