Add a symbol's value to the computed frag offset, rather than overwriting it.
[deliverable/binutils-gdb.git] / gdb / gnu-nat.c
CommitLineData
da59e081 1/* Interface GDB to the GNU Hurd.
f90b2b1d 2 Copyright (C) 1992, 95, 96, 97, 1999, 2000 Free Software Foundation, Inc.
c906108c
SS
3
4 This file is part of GDB.
5
6 Written by Miles Bader <miles@gnu.ai.mit.edu>
7
8 Some code and ideas from m3-nat.c by Jukka Virtanen <jtv@hut.fi>
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
c5aa993b
JM
22 Foundation, Inc., 59 Temple Place - Suite 330,
23 Boston, MA 02111-1307, USA.
24 */
c906108c
SS
25
26#include <stdio.h>
7a292a7a 27#include <string.h>
c906108c
SS
28#include <errno.h>
29#include <signal.h>
30#include <assert.h>
31#include <setjmp.h>
32#include <limits.h>
33#include <sys/ptrace.h>
34
c906108c
SS
35#include <mach.h>
36#include <mach/message.h>
37#include <mach/notify.h>
38#include <mach_error.h>
39#include <mach/exception.h>
40#include <mach/vm_attributes.h>
41
42#include <hurd/process.h>
43#include <hurd/process_request.h>
44#include <hurd/msg.h>
45#include <hurd/msg_request.h>
46#include <hurd/signal.h>
47#include <hurd/interrupt.h>
48#include <hurd/sigpreempt.h>
49
50#include <portinfo.h>
51
52#include "defs.h"
53#include "inferior.h"
54#include "symtab.h"
55#include "value.h"
56#include "language.h"
57#include "target.h"
03f2053f 58#include "gdb_wait.h"
c906108c
SS
59#include "gdbcmd.h"
60#include "gdbcore.h"
61
62#include "gnu-nat.h"
63
64#include "exc_request_S.h"
65#include "notify_S.h"
66#include "process_reply_S.h"
67#include "msg_reply_S.h"
68#include "exc_request_U.h"
69#include "msg_U.h"
70
71static process_t proc_server = MACH_PORT_NULL;
72
73/* If we've sent a proc_wait_request to the proc server, the pid of the
74 process we asked about. We can only ever have one outstanding. */
75int proc_wait_pid = 0;
76
77/* The number of wait requests we've sent, and expect replies from. */
78int proc_waits_pending = 0;
79
80int gnu_debug_flag = 0;
81
82/* Forward decls */
83
84extern struct target_ops gnu_ops;
c906108c 85
c906108c
SS
86struct inf *make_inf ();
87void inf_clear_wait (struct inf *inf);
88void inf_cleanup (struct inf *inf);
89void inf_startup (struct inf *inf, int pid);
90int inf_update_suspends (struct inf *inf);
91void inf_set_pid (struct inf *inf, pid_t pid);
92void inf_validate_procs (struct inf *inf);
93void inf_steal_exc_ports (struct inf *inf);
94void inf_restore_exc_ports (struct inf *inf);
95struct proc *inf_tid_to_proc (struct inf *inf, int tid);
c5aa993b
JM
96inline void inf_set_threads_resume_sc (struct inf *inf,
97 struct proc *run_thread,
c906108c
SS
98 int run_others);
99inline int inf_set_threads_resume_sc_for_signal_thread (struct inf *inf);
100inline void inf_suspend (struct inf *inf);
101inline void inf_resume (struct inf *inf);
102void inf_set_step_thread (struct inf *inf, struct proc *proc);
103void inf_detach (struct inf *inf);
104void inf_attach (struct inf *inf, int pid);
105void inf_signal (struct inf *inf, enum target_signal sig);
cce74817 106void inf_continue (struct inf *inf);
c906108c
SS
107
108#define inf_debug(_inf, msg, args...) \
109 do { struct inf *__inf = (_inf); \
110 debug ("{inf %d %p}: " msg, __inf->pid, __inf , ##args); } while (0)
111
112void proc_abort (struct proc *proc, int force);
c906108c
SS
113struct proc *make_proc (struct inf *inf, mach_port_t port, int tid);
114struct proc *_proc_free (struct proc *proc);
115int proc_update_sc (struct proc *proc);
c5aa993b 116error_t proc_get_exception_port (struct proc *proc, mach_port_t * port);
c906108c
SS
117error_t proc_set_exception_port (struct proc *proc, mach_port_t port);
118static mach_port_t _proc_get_exc_port (struct proc *proc);
119void proc_steal_exc_port (struct proc *proc, mach_port_t exc_port);
120void proc_restore_exc_port (struct proc *proc);
121int proc_trace (struct proc *proc, int set);
c906108c
SS
122
123/* Evaluate RPC_EXPR in a scope with the variables MSGPORT and REFPORT bound
124 to INF's msg port and task port respectively. If it has no msg port,
125 EIEIO is returned. INF must refer to a running process! */
126#define INF_MSGPORT_RPC(inf, rpc_expr) \
127 HURD_MSGPORT_RPC (proc_getmsgport (proc_server, inf->pid, &msgport), \
128 (refport = inf->task->port, 0), 0, \
129 msgport ? (rpc_expr) : EIEIO)
130
131/* Like INF_MSGPORT_RPC, but will also resume the signal thread to ensure
132 there's someone around to deal with the RPC (and resuspend things
133 afterwards). This effects INF's threads' resume_sc count. */
134#define INF_RESUME_MSGPORT_RPC(inf, rpc_expr) \
135 (inf_set_threads_resume_sc_for_signal_thread (inf) \
136 ? ({ error_t __e; \
137 inf_resume (inf); \
138 __e = INF_MSGPORT_RPC (inf, rpc_expr); \
139 inf_suspend (inf); \
140 __e; }) \
141 : EIEIO)
142
c5aa993b 143#define MIG_SERVER_DIED EMIG_SERVER_DIED /* XXX */
c906108c
SS
144\f
145/* The state passed by an exception message. */
146struct exc_state
c5aa993b
JM
147 {
148 int exception; /* The exception code */
149 int code, subcode;
150 mach_port_t handler; /* The real exception port to handle this. */
151 mach_port_t reply; /* The reply port from the exception call. */
152 };
c906108c
SS
153
154/* The results of the last wait an inf did. */
155struct inf_wait
c5aa993b
JM
156 {
157 struct target_waitstatus status; /* The status returned to gdb. */
158 struct exc_state exc; /* The exception that caused us to return. */
159 struct proc *thread; /* The thread in question. */
160 int suppress; /* Something trivial happened. */
161 };
c906108c
SS
162
163/* The state of an inferior. */
164struct inf
c5aa993b
JM
165 {
166 /* Fields describing the current inferior. */
c906108c 167
c5aa993b
JM
168 struct proc *task; /* The mach task. */
169 struct proc *threads; /* A linked list of all threads in TASK. */
c906108c 170
c5aa993b
JM
171 /* True if THREADS needn't be validated by querying the task. We assume that
172 we and the task in question are the only ones frobbing the thread list,
173 so as long as we don't let any code run, we don't have to worry about
174 THREADS changing. */
175 int threads_up_to_date;
c906108c 176
c5aa993b 177 pid_t pid; /* The real system PID. */
c906108c 178
c5aa993b 179 struct inf_wait wait; /* What to return from target_wait. */
c906108c 180
c5aa993b
JM
181 /* One thread proc in INF may be in `single-stepping mode'. This is it. */
182 struct proc *step_thread;
c906108c 183
c5aa993b
JM
184 /* The thread we think is the signal thread. */
185 struct proc *signal_thread;
c906108c 186
c5aa993b 187 mach_port_t event_port; /* Where we receive various msgs. */
c906108c 188
c5aa993b
JM
189 /* True if we think at least one thread in the inferior could currently be
190 running. */
191 unsigned int running:1;
c906108c 192
c5aa993b
JM
193 /* True if the process has stopped (in the proc server sense). Note that
194 since a proc server `stop' leaves the signal thread running, the inf can
195 be RUNNING && STOPPED... */
196 unsigned int stopped:1;
cce74817 197
c5aa993b
JM
198 /* True if the inferior has no message port. */
199 unsigned int nomsg:1;
c906108c 200
c5aa993b
JM
201 /* True if the inferior is traced. */
202 unsigned int traced:1;
c906108c 203
c5aa993b
JM
204 /* True if we shouldn't try waiting for the inferior, usually because we
205 can't for some reason. */
206 unsigned int no_wait:1;
c906108c 207
c5aa993b
JM
208 /* When starting a new inferior, we don't try to validate threads until all
209 the proper execs have been done. This is a count of how many execs we
210 expect to happen. */
211 unsigned pending_execs;
c906108c 212
c5aa993b 213 /* Fields describing global state */
c906108c 214
c5aa993b
JM
215 /* The task suspend count used when gdb has control. This is normally 1 to
216 make things easier for us, but sometimes (like when attaching to vital
217 system servers) it may be desirable to let the task continue to run
218 (pausing individual threads as necessary). */
219 int pause_sc;
c906108c 220
c5aa993b
JM
221 /* The task suspend count left when detaching from a task. */
222 int detach_sc;
c906108c 223
c5aa993b
JM
224 /* The initial values used for the run_sc and pause_sc of newly discovered
225 threads -- see the definition of those fields in struct proc. */
226 int default_thread_run_sc;
227 int default_thread_pause_sc;
228 int default_thread_detach_sc;
c906108c 229
c5aa993b
JM
230 /* True if the process should be traced when started/attached. Newly
231 started processes *must* be traced at first to exec them properly, but
232 if this is false, tracing is turned off as soon it has done so. */
233 int want_signals;
c906108c 234
c5aa993b
JM
235 /* True if exceptions from the inferior process should be trapped. This
236 must be on to use breakpoints. */
237 int want_exceptions;
238 };
c906108c
SS
239
240
c5aa993b
JM
241int
242__proc_pid (struct proc *proc)
c906108c
SS
243{
244 return proc->inf->pid;
245}
246\f
247/* Update PROC's real suspend count to match it's desired one. Returns true
248 if we think PROC is now in a runnable state. */
249int
250proc_update_sc (struct proc *proc)
251{
252 int running;
c5aa993b 253 int err = 0;
c906108c
SS
254 int delta = proc->sc - proc->cur_sc;
255
256 if (delta)
257 proc_debug (proc, "sc: %d --> %d", proc->cur_sc, proc->sc);
258
259 if (proc->sc == 0 && proc->state_changed)
260 /* Since PROC may start running, we must write back any state changes. */
261 {
262 assert (proc_is_thread (proc));
263 proc_debug (proc, "storing back changed thread state");
264 err = thread_set_state (proc->port, THREAD_STATE_FLAVOR,
c5aa993b
JM
265 (thread_state_t) & proc->state, THREAD_STATE_SIZE);
266 if (!err)
c906108c
SS
267 proc->state_changed = 0;
268 }
269
270 if (delta > 0)
271 while (delta-- > 0 && !err)
272 if (proc_is_task (proc))
273 err = task_suspend (proc->port);
274 else
275 err = thread_suspend (proc->port);
276 else
277 while (delta++ < 0 && !err)
278 if (proc_is_task (proc))
279 err = task_resume (proc->port);
280 else
281 err = thread_resume (proc->port);
282
c5aa993b 283 if (!err)
c906108c
SS
284 proc->cur_sc = proc->sc;
285
286 /* If we got an error, then the task/thread has disappeared. */
287 running = !err && proc->sc == 0;
288
289 proc_debug (proc, "is %s", err ? "dead" : running ? "running" : "suspended");
290 if (err)
291 proc_debug (proc, "err = %s", strerror (err));
292
293 if (running)
294 {
295 proc->aborted = 0;
296 proc->state_valid = proc->state_changed = 0;
297 proc->fetched_regs = 0;
298 }
299
300 return running;
301}
302\f
303/* Thread_abort is called on PROC if needed. PROC must be a thread proc.
304 If PROC is deemed `precious', then nothing is done unless FORCE is true.
305 In particular, a thread is precious if it's running (in which case forcing
306 it includes suspending it first), or if it has an exception pending. */
307void
308proc_abort (struct proc *proc, int force)
309{
310 assert (proc_is_thread (proc));
311
c5aa993b 312 if (!proc->aborted)
c906108c
SS
313 {
314 struct inf *inf = proc->inf;
315 int running = (proc->cur_sc == 0 && inf->task->cur_sc == 0);
316
317 if (running && force)
318 {
319 proc->sc = 1;
320 inf_update_suspends (proc->inf);
321 running = 0;
322 warning ("Stopped %s.", proc_string (proc));
323 }
324 else if (proc == inf->wait.thread && inf->wait.exc.reply && !force)
325 /* An exception is pending on PROC, which don't mess with. */
326 running = 1;
327
c5aa993b 328 if (!running)
c906108c
SS
329 /* We only abort the thread if it's not actually running. */
330 {
331 thread_abort (proc->port);
332 proc_debug (proc, "aborted");
333 proc->aborted = 1;
334 }
335 else
336 proc_debug (proc, "not aborting");
337 }
338}
339
340/* Make sure that the state field in PROC is up to date, and return a pointer
341 to it, or 0 if something is wrong. If WILL_MODIFY is true, makes sure
342 that the thread is stopped and aborted first, and sets the state_changed
343 field in PROC to true. */
344thread_state_t
345proc_get_state (struct proc *proc, int will_modify)
346{
347 int was_aborted = proc->aborted;
348
349 proc_debug (proc, "updating state info%s",
350 will_modify ? " (with intention to modify)" : "");
351
352 proc_abort (proc, will_modify);
353
c5aa993b 354 if (!was_aborted && proc->aborted)
c906108c
SS
355 /* PROC's state may have changed since we last fetched it. */
356 proc->state_valid = 0;
357
c5aa993b 358 if (!proc->state_valid)
c906108c
SS
359 {
360 mach_msg_type_number_t state_size = THREAD_STATE_SIZE;
361 error_t err =
c5aa993b
JM
362 thread_get_state (proc->port, THREAD_STATE_FLAVOR,
363 (thread_state_t) & proc->state, &state_size);
c906108c
SS
364 proc_debug (proc, "getting thread state");
365 proc->state_valid = !err;
366 }
367
368 if (proc->state_valid)
369 {
370 if (will_modify)
371 proc->state_changed = 1;
c5aa993b 372 return (thread_state_t) & proc->state;
c906108c
SS
373 }
374 else
375 return 0;
376}
377\f
378/* Set PORT to PROC's exception port. */
379error_t
c5aa993b 380proc_get_exception_port (struct proc * proc, mach_port_t * port)
c906108c
SS
381{
382 if (proc_is_task (proc))
383 return task_get_exception_port (proc->port, port);
384 else
385 return thread_get_exception_port (proc->port, port);
386}
387
388/* Set PROC's exception port to PORT. */
389error_t
c5aa993b 390proc_set_exception_port (struct proc * proc, mach_port_t port)
c906108c
SS
391{
392 proc_debug (proc, "setting exception port: %d", port);
393 if (proc_is_task (proc))
394 return task_set_exception_port (proc->port, port);
395 else
396 return thread_set_exception_port (proc->port, port);
397}
398
399/* Get PROC's exception port, cleaning up a bit if proc has died. */
400static mach_port_t
401_proc_get_exc_port (struct proc *proc)
402{
403 mach_port_t exc_port;
404 error_t err = proc_get_exception_port (proc, &exc_port);
405
406 if (err)
407 /* PROC must be dead. */
408 {
409 if (proc->exc_port)
410 mach_port_deallocate (mach_task_self (), proc->exc_port);
411 proc->exc_port = MACH_PORT_NULL;
412 if (proc->saved_exc_port)
413 mach_port_deallocate (mach_task_self (), proc->saved_exc_port);
414 proc->saved_exc_port = MACH_PORT_NULL;
415 }
416
417 return exc_port;
418}
419
420/* Replace PROC's exception port with EXC_PORT, unless it's already been
421 done. Stash away any existing exception port so we can restore it later. */
422void
423proc_steal_exc_port (struct proc *proc, mach_port_t exc_port)
424{
425 mach_port_t cur_exc_port = _proc_get_exc_port (proc);
426
427 if (cur_exc_port)
428 {
429 error_t err;
430
431 proc_debug (proc, "inserting exception port: %d", exc_port);
432
433 if (cur_exc_port != exc_port)
434 /* Put in our exception port. */
435 err = proc_set_exception_port (proc, exc_port);
436
437 if (err || cur_exc_port == proc->exc_port)
438 /* We previously set the exception port, and it's still set. So we
439 just keep the old saved port which is what the proc set. */
440 {
441 if (cur_exc_port)
442 mach_port_deallocate (mach_task_self (), cur_exc_port);
443 }
444 else
445 /* Keep a copy of PROC's old exception port so it can be restored. */
446 {
447 if (proc->saved_exc_port)
448 mach_port_deallocate (mach_task_self (), proc->saved_exc_port);
449 proc->saved_exc_port = cur_exc_port;
450 }
451
452 proc_debug (proc, "saved exception port: %d", proc->saved_exc_port);
453
454 if (!err)
455 proc->exc_port = exc_port;
456 else
457 warning ("Error setting exception port for %s: %s",
458 proc_string (proc), strerror (err));
459 }
460}
461
462/* If we previously replaced PROC's exception port, put back what we
463 found there at the time, unless *our* exception port has since been
464 overwritten, in which case who knows what's going on. */
465void
466proc_restore_exc_port (struct proc *proc)
467{
468 mach_port_t cur_exc_port = _proc_get_exc_port (proc);
469
470 if (cur_exc_port)
471 {
472 error_t err = 0;
473
474 proc_debug (proc, "restoring real exception port");
475
476 if (proc->exc_port == cur_exc_port)
477 /* Our's is still there. */
478 err = proc_set_exception_port (proc, proc->saved_exc_port);
479
480 if (proc->saved_exc_port)
481 mach_port_deallocate (mach_task_self (), proc->saved_exc_port);
482 proc->saved_exc_port = MACH_PORT_NULL;
483
484 if (!err)
485 proc->exc_port = MACH_PORT_NULL;
486 else
487 warning ("Error setting exception port for %s: %s",
488 proc_string (proc), strerror (err));
489 }
490}
491\f
492/* Turns hardware tracing in PROC on or off when SET is true or false,
493 respectively. Returns true on success. */
494int
495proc_trace (struct proc *proc, int set)
496{
497 thread_state_t state = proc_get_state (proc, 1);
498
c5aa993b 499 if (!state)
c906108c
SS
500 return 0; /* the thread must be dead. */
501
502 proc_debug (proc, "tracing %s", set ? "on" : "off");
c5aa993b 503
c906108c
SS
504 if (set)
505 {
506 /* XXX We don't get the exception unless the thread has its own
c5aa993b 507 exception port???? */
c906108c
SS
508 if (proc->exc_port == MACH_PORT_NULL)
509 proc_steal_exc_port (proc, proc->inf->event_port);
510 THREAD_STATE_SET_TRACED (state);
511 }
512 else
513 THREAD_STATE_CLEAR_TRACED (state);
514
515 return 1;
516}
517\f
518/* A variable from which to assign new TIDs. */
519static int next_thread_id = 1;
520
521/* Returns a new proc structure with the given fields. Also adds a
522 notification for PORT becoming dead to be sent to INF's notify port. */
523struct proc *
524make_proc (struct inf *inf, mach_port_t port, int tid)
525{
526 error_t err;
527 mach_port_t prev_port = MACH_PORT_NULL;
528 struct proc *proc = malloc (sizeof (struct proc));
529
530 proc->port = port;
531 proc->tid = tid;
532 proc->inf = inf;
533 proc->next = 0;
534 proc->saved_exc_port = MACH_PORT_NULL;
535 proc->exc_port = MACH_PORT_NULL;
536
537 proc->sc = 0;
538 proc->cur_sc = 0;
539
540 /* Note that these are all the values for threads; the task simply uses the
541 corresponding field in INF directly. */
542 proc->run_sc = inf->default_thread_run_sc;
543 proc->pause_sc = inf->default_thread_pause_sc;
544 proc->detach_sc = inf->default_thread_detach_sc;
545 proc->resume_sc = proc->run_sc;
546
547 proc->aborted = 0;
548 proc->dead = 0;
549 proc->state_valid = 0;
550 proc->state_changed = 0;
551
552 proc_debug (proc, "is new");
553
554 /* Get notified when things die. */
555 err =
c5aa993b 556 mach_port_request_notification (mach_task_self (), port,
c906108c
SS
557 MACH_NOTIFY_DEAD_NAME, 1,
558 inf->event_port,
559 MACH_MSG_TYPE_MAKE_SEND_ONCE,
560 &prev_port);
561 if (err)
562 warning ("Couldn't request notification for port %d: %s",
563 port, strerror (err));
564 else
565 {
566 proc_debug (proc, "notifications to: %d", inf->event_port);
567 if (prev_port != MACH_PORT_NULL)
568 mach_port_deallocate (mach_task_self (), prev_port);
569 }
570
571 if (inf->want_exceptions)
572 if (proc_is_task (proc))
573 /* Make the task exception port point to us. */
574 proc_steal_exc_port (proc, inf->event_port);
575 else
576 /* Just clear thread exception ports -- they default to the task one. */
577 proc_steal_exc_port (proc, MACH_PORT_NULL);
578
579 return proc;
580}
581
582/* Frees PROC and any resources it uses, and returns the value of PROC's
583 next field. */
584struct proc *
585_proc_free (struct proc *proc)
586{
587 struct inf *inf = proc->inf;
588 struct proc *next = proc->next;
589
590 proc_debug (proc, "freeing...");
591
592 if (proc == inf->step_thread)
593 /* Turn off single stepping. */
594 inf_set_step_thread (inf, 0);
595 if (proc == inf->wait.thread)
596 inf_clear_wait (inf);
597 if (proc == inf->signal_thread)
598 inf->signal_thread = 0;
599
600 if (proc->port != MACH_PORT_NULL)
601 {
602 if (proc->exc_port != MACH_PORT_NULL)
603 /* Restore the original exception port. */
604 proc_restore_exc_port (proc);
605 if (proc->cur_sc != 0)
606 /* Resume the thread/task. */
607 {
608 proc->sc = 0;
609 proc_update_sc (proc);
610 }
611 mach_port_deallocate (mach_task_self (), proc->port);
612 }
613
614 free (proc);
615 return next;
616}
617\f
c5aa993b
JM
618struct inf *
619make_inf ()
c906108c
SS
620{
621 struct inf *inf = malloc (sizeof (struct inf));
622
623 if (!inf)
624 return 0;
625
626 inf->task = 0;
627 inf->threads = 0;
628 inf->threads_up_to_date = 0;
629 inf->pid = 0;
630 inf->wait.status.kind = TARGET_WAITKIND_SPURIOUS;
631 inf->wait.thread = 0;
632 inf->wait.exc.handler = MACH_PORT_NULL;
633 inf->wait.exc.reply = MACH_PORT_NULL;
634 inf->step_thread = 0;
635 inf->signal_thread = 0;
636 inf->event_port = MACH_PORT_NULL;
c906108c 637 inf->running = 0;
cce74817
JM
638 inf->stopped = 0;
639 inf->nomsg = 1;
c906108c
SS
640 inf->traced = 0;
641 inf->no_wait = 0;
642 inf->pending_execs = 0;
643 inf->pause_sc = 1;
644 inf->detach_sc = 0;
645 inf->default_thread_run_sc = 0;
646 inf->default_thread_pause_sc = 0;
647 inf->default_thread_detach_sc = 0;
648 inf->want_signals = 1; /* By default */
649 inf->want_exceptions = 1; /* By default */
650
651 return inf;
652}
653
654/* clear INF's target wait status. */
655void
656inf_clear_wait (struct inf *inf)
657{
658 inf_debug (inf, "clearing wait");
659 inf->wait.status.kind = TARGET_WAITKIND_SPURIOUS;
660 inf->wait.thread = 0;
661 inf->wait.suppress = 0;
662 if (inf->wait.exc.handler != MACH_PORT_NULL)
663 {
664 mach_port_deallocate (mach_task_self (), inf->wait.exc.handler);
665 inf->wait.exc.handler = MACH_PORT_NULL;
666 }
667 if (inf->wait.exc.reply != MACH_PORT_NULL)
668 {
669 mach_port_deallocate (mach_task_self (), inf->wait.exc.reply);
670 inf->wait.exc.reply = MACH_PORT_NULL;
671 }
672}
673\f
674void
675inf_cleanup (struct inf *inf)
676{
677 inf_debug (inf, "cleanup");
678
679 inf_clear_wait (inf);
680
681 inf_set_pid (inf, -1);
682 inf->pid = 0;
cce74817
JM
683 inf->running = 0;
684 inf->stopped = 0;
685 inf->nomsg = 1;
c906108c
SS
686 inf->traced = 0;
687 inf->no_wait = 0;
c906108c
SS
688 inf->pending_execs = 0;
689
690 if (inf->event_port)
691 {
692 mach_port_destroy (mach_task_self (), inf->event_port);
693 inf->event_port = MACH_PORT_NULL;
694 }
695}
696
697void
698inf_startup (struct inf *inf, int pid)
699{
700 error_t err;
701
702 inf_debug (inf, "startup: pid = %d", pid);
703
704 inf_cleanup (inf);
705
706 /* Make the port on which we receive all events. */
707 err = mach_port_allocate (mach_task_self (),
708 MACH_PORT_RIGHT_RECEIVE, &inf->event_port);
709 if (err)
710 error ("Error allocating event port: %s", strerror (err));
711
712 /* Make a send right for it, so we can easily copy it for other people. */
713 mach_port_insert_right (mach_task_self (), inf->event_port,
714 inf->event_port, MACH_MSG_TYPE_MAKE_SEND);
715 inf_set_pid (inf, pid);
716}
717\f
718/* close current process, if any, and attach INF to process PORT */
c5aa993b 719void
c906108c
SS
720inf_set_pid (struct inf *inf, pid_t pid)
721{
722 task_t task_port;
723 struct proc *task = inf->task;
724
725 inf_debug (inf, "setting pid: %d", pid);
726
727 if (pid < 0)
728 task_port = MACH_PORT_NULL;
729 else
730 {
731 error_t err = proc_pid2task (proc_server, pid, &task_port);
732 if (err)
733 error ("Error getting task for pid %d: %s", pid, strerror (err));
734 }
735
736 inf_debug (inf, "setting task: %d", task_port);
737
738 if (inf->pause_sc)
739 task_suspend (task_port);
740
741 if (task && task->port != task_port)
742 {
743 inf->task = 0;
744 inf_validate_procs (inf); /* Trash all the threads. */
745 _proc_free (task); /* And the task. */
746 }
747
748 if (task_port != MACH_PORT_NULL)
749 {
750 inf->task = make_proc (inf, task_port, PROC_TID_TASK);
751 inf->threads_up_to_date = 0;
752 }
753
754 if (inf->task)
755 {
756 inf->pid = pid;
757 if (inf->pause_sc)
c5aa993b 758 inf->task->sc = inf->task->cur_sc = 1; /* Reflect task_suspend above */
c906108c
SS
759 }
760 else
761 inf->pid = -1;
762}
763\f
cce74817
JM
764/* Validates INF's stopped, nomsg and traced field from the actual
765 proc server state. Note that the traced field is only updated from
766 the proc server state if we do not have a message port. If we do
767 have a message port we'd better look at the tracemask itself. */
c906108c 768static void
cce74817 769inf_validate_procinfo (struct inf *inf)
c906108c
SS
770{
771 char *noise;
772 mach_msg_type_number_t noise_len = 0;
773 struct procinfo *pi;
774 mach_msg_type_number_t pi_len = 0;
775 int info_flags = 0;
776 error_t err =
c5aa993b
JM
777 proc_getprocinfo (proc_server, inf->pid, &info_flags,
778 (procinfo_t *) & pi, &pi_len, &noise, &noise_len);
c906108c 779
c5aa993b 780 if (!err)
c906108c
SS
781 {
782 inf->stopped = !!(pi->state & PI_STOPPED);
cce74817
JM
783 inf->nomsg = !!(pi->state & PI_NOMSG);
784 if (inf->nomsg)
785 inf->traced = !!(pi->state & PI_TRACED);
c5aa993b 786 vm_deallocate (mach_task_self (), (vm_address_t) pi, pi_len);
c906108c 787 if (noise_len > 0)
c5aa993b 788 vm_deallocate (mach_task_self (), (vm_address_t) noise, noise_len);
c906108c
SS
789 }
790}
791
f90b2b1d
JK
792/* Validates INF's task suspend count. If it's higher than we expect,
793 verify with the user before `stealing' the extra count. */
c906108c
SS
794static void
795inf_validate_task_sc (struct inf *inf)
796{
f90b2b1d
JK
797 char *noise;
798 mach_msg_type_number_t noise_len = 0;
799 struct procinfo *pi;
800 mach_msg_type_number_t pi_len = 0;
801 int info_flags = PI_FETCH_TASKINFO;
802 int suspend_count = -1;
803 error_t err;
c906108c 804
f90b2b1d
JK
805 retry:
806 err = proc_getprocinfo (proc_server, inf->pid, &info_flags,
807 &pi, &pi_len, &noise, &noise_len);
c906108c 808 if (err)
f90b2b1d
JK
809 {
810 inf->task->dead = 1; /* oh well */
811 return;
812 }
813
814 if (inf->task->cur_sc < pi->taskinfo.suspend_count && suspend_count == -1)
815 {
816 /* The proc server might have suspended the task while stopping
817 it. This happens when the task is handling a traced signal.
818 Refetch the suspend count. The proc server should be
819 finished stopping the task by now. */
820 suspend_count = pi->taskinfo.suspend_count;
821 goto retry;
822 }
823
824 suspend_count = pi->taskinfo.suspend_count;
825
826 vm_deallocate (mach_task_self (), (vm_address_t) pi, pi_len);
827 if (noise_len > 0)
828 vm_deallocate (mach_task_self (), (vm_address_t) pi, pi_len);
829
830 if (inf->task->cur_sc < suspend_count)
c906108c
SS
831 {
832 int abort;
833
834 target_terminal_ours (); /* Allow I/O. */
f90b2b1d
JK
835 abort = !query ("Pid %d has an additional task suspend count of %d;"
836 " clear it? ", inf->pid,
837 suspend_count - inf->task->cur_sc);
c5aa993b 838 target_terminal_inferior (); /* Give it back to the child. */
c906108c
SS
839
840 if (abort)
841 error ("Additional task suspend count left untouched.");
842
f90b2b1d 843 inf->task->cur_sc = suspend_count;
c906108c
SS
844 }
845}
846
847/* Turns tracing for INF on or off, depending on ON, unless it already is.
848 If INF is running, the resume_sc count of INF's threads will be modified,
849 and the signal thread will briefly be run to change the trace state. */
850void
851inf_set_traced (struct inf *inf, int on)
852{
853 if (on != inf->traced)
854 if (inf->task && !inf->task->dead)
855 /* Make it take effect immediately. */
856 {
c5aa993b 857 sigset_t mask = on ? ~(sigset_t) 0 : 0;
c906108c 858 error_t err =
c5aa993b
JM
859 INF_RESUME_MSGPORT_RPC (inf, msg_set_init_int (msgport, refport,
860 INIT_TRACEMASK, mask));
c906108c
SS
861 if (err == EIEIO)
862 {
863 if (on)
864 warning ("Can't modify tracing state for pid %d: No signal thread",
865 inf->pid);
866 inf->traced = on;
867 }
868 else if (err)
869 warning ("Can't modify tracing state for pid %d: %s",
870 inf->pid, strerror (err));
871 else
872 inf->traced = on;
873 }
874 else
875 inf->traced = on;
876}
877\f
878/* Makes all the real suspend count deltas of all the procs in INF match the
879 desired values. Careful to always do thread/task suspend counts in the
c5aa993b 880 safe order. Returns true if at least one thread is thought to be running. */
c906108c
SS
881int
882inf_update_suspends (struct inf *inf)
883{
884 struct proc *task = inf->task;
885 /* We don't have to update INF->threads even though we're iterating over it
886 because we'll change a thread only if it already has an existing proc
887 entry. */
888
889 inf_debug (inf, "updating suspend counts");
890
891 if (task)
892 {
893 struct proc *thread;
894 int task_running = (task->sc == 0), thread_running = 0;
895
896 if (task->sc > task->cur_sc)
897 /* The task is becoming _more_ suspended; do before any threads. */
898 task_running = proc_update_sc (task);
899
900 if (inf->pending_execs)
901 /* When we're waiting for an exec, things may be happening behind our
902 back, so be conservative. */
903 thread_running = 1;
904
905 /* Do all the thread suspend counts. */
906 for (thread = inf->threads; thread; thread = thread->next)
907 thread_running |= proc_update_sc (thread);
908
909 if (task->sc != task->cur_sc)
910 /* We didn't do the task first, because we wanted to wait for the
911 threads; do it now. */
912 task_running = proc_update_sc (task);
913
914 inf_debug (inf, "%srunning...",
915 (thread_running && task_running) ? "" : "not ");
916
917 inf->running = thread_running && task_running;
918
919 /* Once any thread has executed some code, we can't depend on the
c5aa993b 920 threads list any more. */
c906108c
SS
921 if (inf->running)
922 inf->threads_up_to_date = 0;
923
924 return inf->running;
925 }
926
927 return 0;
928}
929\f
930/* Converts a GDB pid to a struct proc. */
931struct proc *
932inf_tid_to_thread (struct inf *inf, int tid)
933{
934 struct proc *thread = inf->threads;
935
936 while (thread)
937 if (thread->tid == tid)
938 return thread;
939 else
940 thread = thread->next;
941 return 0;
942}
943
944/* Converts a thread port to a struct proc. */
945struct proc *
946inf_port_to_thread (struct inf *inf, mach_port_t port)
947{
948 struct proc *thread = inf->threads;
949 while (thread)
950 if (thread->port == port)
951 return thread;
952 else
953 thread = thread->next;
954 return 0;
955}
956\f
957/* Make INF's list of threads be consistent with reality of TASK. */
958void
959inf_validate_procs (struct inf *inf)
960{
961 int i;
962 thread_array_t threads;
963 unsigned num_threads;
964 struct proc *task = inf->task;
965
966 /* If no threads are currently running, this function will guarantee that
967 things are up to date. The exception is if there are zero threads --
968 then it is almost certainly in an odd state, and probably some outside
969 agent will create threads. */
970 inf->threads_up_to_date = inf->threads ? !inf->running : 0;
971
972 if (task)
973 {
974 error_t err = task_threads (task->port, &threads, &num_threads);
975 inf_debug (inf, "fetching threads");
976 if (err)
977 /* TASK must be dead. */
978 {
979 task->dead = 1;
980 task = 0;
981 }
982 }
983
984 if (!task)
985 {
986 num_threads = 0;
987 inf_debug (inf, "no task");
988 }
989
990 {
991 unsigned search_start = 0; /* Make things normally linear. */
992 /* Which thread in PROCS corresponds to each task thread, & the task. */
993 struct proc *matched[num_threads + 1];
994 /* The last thread in INF->threads, so we can add to the end. */
995 struct proc *last = 0;
996 /* The current thread we're considering. */
997 struct proc *thread = inf->threads;
998
999 bzero (matched, sizeof (matched));
1000
1001 while (thread)
1002 {
1003 unsigned left;
1004
1005 for (i = search_start, left = num_threads; left; i++, left--)
1006 {
1007 if (i >= num_threads)
c5aa993b 1008 i -= num_threads; /* I wrapped around. */
c906108c
SS
1009 if (thread->port == threads[i])
1010 /* We already know about this thread. */
1011 {
1012 matched[i] = thread;
1013 last = thread;
1014 thread = thread->next;
1015 search_start++;
1016 break;
1017 }
1018 }
1019
c5aa993b 1020 if (!left)
c906108c
SS
1021 {
1022 proc_debug (thread, "died!");
1023 thread->port = MACH_PORT_NULL;
c5aa993b 1024 thread = _proc_free (thread); /* THREAD is dead. */
c906108c
SS
1025 (last ? last->next : inf->threads) = thread;
1026 }
1027 }
1028
1029 for (i = 0; i < num_threads; i++)
1030 if (matched[i])
1031 /* Throw away the duplicate send right. */
1032 mach_port_deallocate (mach_task_self (), threads[i]);
1033 else
1034 /* THREADS[I] is a thread we don't know about yet! */
1035 {
1036 thread = make_proc (inf, threads[i], next_thread_id++);
1037 (last ? last->next : inf->threads) = thread;
1038 last = thread;
1039 proc_debug (thread, "new thread: %d", threads[i]);
c5aa993b 1040 add_thread (thread->tid); /* Tell GDB's generic thread code. */
c906108c
SS
1041 }
1042
c5aa993b
JM
1043 vm_deallocate (mach_task_self (),
1044 (vm_address_t) threads, (num_threads * sizeof (thread_t)));
c906108c
SS
1045 }
1046}
1047\f
1048/* Makes sure that INF's thread list is synced with the actual process. */
1049inline int
1050inf_update_procs (struct inf *inf)
1051{
c5aa993b 1052 if (!inf->task)
c906108c 1053 return 0;
c5aa993b 1054 if (!inf->threads_up_to_date)
c906108c
SS
1055 inf_validate_procs (inf);
1056 return !!inf->task;
1057}
1058
1059/* Sets the resume_sc of each thread in inf. That of RUN_THREAD is set to 0,
1060 and others are set to their run_sc if RUN_OTHERS is true, and otherwise
1061 their pause_sc. */
c5aa993b 1062inline void
c906108c
SS
1063inf_set_threads_resume_sc (struct inf *inf,
1064 struct proc *run_thread, int run_others)
1065{
1066 struct proc *thread;
1067 inf_update_procs (inf);
1068 for (thread = inf->threads; thread; thread = thread->next)
1069 if (thread == run_thread)
1070 thread->resume_sc = 0;
1071 else if (run_others)
1072 thread->resume_sc = thread->run_sc;
1073 else
1074 thread->resume_sc = thread->pause_sc;
1075}
1076\f
1077/* Cause INF to continue execution immediately; individual threads may still
1078 be suspended (but their suspend counts will be updated). */
1079inline void
1080inf_resume (struct inf *inf)
1081{
1082 struct proc *thread;
1083
1084 inf_update_procs (inf);
1085
1086 for (thread = inf->threads; thread; thread = thread->next)
1087 thread->sc = thread->resume_sc;
1088
1089 if (inf->task)
1090 {
c5aa993b 1091 if (!inf->pending_execs)
c906108c
SS
1092 /* Try to make sure our task count is correct -- in the case where
1093 we're waiting for an exec though, things are too volatile, so just
1094 assume things will be reasonable (which they usually will be). */
1095 inf_validate_task_sc (inf);
1096 inf->task->sc = 0;
1097 }
1098
1099 inf_update_suspends (inf);
1100}
1101
1102/* Cause INF to stop execution immediately; individual threads may still
1103 be running. */
1104inline void
1105inf_suspend (struct inf *inf)
1106{
1107 struct proc *thread;
1108
1109 inf_update_procs (inf);
1110
1111 for (thread = inf->threads; thread; thread = thread->next)
1112 thread->sc = thread->pause_sc;
1113
1114 if (inf->task)
1115 inf->task->sc = inf->pause_sc;
1116
1117 inf_update_suspends (inf);
1118}
1119\f
1120/* INF has one thread PROC that is in single-stepping mode. This function
1121 changes it to be PROC, changing any old step_thread to be a normal one. A
1122 PROC of 0 clears any existing value. */
1123void
1124inf_set_step_thread (struct inf *inf, struct proc *thread)
1125{
1126 assert (!thread || proc_is_thread (thread));
1127
1128 if (thread)
1129 inf_debug (inf, "setting step thread: %d/%d", inf->pid, thread->tid);
1130 else
1131 inf_debug (inf, "clearing step thread");
1132
1133 if (inf->step_thread != thread)
1134 {
1135 if (inf->step_thread && inf->step_thread->port != MACH_PORT_NULL)
c5aa993b 1136 if (!proc_trace (inf->step_thread, 0))
c906108c
SS
1137 return;
1138 if (thread && proc_trace (thread, 1))
1139 inf->step_thread = thread;
1140 else
1141 inf->step_thread = 0;
1142 }
1143}
1144\f
1145/* Set up the thread resume_sc's so that only the signal thread is running
1146 (plus whatever other thread are set to always run). Returns true if we
1147 did so, or false if we can't find a signal thread. */
1148inline int
1149inf_set_threads_resume_sc_for_signal_thread (struct inf *inf)
1150{
1151 if (inf->signal_thread)
1152 {
1153 inf_set_threads_resume_sc (inf, inf->signal_thread, 0);
1154 return 1;
1155 }
1156 else
1157 return 0;
1158}
1159
1160static void
1161inf_update_signal_thread (struct inf *inf)
1162{
1163 /* XXX for now we assume that if there's a msgport, the 2nd thread is
1164 the signal thread. */
1165 inf->signal_thread = inf->threads ? inf->threads->next : 0;
1166}
1167\f
1168/* Detachs from INF's inferior task, letting it run once again... */
1169void
1170inf_detach (struct inf *inf)
1171{
1172 struct proc *task = inf->task;
1173
1174 inf_debug (inf, "detaching...");
1175
1176 inf_clear_wait (inf);
1177 inf_set_step_thread (inf, 0);
1178
1179 if (task)
1180 {
1181 struct proc *thread;
1182
cce74817
JM
1183 inf_validate_procinfo (inf);
1184
c906108c
SS
1185 inf_set_traced (inf, 0);
1186 if (inf->stopped)
cce74817
JM
1187 {
1188 if (inf->nomsg)
1189 inf_continue (inf);
1190 else
1191 inf_signal (inf, TARGET_SIGNAL_0);
1192 }
c906108c
SS
1193
1194 proc_restore_exc_port (task);
1195 task->sc = inf->detach_sc;
1196
1197 for (thread = inf->threads; thread; thread = thread->next)
1198 {
1199 proc_restore_exc_port (thread);
1200 thread->sc = thread->detach_sc;
1201 }
1202
1203 inf_update_suspends (inf);
1204 }
1205
1206 inf_cleanup (inf);
1207}
1208
1209/* Attaches INF to the process with process id PID, returning it in a suspended
1210 state suitable for debugging. */
1211void
1212inf_attach (struct inf *inf, int pid)
1213{
1214 inf_debug (inf, "attaching: %d", pid);
1215
1216 if (inf->pid)
1217 inf_detach (inf);
1218
1219 inf_startup (inf, pid);
1220}
1221\f
1222/* Makes sure that we've got our exception ports entrenched in the process. */
c5aa993b
JM
1223void
1224inf_steal_exc_ports (struct inf *inf)
c906108c
SS
1225{
1226 struct proc *thread;
1227
1228 inf_debug (inf, "stealing exception ports");
1229
1230 inf_set_step_thread (inf, 0); /* The step thread is special. */
1231
1232 proc_steal_exc_port (inf->task, inf->event_port);
1233 for (thread = inf->threads; thread; thread = thread->next)
1234 proc_steal_exc_port (thread, MACH_PORT_NULL);
1235}
1236
1237/* Makes sure the process has its own exception ports. */
c5aa993b
JM
1238void
1239inf_restore_exc_ports (struct inf *inf)
c906108c
SS
1240{
1241 struct proc *thread;
1242
1243 inf_debug (inf, "restoring exception ports");
1244
1245 inf_set_step_thread (inf, 0); /* The step thread is special. */
1246
1247 proc_restore_exc_port (inf->task);
1248 for (thread = inf->threads; thread; thread = thread->next)
1249 proc_restore_exc_port (thread);
1250}
1251\f
1252/* Deliver signal SIG to INF. If INF is stopped, delivering a signal, even
1253 signal 0, will continue it. INF is assumed to be in a paused state, and
1254 the resume_sc's of INF's threads may be affected. */
1255void
1256inf_signal (struct inf *inf, enum target_signal sig)
1257{
1258 error_t err = 0;
1259 int host_sig = target_signal_to_host (sig);
1260
1261#define NAME target_signal_to_name (sig)
1262
1263 if (host_sig >= _NSIG)
1264 /* A mach exception. Exceptions are encoded in the signal space by
1265 putting them after _NSIG; this assumes they're positive (and not
1266 extremely large)! */
1267 {
1268 struct inf_wait *w = &inf->wait;
1269 if (w->status.kind == TARGET_WAITKIND_STOPPED
1270 && w->status.value.sig == sig
1271 && w->thread && !w->thread->aborted)
1272 /* We're passing through the last exception we received. This is
1273 kind of bogus, because exceptions are per-thread whereas gdb
1274 treats signals as per-process. We just forward the exception to
1275 the correct handler, even it's not for the same thread as TID --
1276 i.e., we pretend it's global. */
1277 {
1278 struct exc_state *e = &w->exc;
1279 inf_debug (inf, "passing through exception:"
1280 " task = %d, thread = %d, exc = %d"
1281 ", code = %d, subcode = %d",
1282 w->thread->port, inf->task->port,
1283 e->exception, e->code, e->subcode);
1284 err =
1285 exception_raise_request (e->handler,
1286 e->reply, MACH_MSG_TYPE_MOVE_SEND_ONCE,
1287 w->thread->port, inf->task->port,
1288 e->exception, e->code, e->subcode);
1289 }
1290 else
1291 error ("Can't forward spontaneous exception (%s).", NAME);
1292 }
1293 else
1294 /* A Unix signal. */
c5aa993b
JM
1295 if (inf->stopped)
1296 /* The process is stopped and expecting a signal. Just send off a
1297 request and let it get handled when we resume everything. */
1298 {
1299 inf_debug (inf, "sending %s to stopped process", NAME);
1300 err =
1301 INF_MSGPORT_RPC (inf,
1302 msg_sig_post_untraced_request (msgport,
1303 inf->event_port,
1304 MACH_MSG_TYPE_MAKE_SEND_ONCE,
1305 host_sig, 0,
1306 refport));
1307 if (!err)
1308 /* Posting an untraced signal automatically continues it.
1309 We clear this here rather than when we get the reply
1310 because we'd rather assume it's not stopped when it
1311 actually is, than the reverse. */
1312 inf->stopped = 0;
1313 }
1314 else
1315 /* It's not expecting it. We have to let just the signal thread
1316 run, and wait for it to get into a reasonable state before we
1317 can continue the rest of the process. When we finally resume the
1318 process the signal we request will be the very first thing that
1319 happens. */
1320 {
1321 inf_debug (inf, "sending %s to unstopped process (so resuming signal thread)", NAME);
1322 err =
1323 INF_RESUME_MSGPORT_RPC (inf, msg_sig_post_untraced (msgport,
1324 host_sig, 0, refport));
1325 }
c906108c
SS
1326
1327 if (err == EIEIO)
1328 /* Can't do too much... */
1329 warning ("Can't deliver signal %s: No signal thread.", NAME);
1330 else if (err)
1331 warning ("Delivering signal %s: %s", NAME, strerror (err));
1332
1333#undef NAME
1334}
1335\f
cce74817
JM
1336/* Continue INF without delivering a signal. This is meant to be used
1337 when INF does not have a message port. */
1338void
1339inf_continue (struct inf *inf)
1340{
1341 process_t proc;
1342 error_t err = proc_pid2proc (proc_server, inf->pid, &proc);
1343
c5aa993b 1344 if (!err)
cce74817
JM
1345 {
1346 inf_debug (inf, "continuing process");
1347
1348 err = proc_mark_cont (proc);
c5aa993b 1349 if (!err)
cce74817
JM
1350 {
1351 struct proc *thread;
1352
1353 for (thread = inf->threads; thread; thread = thread->next)
1354 thread_resume (thread->port);
c5aa993b 1355
cce74817
JM
1356 inf->stopped = 0;
1357 }
1358 }
1359
1360 if (err)
1361 warning ("Can't continue process: %s", strerror (err));
1362}
1363\f
c906108c
SS
1364/* The inferior used for all gdb target ops. */
1365struct inf *current_inferior = 0;
1366
1367/* The inferior being waited for by gnu_wait. Since GDB is decidely not
1368 multi-threaded, we don't bother to lock this. */
1369struct inf *waiting_inf;
1370
1371/* Wait for something to happen in the inferior, returning what in STATUS. */
1372static int
1373gnu_wait (int tid, struct target_waitstatus *status)
1374{
c5aa993b
JM
1375 struct msg
1376 {
1377 mach_msg_header_t hdr;
1378 mach_msg_type_t type;
1379 int data[8000];
1380 }
1381 msg;
c906108c
SS
1382 error_t err;
1383 struct proc *thread;
1384 struct inf *inf = current_inferior;
1385
1386 assert (inf->task);
1387
1388 if (!inf->threads && !inf->pending_execs)
1389 /* No threads! Assume that maybe some outside agency is frobbing our
1390 task, and really look for new threads. If we can't find any, just tell
1391 the user to try again later. */
1392 {
1393 inf_validate_procs (inf);
1394 if (!inf->threads && !inf->task->dead)
1395 error ("There are no threads; try again later.");
1396 }
1397
1398 waiting_inf = inf;
1399
1400 inf_debug (inf, "waiting for: %d", tid);
1401
c5aa993b 1402rewait:
c906108c
SS
1403 if (proc_wait_pid != inf->pid && !inf->no_wait)
1404 /* Always get information on events from the proc server. */
1405 {
1406 inf_debug (inf, "requesting wait on pid %d", inf->pid);
1407
1408 if (proc_wait_pid)
1409 /* The proc server is single-threaded, and only allows a single
1410 outstanding wait request, so we have to cancel the previous one. */
1411 {
1412 inf_debug (inf, "cancelling previous wait on pid %d", proc_wait_pid);
1413 interrupt_operation (proc_server, 0);
1414 }
1415
1416 err =
1417 proc_wait_request (proc_server, inf->event_port, inf->pid, WUNTRACED);
1418 if (err)
1419 warning ("wait request failed: %s", strerror (err));
1420 else
1421 {
1422 inf_debug (inf, "waits pending: %d", proc_waits_pending);
1423 proc_wait_pid = inf->pid;
1424 /* Even if proc_waits_pending was > 0 before, we still won't get
1425 any other replies, because it was either from a different INF,
1426 or a different process attached to INF -- and the event port,
c5aa993b 1427 which is the wait reply port, changes when you switch processes. */
c906108c
SS
1428 proc_waits_pending = 1;
1429 }
1430 }
1431
1432 inf_clear_wait (inf);
1433
1434 /* What can happen? (1) Dead name notification; (2) Exceptions arrive;
1435 (3) wait reply from the proc server. */
1436
1437 inf_debug (inf, "waiting for an event...");
1438 err = mach_msg (&msg.hdr, MACH_RCV_MSG | MACH_RCV_INTERRUPT,
1439 0, sizeof (struct msg), inf->event_port,
1440 MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
1441
1442 /* Re-suspend the task. */
1443 inf_suspend (inf);
1444
1445 if (!inf->task && inf->pending_execs)
1446 /* When doing an exec, it's possible that the old task wasn't reused
1447 (e.g., setuid execs). So if the task seems to have disappeared,
1448 attempt to refetch it, as the pid should still be the same. */
1449 inf_set_pid (inf, inf->pid);
1450
1451 if (err == EMACH_RCV_INTERRUPTED)
1452 inf_debug (inf, "interrupted");
1453 else if (err)
1454 error ("Couldn't wait for an event: %s", strerror (err));
1455 else
1456 {
c5aa993b
JM
1457 struct
1458 {
1459 mach_msg_header_t hdr;
1460 mach_msg_type_t err_type;
1461 kern_return_t err;
1462 char noise[200];
1463 }
1464 reply;
c906108c
SS
1465
1466 inf_debug (inf, "event: msgid = %d", msg.hdr.msgh_id);
1467
1468 /* Handle what we got. */
c5aa993b
JM
1469 if (!notify_server (&msg.hdr, &reply.hdr)
1470 && !exc_server (&msg.hdr, &reply.hdr)
1471 && !process_reply_server (&msg.hdr, &reply.hdr)
1472 && !msg_reply_server (&msg.hdr, &reply.hdr))
c906108c
SS
1473 /* Whatever it is, it's something strange. */
1474 error ("Got a strange event, msg id = %d.", msg.hdr.msgh_id);
1475
1476 if (reply.err)
1477 error ("Handling event, msgid = %d: %s",
1478 msg.hdr.msgh_id, strerror (reply.err));
1479 }
1480
1481 if (inf->pending_execs)
1482 /* We're waiting for the inferior to finish execing. */
1483 {
1484 struct inf_wait *w = &inf->wait;
1485 enum target_waitkind kind = w->status.kind;
1486
1487 if (kind == TARGET_WAITKIND_SPURIOUS)
1488 /* Since gdb is actually counting the number of times the inferior
1489 stops, expecting one stop per exec, we only return major events
1490 while execing. */
1491 {
1492 w->suppress = 1;
1493 inf_debug (inf, "pending_execs = %d, ignoring minor event",
1494 inf->pending_execs);
1495 }
1496 else if (kind == TARGET_WAITKIND_STOPPED
1497 && w->status.value.sig == TARGET_SIGNAL_TRAP)
1498 /* Ah hah! A SIGTRAP from the inferior while starting up probably
1499 means we've succesfully completed an exec! */
1500 {
1501 if (--inf->pending_execs == 0)
1502 /* We're done! */
1503 {
c5aa993b 1504#if 0 /* do we need this? */
c906108c 1505 prune_threads (1); /* Get rid of the old shell threads */
c5aa993b 1506 renumber_threads (0); /* Give our threads reasonable names. */
c906108c
SS
1507#endif
1508 }
1509 inf_debug (inf, "pending exec completed, pending_execs => %d",
1510 inf->pending_execs);
1511 }
1512 else if (kind == TARGET_WAITKIND_STOPPED)
1513 /* It's possible that this signal is because of a crashed process
1514 being handled by the hurd crash server; in this case, the process
1515 will have an extra task suspend, which we need to know about.
1516 Since the code in inf_resume that normally checks for this is
1517 disabled while INF->pending_execs, we do the check here instead. */
1518 inf_validate_task_sc (inf);
1519 }
1520
1521 if (inf->wait.suppress)
1522 /* Some totally spurious event happened that we don't consider
1523 worth returning to gdb. Just keep waiting. */
1524 {
1525 inf_debug (inf, "suppressing return, rewaiting...");
1526 inf_resume (inf);
1527 goto rewait;
1528 }
1529
1530 /* Pass back out our results. */
1531 bcopy (&inf->wait.status, status, sizeof (*status));
1532
1533 thread = inf->wait.thread;
1534 if (thread)
1535 tid = thread->tid;
1536 else
1537 thread = inf_tid_to_thread (inf, tid);
1538
1539 if (!thread || thread->port == MACH_PORT_NULL)
1540 /* TID is dead; try and find a new thread. */
1541 if (inf_update_procs (inf) && inf->threads)
1542 tid = inf->threads->tid; /* The first available thread. */
1543 else
c5aa993b 1544 tid = inferior_pid; /* let wait_for_inferior handle exit case */
c906108c
SS
1545
1546 if (thread && tid >= 0 && status->kind != TARGET_WAITKIND_SPURIOUS
1547 && inf->pause_sc == 0 && thread->pause_sc == 0)
1548 /* If something actually happened to THREAD, make sure we suspend it. */
1549 {
1550 thread->sc = 1;
1551 inf_update_suspends (inf);
c5aa993b 1552 }
c906108c
SS
1553
1554 inf_debug (inf, "returning tid = %d, status = %s (%d)", tid,
1555 status->kind == TARGET_WAITKIND_EXITED ? "EXITED"
1556 : status->kind == TARGET_WAITKIND_STOPPED ? "STOPPED"
1557 : status->kind == TARGET_WAITKIND_SIGNALLED ? "SIGNALLED"
1558 : status->kind == TARGET_WAITKIND_LOADED ? "LOADED"
1559 : status->kind == TARGET_WAITKIND_SPURIOUS ? "SPURIOUS"
1560 : "?",
1561 status->value.integer);
1562
1563 return tid;
1564}
1565\f
1566/* The rpc handler called by exc_server. */
1567error_t
1568S_exception_raise_request (mach_port_t port, mach_port_t reply_port,
1569 thread_t thread_port, task_t task_port,
1570 int exception, int code, int subcode)
1571{
1572 struct inf *inf = waiting_inf;
1573 struct proc *thread = inf_port_to_thread (inf, thread_port);
1574
1575 inf_debug (waiting_inf,
1576 "thread = %d, task = %d, exc = %d, code = %d, subcode = %d",
1577 thread_port, task_port, exception, code);
1578
1579 if (!thread)
1580 /* We don't know about thread? */
1581 {
1582 inf_update_procs (inf);
1583 thread = inf_port_to_thread (inf, thread_port);
1584 if (!thread)
1585 /* Give up, the generating thread is gone. */
1586 return 0;
1587 }
1588
1589 mach_port_deallocate (mach_task_self (), thread_port);
1590 mach_port_deallocate (mach_task_self (), task_port);
1591
c5aa993b 1592 if (!thread->aborted)
c906108c
SS
1593 /* THREAD hasn't been aborted since this exception happened (abortion
1594 clears any exception state), so it must be real. */
1595 {
1596 /* Store away the details; this will destroy any previous info. */
1597 inf->wait.thread = thread;
1598
1599 inf->wait.status.kind = TARGET_WAITKIND_STOPPED;
1600
1601 if (exception == EXC_BREAKPOINT)
1602 /* GDB likes to get SIGTRAP for breakpoints. */
1603 {
1604 inf->wait.status.value.sig = TARGET_SIGNAL_TRAP;
1605 mach_port_deallocate (mach_task_self (), reply_port);
1606 }
1607 else
1608 /* Record the exception so that we can forward it later. */
1609 {
1610 if (thread->exc_port == port)
1611 {
1612 inf_debug (waiting_inf, "Handler is thread exeption port <%d>",
1613 thread->saved_exc_port);
1614 inf->wait.exc.handler = thread->saved_exc_port;
1615 }
1616 else
1617 {
1618 inf_debug (waiting_inf, "Handler is task exeption port <%d>",
1619 inf->task->saved_exc_port);
1620 inf->wait.exc.handler = inf->task->saved_exc_port;
1621 assert (inf->task->exc_port == port);
1622 }
1623 if (inf->wait.exc.handler != MACH_PORT_NULL)
1624 /* Add a reference to the exception handler. */
1625 mach_port_mod_refs (mach_task_self (),
1626 inf->wait.exc.handler, MACH_PORT_RIGHT_SEND,
1627 1);
1628
1629 inf->wait.exc.exception = exception;
1630 inf->wait.exc.code = code;
1631 inf->wait.exc.subcode = subcode;
1632 inf->wait.exc.reply = reply_port;
1633
1634 /* Exceptions are encoded in the signal space by putting them after
1635 _NSIG; this assumes they're positive (and not extremely large)! */
1636 inf->wait.status.value.sig =
1637 target_signal_from_host (_NSIG + exception);
1638 }
1639 }
1640 else
1641 /* A supppressed exception, which ignore. */
1642 {
1643 inf->wait.suppress = 1;
1644 mach_port_deallocate (mach_task_self (), reply_port);
1645 }
1646
1647 return 0;
1648}
1649\f
1650/* Fill in INF's wait field after a task has died without giving us more
1651 detailed information. */
1652void
1653inf_task_died_status (struct inf *inf)
1654{
1655 warning ("Pid %d died with unknown exit status, using SIGKILL.", inf->pid);
1656 inf->wait.status.kind = TARGET_WAITKIND_SIGNALLED;
1657 inf->wait.status.value.sig = TARGET_SIGNAL_KILL;
1658}
1659
1660/* Notify server routines. The only real one is dead name notification. */
1661error_t
1662do_mach_notify_dead_name (mach_port_t notify, mach_port_t dead_port)
1663{
1664 struct inf *inf = waiting_inf;
1665
1666 inf_debug (waiting_inf, "port = %d", dead_port);
1667
1668 if (inf->task && inf->task->port == dead_port)
1669 {
1670 proc_debug (inf->task, "is dead");
1671 inf->task->port = MACH_PORT_NULL;
1672 if (proc_wait_pid == inf->pid)
1673 /* We have a wait outstanding on the process, which will return more
1674 detailed information, so delay until we get that. */
1675 inf->wait.suppress = 1;
1676 else
1677 /* We never waited for the process (maybe it wasn't a child), so just
1678 pretend it got a SIGKILL. */
1679 inf_task_died_status (inf);
1680 }
1681 else
1682 {
1683 struct proc *thread = inf_port_to_thread (inf, dead_port);
1684 if (thread)
1685 {
1686 proc_debug (thread, "is dead");
1687 thread->port = MACH_PORT_NULL;
1688 }
f90b2b1d
JK
1689
1690 if (inf->task->dead)
1691 /* Since the task is dead, its threads are dying with it. */
1692 inf->wait.suppress = 1;
c906108c
SS
1693 }
1694
1695 mach_port_deallocate (mach_task_self (), dead_port);
c5aa993b 1696 inf->threads_up_to_date = 0; /* Just in case */
c906108c
SS
1697
1698 return 0;
1699}
1700\f
1701static error_t
1702ill_rpc (char *fun)
1703{
1704 warning ("illegal rpc: %s", fun);
1705 return 0;
1706}
1707
1708error_t
1709do_mach_notify_no_senders (mach_port_t notify, mach_port_mscount_t count)
1710{
1711 return ill_rpc (__FUNCTION__);
1712}
1713
1714error_t
1715do_mach_notify_port_deleted (mach_port_t notify, mach_port_t name)
1716{
1717 return ill_rpc (__FUNCTION__);
1718}
1719
1720error_t
1721do_mach_notify_msg_accepted (mach_port_t notify, mach_port_t name)
1722{
1723 return ill_rpc (__FUNCTION__);
1724}
1725
1726error_t
1727do_mach_notify_port_destroyed (mach_port_t notify, mach_port_t name)
1728{
1729 return ill_rpc (__FUNCTION__);
1730}
1731
1732error_t
1733do_mach_notify_send_once (mach_port_t notify)
1734{
1735 return ill_rpc (__FUNCTION__);
1736}
1737\f
1738/* Process_reply server routines. We only use process_wait_reply. */
1739
1740error_t
1741S_proc_wait_reply (mach_port_t reply, error_t err,
1742 int status, int sigcode, rusage_t rusage, pid_t pid)
1743{
1744 struct inf *inf = waiting_inf;
1745
1746 inf_debug (inf, "err = %s, pid = %d, status = 0x%x, sigcode = %d",
1747 err ? strerror (err) : "0", pid, status, sigcode);
1748
1749 if (err && proc_wait_pid && (!inf->task || !inf->task->port))
1750 /* Ack. The task has died, but the task-died notification code didn't
1751 tell anyone because it thought a more detailed reply from the
1752 procserver was forthcoming. However, we now learn that won't
1753 happen... So we have to act like the task just died, and this time,
1754 tell the world. */
1755 inf_task_died_status (inf);
1756
1757 if (--proc_waits_pending == 0)
1758 /* PROC_WAIT_PID represents the most recent wait. We will always get
1759 replies in order because the proc server is single threaded. */
1760 proc_wait_pid = 0;
1761
1762 inf_debug (inf, "waits pending now: %d", proc_waits_pending);
1763
1764 if (err)
1765 {
1766 if (err != EINTR)
1767 {
1768 warning ("Can't wait for pid %d: %s", inf->pid, strerror (err));
1769 inf->no_wait = 1;
1770
1771 /* Since we can't see the inferior's signals, don't trap them. */
1772 inf_set_traced (inf, 0);
1773 }
1774 }
1775 else if (pid == inf->pid)
1776 {
1777 store_waitstatus (&inf->wait.status, status);
1778 if (inf->wait.status.kind == TARGET_WAITKIND_STOPPED)
1779 /* The process has sent us a signal, and stopped itself in a sane
1780 state pending our actions. */
1781 {
1782 inf_debug (inf, "process has stopped itself");
1783 inf->stopped = 1;
1784 }
1785 }
1786 else
1787 inf->wait.suppress = 1; /* Something odd happened. Ignore. */
1788
1789 return 0;
1790}
1791
1792error_t
1793S_proc_setmsgport_reply (mach_port_t reply, error_t err,
1794 mach_port_t old_msg_port)
1795{
1796 return ill_rpc (__FUNCTION__);
1797}
1798
1799error_t
1800S_proc_getmsgport_reply (mach_port_t reply, error_t err, mach_port_t msg_port)
1801{
1802 return ill_rpc (__FUNCTION__);
1803}
1804\f
1805/* Msg_reply server routines. We only use msg_sig_post_untraced_reply. */
1806
1807error_t
1808S_msg_sig_post_untraced_reply (mach_port_t reply, error_t err)
1809{
1810 struct inf *inf = waiting_inf;
1811
1812 if (err == EBUSY)
1813 /* EBUSY is what we get when the crash server has grabbed control of the
1814 process and doesn't like what signal we tried to send it. Just act
1815 like the process stopped (using a signal of 0 should mean that the
1816 *next* time the user continues, it will pass signal 0, which the crash
1817 server should like). */
1818 {
1819 inf->wait.status.kind = TARGET_WAITKIND_STOPPED;
1820 inf->wait.status.value.sig = TARGET_SIGNAL_0;
1821 }
1822 else if (err)
1823 warning ("Signal delivery failed: %s", strerror (err));
1824
1825 if (err)
1826 /* We only get this reply when we've posted a signal to a process which we
1827 thought was stopped, and which we expected to continue after the signal.
1828 Given that the signal has failed for some reason, it's reasonable to
1829 assume it's still stopped. */
1830 inf->stopped = 1;
1831 else
1832 inf->wait.suppress = 1;
1833
1834 return 0;
1835}
1836
1837error_t
1838S_msg_sig_post_reply (mach_port_t reply, error_t err)
1839{
1840 return ill_rpc (__FUNCTION__);
1841}
1842\f
1843/* Returns the number of messages queued for the receive right PORT. */
1844static mach_port_msgcount_t
1845port_msgs_queued (mach_port_t port)
1846{
1847 struct mach_port_status status;
1848 error_t err =
c5aa993b 1849 mach_port_get_receive_status (mach_task_self (), port, &status);
c906108c
SS
1850
1851 if (err)
1852 return 0;
1853 else
1854 return status.mps_msgcount;
1855}
1856\f
1857/* Resume execution of the inferior process.
1858
1859 If STEP is nonzero, single-step it.
1860 If SIGNAL is nonzero, give it that signal.
1861
1862 TID STEP:
1863 -1 true Single step the current thread allowing other threads to run.
1864 -1 false Continue the current thread allowing other threads to run.
1865 X true Single step the given thread, don't allow any others to run.
1866 X false Continue the given thread, do not allow any others to run.
1867 (Where X, of course, is anything except -1)
1868
1869 Note that a resume may not `take' if there are pending exceptions/&c
1870 still unprocessed from the last resume we did (any given resume may result
1871 in multiple events returned by wait).
c5aa993b 1872 */
c906108c
SS
1873static void
1874gnu_resume (int tid, int step, enum target_signal sig)
1875{
1876 struct proc *step_thread = 0;
1877 struct inf *inf = current_inferior;
1878
1879 inf_debug (inf, "tid = %d, step = %d, sig = %d", tid, step, sig);
1880
cce74817 1881 inf_validate_procinfo (inf);
c5aa993b 1882
c906108c 1883 if (sig != TARGET_SIGNAL_0 || inf->stopped)
cce74817
JM
1884 {
1885 if (sig == TARGET_SIGNAL_0 && inf->nomsg)
1886 inf_continue (inf);
1887 else
1888 inf_signal (inf, sig);
1889 }
c906108c
SS
1890 else if (inf->wait.exc.reply != MACH_PORT_NULL)
1891 /* We received an exception to which we have chosen not to forward, so
1892 abort the faulting thread, which will perhaps retake it. */
1893 {
1894 proc_abort (inf->wait.thread, 1);
1895 warning ("Aborting %s with unforwarded exception %s.",
1896 proc_string (inf->wait.thread),
1897 target_signal_to_name (inf->wait.status.value.sig));
1898 }
1899
1900 if (port_msgs_queued (inf->event_port))
1901 /* If there are still messages in our event queue, don't bother resuming
1902 the process, as we're just going to stop it right away anyway. */
1903 return;
1904
1905 inf_update_procs (inf);
1906
1907 if (tid < 0)
1908 /* Allow all threads to run, except perhaps single-stepping one. */
1909 {
1910 inf_debug (inf, "running all threads; tid = %d", inferior_pid);
1911 tid = inferior_pid; /* What to step. */
1912 inf_set_threads_resume_sc (inf, 0, 1);
1913 }
1914 else
1915 /* Just allow a single thread to run. */
1916 {
1917 struct proc *thread = inf_tid_to_thread (inf, tid);
c5aa993b 1918 if (!thread)
c906108c
SS
1919 error ("Can't run single thread id %d: no such thread!");
1920 inf_debug (inf, "running one thread: %d/%d", inf->pid, thread->tid);
1921 inf_set_threads_resume_sc (inf, thread, 0);
1922 }
1923
1924 if (step)
1925 {
1926 step_thread = inf_tid_to_thread (inf, tid);
c5aa993b 1927 if (!step_thread)
c906108c
SS
1928 warning ("Can't step thread id %d: no such thread.", tid);
1929 else
1930 inf_debug (inf, "stepping thread: %d/%d", inf->pid, step_thread->tid);
1931 }
1932 if (step_thread != inf->step_thread)
1933 inf_set_step_thread (inf, step_thread);
1934
1935 inf_debug (inf, "here we go...");
1936 inf_resume (inf);
1937}
1938\f
1939static void
1940gnu_kill_inferior ()
1941{
1942 struct proc *task = current_inferior->task;
1943 if (task)
1944 {
1945 proc_debug (task, "terminating...");
1946 task_terminate (task->port);
1947 inf_set_pid (current_inferior, -1);
1948 }
1949 target_mourn_inferior ();
1950}
1951
1952/* Clean up after the inferior dies. */
1953
1954static void
1955gnu_mourn_inferior ()
1956{
1957 inf_debug (current_inferior, "rip");
1958 inf_detach (current_inferior);
1959 unpush_target (&gnu_ops);
1960 generic_mourn_inferior ();
1961}
1962\f
1963/* Fork an inferior process, and start debugging it. */
1964
1965/* Set INFERIOR_PID to the first thread available in the child, if any. */
1966static int
1967inf_pick_first_thread ()
1968{
1969 if (current_inferior->task && current_inferior->threads)
1970 /* The first thread. */
1971 return current_inferior->threads->tid;
1972 else
1973 /* What may be the next thread. */
1974 return next_thread_id;
1975}
1976
1977static struct inf *
1978cur_inf ()
1979{
c5aa993b 1980 if (!current_inferior)
c906108c
SS
1981 current_inferior = make_inf ();
1982 return current_inferior;
1983}
1984
1985static void
1986gnu_create_inferior (exec_file, allargs, env)
1987 char *exec_file;
1988 char *allargs;
1989 char **env;
1990{
1991 struct inf *inf = cur_inf ();
1992
1993 void trace_me ()
c5aa993b
JM
1994 {
1995 /* We're in the child; make this process stop as soon as it execs. */
1996 inf_debug (inf, "tracing self");
1997 if (ptrace (PTRACE_TRACEME) != 0)
1998 error ("ptrace (PTRACE_TRACEME) failed!");
1999 }
7a292a7a 2000 void attach_to_child (int pid)
c5aa993b
JM
2001 {
2002 /* Attach to the now stopped child, which is actually a shell... */
2003 inf_debug (inf, "attaching to child: %d", pid);
c906108c 2004
c5aa993b 2005 inf_attach (inf, pid);
c906108c 2006
c5aa993b
JM
2007 attach_flag = 0;
2008 push_target (&gnu_ops);
c906108c 2009
c5aa993b
JM
2010 inf->pending_execs = 2;
2011 inf->nomsg = 1;
2012 inf->traced = 1;
c906108c 2013
c5aa993b
JM
2014 /* Now let the child run again, knowing that it will stop immediately
2015 because of the ptrace. */
2016 inf_resume (inf);
2017 inferior_pid = inf_pick_first_thread ();
c906108c 2018
c5aa993b
JM
2019 startup_inferior (inf->pending_execs);
2020 }
c906108c
SS
2021
2022 inf_debug (inf, "creating inferior");
2023
7a292a7a
SS
2024 fork_inferior (exec_file, allargs, env, trace_me, attach_to_child,
2025 NULL, NULL);
c906108c 2026
cce74817 2027 inf_validate_procinfo (inf);
c906108c
SS
2028 inf_update_signal_thread (inf);
2029 inf_set_traced (inf, inf->want_signals);
2030
2031 /* Execing the process will have trashed our exception ports; steal them
2032 back (or make sure they're restored if the user wants that). */
2033 if (inf->want_exceptions)
2034 inf_steal_exc_ports (inf);
2035 else
2036 inf_restore_exc_ports (inf);
2037
2038 /* Here we go! */
2acceee2 2039 proceed ((CORE_ADDR) -1, 0, 0);
c906108c
SS
2040}
2041
2042/* Mark our target-struct as eligible for stray "run" and "attach"
2043 commands. */
2044static int
2045gnu_can_run ()
2046{
2047 return 1;
2048}
2049\f
2050#ifdef ATTACH_DETACH
2051
2052/* Attach to process PID, then initialize for debugging it
2053 and wait for the trace-trap that results from attaching. */
2054static void
2055gnu_attach (args, from_tty)
2056 char *args;
2057 int from_tty;
2058{
2059 int pid;
2060 char *exec_file;
2061 struct inf *inf = cur_inf ();
2062
2063 if (!args)
2064 error_no_arg ("PID to attach");
2065
2066 pid = atoi (args);
2067
c5aa993b 2068 if (pid == getpid ()) /* Trying to masturbate? */
c906108c
SS
2069 error ("I refuse to debug myself!");
2070
2071 if (from_tty)
2072 {
2073 exec_file = (char *) get_exec_file (0);
2074
2075 if (exec_file)
2076 printf_unfiltered ("Attaching to program `%s', pid %d\n",
2077 exec_file, pid);
2078 else
2079 printf_unfiltered ("Attaching to pid %d\n", pid);
2080
2081 gdb_flush (gdb_stdout);
2082 }
2083
2084 inf_debug (inf, "attaching to pid: %d", pid);
2085
2086 inf_attach (inf, pid);
2087 inf_update_procs (inf);
2088
2089 inferior_pid = inf_pick_first_thread ();
2090
2091 attach_flag = 1;
2092 push_target (&gnu_ops);
2093
b83266a0
SS
2094 /* We have to initialize the terminal settings now, since the code
2095 below might try to restore them. */
2096 target_terminal_init ();
c5aa993b 2097
c906108c
SS
2098 /* If the process was stopped before we attached, make it continue the next
2099 time the user does a continue. */
cce74817
JM
2100 inf_validate_procinfo (inf);
2101
2102 inf_update_signal_thread (inf);
2103 inf_set_traced (inf, inf->want_signals);
c906108c 2104
c5aa993b 2105#if 0 /* Do we need this? */
c906108c
SS
2106 renumber_threads (0); /* Give our threads reasonable names. */
2107#endif
2108}
2109\f
2110/* Take a program previously attached to and detaches it.
2111 The program resumes execution and will no longer stop
2112 on signals, etc. We'd better not have left any breakpoints
2113 in the program or it'll die when it hits one. For this
2114 to work, it may be necessary for the process to have been
2115 previously attached. It *might* work if the program was
2116 started via fork. */
2117static void
2118gnu_detach (args, from_tty)
2119 char *args;
2120 int from_tty;
2121{
2122 if (from_tty)
2123 {
2124 char *exec_file = get_exec_file (0);
2125 if (exec_file)
2126 printf_unfiltered ("Detaching from program `%s' pid %d\n",
2127 exec_file, current_inferior->pid);
2128 else
2129 printf_unfiltered ("Detaching from pid %d\n", current_inferior->pid);
2130 gdb_flush (gdb_stdout);
2131 }
c5aa993b 2132
c906108c
SS
2133 inf_detach (current_inferior);
2134
2135 inferior_pid = 0;
2136
c5aa993b 2137 unpush_target (&gnu_ops); /* Pop out of handling an inferior */
c906108c
SS
2138}
2139#endif /* ATTACH_DETACH */
2140
2141static void
2142gnu_terminal_init_inferior ()
2143{
2144 assert (current_inferior);
2145 terminal_init_inferior_with_pgrp (current_inferior->pid);
2146}
2147
2148/* Get ready to modify the registers array. On machines which store
2149 individual registers, this doesn't need to do anything. On machines
2150 which store all the registers in one fell swoop, this makes sure
2151 that registers contains all the registers from the program being
2152 debugged. */
2153
2154static void
2155gnu_prepare_to_store ()
2156{
2157#ifdef CHILD_PREPARE_TO_STORE
2158 CHILD_PREPARE_TO_STORE ();
2159#endif
2160}
2161
2162static void
2163gnu_open (arg, from_tty)
2164 char *arg;
2165 int from_tty;
2166{
2167 error ("Use the \"run\" command to start a Unix child process.");
2168}
2169
2170static void
2171gnu_stop ()
2172{
2173 error ("to_stop target function not implemented");
2174}
2175
7a292a7a 2176static char *
c906108c
SS
2177gnu_pid_to_exec_file ()
2178{
2179 error ("to_pid_to_exec_file target function not implemented");
7a292a7a 2180 return NULL;
c906108c 2181}
c5aa993b 2182
c906108c
SS
2183
2184static int
2185gnu_thread_alive (int tid)
2186{
2187 inf_update_procs (current_inferior);
2188 return !!inf_tid_to_thread (current_inferior, tid);
2189}
2190\f
2191/*
2192 * Read inferior task's LEN bytes from ADDR and copy it to MYADDR
2193 * in gdb's address space.
2194 *
2195 * Return 0 on failure; number of bytes read otherwise.
2196 */
2197int
2198gnu_read_inferior (task, addr, myaddr, length)
2199 task_t task;
2200 CORE_ADDR addr;
2201 char *myaddr;
2202 int length;
2203{
2204 error_t err;
2205 vm_address_t low_address = (vm_address_t) trunc_page (addr);
2206 vm_size_t aligned_length =
c5aa993b
JM
2207 (vm_size_t) round_page (addr + length) - low_address;
2208 pointer_t copied;
2209 int copy_count;
c906108c
SS
2210
2211 /* Get memory from inferior with page aligned addresses */
2212 err = vm_read (task, low_address, aligned_length, &copied, &copy_count);
2213 if (err)
2214 return 0;
2215
c5aa993b 2216 err = hurd_safe_copyin (myaddr, (void *) addr - low_address + copied, length);
c906108c
SS
2217 if (err)
2218 {
2219 warning ("Read from inferior faulted: %s", strerror (err));
2220 length = 0;
2221 }
2222
2223 err = vm_deallocate (mach_task_self (), copied, copy_count);
2224 if (err)
2225 warning ("gnu_read_inferior vm_deallocate failed: %s", strerror (err));
2226
2227 return length;
2228}
2229
2230#define CHK_GOTO_OUT(str,ret) \
2231 do if (ret != KERN_SUCCESS) { errstr = #str; goto out; } while(0)
2232
c5aa993b
JM
2233struct vm_region_list
2234{
c906108c 2235 struct vm_region_list *next;
c5aa993b
JM
2236 vm_prot_t protection;
2237 vm_address_t start;
2238 vm_size_t length;
c906108c
SS
2239};
2240
c5aa993b 2241struct obstack region_obstack;
c906108c
SS
2242
2243/*
2244 * Write gdb's LEN bytes from MYADDR and copy it to ADDR
2245 * in inferior task's address space.
2246 */
2247int
2248gnu_write_inferior (task, addr, myaddr, length)
2249 task_t task;
2250 CORE_ADDR addr;
2251 char *myaddr;
2252 int length;
2253{
2254 error_t err = 0;
c5aa993b
JM
2255 vm_address_t low_address = (vm_address_t) trunc_page (addr);
2256 vm_size_t aligned_length =
2257 (vm_size_t) round_page (addr + length) - low_address;
2258 pointer_t copied;
2259 int copy_count;
2260 int deallocate = 0;
c906108c 2261
c5aa993b 2262 char *errstr = "Bug in gnu_write_inferior";
c906108c
SS
2263
2264 struct vm_region_list *region_element;
c5aa993b 2265 struct vm_region_list *region_head = (struct vm_region_list *) NULL;
c906108c
SS
2266
2267 /* Get memory from inferior with page aligned addresses */
2268 err = vm_read (task,
2269 low_address,
2270 aligned_length,
2271 &copied,
2272 &copy_count);
2273 CHK_GOTO_OUT ("gnu_write_inferior vm_read failed", err);
2274
2275 deallocate++;
2276
c5aa993b 2277 err = hurd_safe_copyout ((void *) addr - low_address + copied, myaddr, length);
c906108c
SS
2278 CHK_GOTO_OUT ("Write to inferior faulted", err);
2279
2280 obstack_init (&region_obstack);
2281
2282 /* Do writes atomically.
2283 * First check for holes and unwritable memory.
2284 */
2285 {
c5aa993b
JM
2286 vm_size_t remaining_length = aligned_length;
2287 vm_address_t region_address = low_address;
c906108c
SS
2288
2289 struct vm_region_list *scan;
2290
c5aa993b 2291 while (region_address < low_address + aligned_length)
c906108c
SS
2292 {
2293 vm_prot_t protection;
2294 vm_prot_t max_protection;
2295 vm_inherit_t inheritance;
2296 boolean_t shared;
2297 mach_port_t object_name;
2298 vm_offset_t offset;
c5aa993b
JM
2299 vm_size_t region_length = remaining_length;
2300 vm_address_t old_address = region_address;
2301
c906108c
SS
2302 err = vm_region (task,
2303 &region_address,
2304 &region_length,
2305 &protection,
2306 &max_protection,
2307 &inheritance,
2308 &shared,
2309 &object_name,
2310 &offset);
2311 CHK_GOTO_OUT ("vm_region failed", err);
2312
2313 /* Check for holes in memory */
2314 if (old_address != region_address)
2315 {
2316 warning ("No memory at 0x%x. Nothing written",
2317 old_address);
2318 err = KERN_SUCCESS;
2319 length = 0;
2320 goto out;
2321 }
2322
2323 if (!(max_protection & VM_PROT_WRITE))
2324 {
2325 warning ("Memory at address 0x%x is unwritable. Nothing written",
2326 old_address);
2327 err = KERN_SUCCESS;
2328 length = 0;
2329 goto out;
2330 }
2331
2332 /* Chain the regions for later use */
c5aa993b 2333 region_element =
c906108c 2334 (struct vm_region_list *)
c5aa993b
JM
2335 obstack_alloc (&region_obstack, sizeof (struct vm_region_list));
2336
c906108c 2337 region_element->protection = protection;
c5aa993b
JM
2338 region_element->start = region_address;
2339 region_element->length = region_length;
c906108c
SS
2340
2341 /* Chain the regions along with protections */
2342 region_element->next = region_head;
c5aa993b
JM
2343 region_head = region_element;
2344
c906108c
SS
2345 region_address += region_length;
2346 remaining_length = remaining_length - region_length;
2347 }
2348
2349 /* If things fail after this, we give up.
2350 * Somebody is messing up inferior_task's mappings.
2351 */
c5aa993b 2352
c906108c
SS
2353 /* Enable writes to the chained vm regions */
2354 for (scan = region_head; scan; scan = scan->next)
2355 {
2356 boolean_t protection_changed = FALSE;
c5aa993b 2357
c906108c
SS
2358 if (!(scan->protection & VM_PROT_WRITE))
2359 {
2360 err = vm_protect (task,
2361 scan->start,
2362 scan->length,
2363 FALSE,
2364 scan->protection | VM_PROT_WRITE);
2365 CHK_GOTO_OUT ("vm_protect: enable write failed", err);
2366 }
2367 }
2368
2369 err = vm_write (task,
2370 low_address,
2371 copied,
2372 aligned_length);
2373 CHK_GOTO_OUT ("vm_write failed", err);
c5aa993b 2374
c906108c
SS
2375 /* Set up the original region protections, if they were changed */
2376 for (scan = region_head; scan; scan = scan->next)
2377 {
2378 boolean_t protection_changed = FALSE;
c5aa993b 2379
c906108c
SS
2380 if (!(scan->protection & VM_PROT_WRITE))
2381 {
2382 err = vm_protect (task,
2383 scan->start,
2384 scan->length,
2385 FALSE,
2386 scan->protection);
2387 CHK_GOTO_OUT ("vm_protect: enable write failed", err);
2388 }
2389 }
2390 }
2391
c5aa993b 2392out:
c906108c
SS
2393 if (deallocate)
2394 {
2395 obstack_free (&region_obstack, 0);
c5aa993b 2396
c906108c
SS
2397 (void) vm_deallocate (mach_task_self (),
2398 copied,
2399 copy_count);
2400 }
2401
2402 if (err != KERN_SUCCESS)
2403 {
2404 warning ("%s: %s", errstr, mach_error_string (err));
2405 return 0;
2406 }
2407
2408 return length;
2409}
2410\f
2411/* Return 0 on failure, number of bytes handled otherwise. */
2412static int
2413gnu_xfer_memory (memaddr, myaddr, len, write, target)
2414 CORE_ADDR memaddr;
2415 char *myaddr;
2416 int len;
2417 int write;
2418 struct target_ops *target; /* IGNORED */
2419{
2420 int result;
2421 task_t task =
c5aa993b
JM
2422 current_inferior
2423 ? (current_inferior->task ? current_inferior->task->port : 0)
2424 : 0;
c906108c
SS
2425
2426 if (task == MACH_PORT_NULL)
2427 return 0;
2428 else
2429 {
2430 inf_debug (current_inferior, "%s %p[%d] %s %p",
2431 write ? "writing" : "reading", memaddr, len,
2432 write ? "<--" : "-->", myaddr);
2433 if (write)
2434 return gnu_write_inferior (task, memaddr, myaddr, len);
2435 else
c5aa993b 2436 return gnu_read_inferior (task, memaddr, myaddr, len);
c906108c
SS
2437 }
2438}
2439\f
ed9a39eb 2440/* Return printable description of proc. */
f90b2b1d 2441char *
ed9a39eb
JM
2442proc_string (struct proc *proc)
2443{
2444 static char tid_str[80];
2445 if (proc_is_task (proc))
2446 sprintf (tid_str, "process %d", proc->inf->pid);
2447 else
2448 sprintf (tid_str, "thread %d.%d",
2449 proc->inf->pid, pid_to_thread_id (proc->tid));
2450 return tid_str;
2451}
2452
2453static char *
2454gnu_pid_to_str (int tid)
2455{
2456 struct inf *inf = current_inferior;
2457 struct proc *thread = inf_tid_to_thread (inf, tid);
2458
2459 if (thread)
2460 return proc_string (thread);
2461 else
2462 {
2463 static char tid_str[80];
2464 sprintf (tid_str, "bogus thread id %d", tid);
2465 return tid_str;
2466 }
2467}
2468\f
c906108c
SS
2469extern void gnu_store_registers (int regno);
2470extern void gnu_fetch_registers (int regno);
2471
c5aa993b 2472struct target_ops gnu_ops;
c906108c
SS
2473
2474static void
c5aa993b
JM
2475init_gnu_ops (void)
2476{
2477 gnu_ops.to_shortname = "GNU"; /* to_shortname */
2478 gnu_ops.to_longname = "GNU Hurd process"; /* to_longname */
2479 gnu_ops.to_doc = "GNU Hurd process"; /* to_doc */
2480 gnu_ops.to_open = gnu_open; /* to_open */
2481 gnu_ops.to_close = 0; /* to_close */
2482 gnu_ops.to_attach = gnu_attach; /* to_attach */
c906108c 2483 gnu_ops.to_post_attach = NULL;
c5aa993b
JM
2484 gnu_ops.to_require_attach = NULL; /* to_require_attach */
2485 gnu_ops.to_detach = gnu_detach; /* to_detach */
2486 gnu_ops.to_require_detach = NULL; /* to_require_detach */
2487 gnu_ops.to_resume = gnu_resume; /* to_resume */
2488 gnu_ops.to_wait = gnu_wait; /* to_wait */
2489 gnu_ops.to_post_wait = NULL; /* to_post_wait */
2490 gnu_ops.to_fetch_registers = gnu_fetch_registers; /* to_fetch_registers */
2491 gnu_ops.to_store_registers = gnu_store_registers; /* to_store_registers */
2492 gnu_ops.to_prepare_to_store = gnu_prepare_to_store; /* to_prepare_to_store */
2493 gnu_ops.to_xfer_memory = gnu_xfer_memory; /* to_xfer_memory */
2494 gnu_ops.to_files_info = 0; /* to_files_info */
2495 gnu_ops.to_insert_breakpoint = memory_insert_breakpoint;
2496 gnu_ops.to_remove_breakpoint = memory_remove_breakpoint;
2497 gnu_ops.to_terminal_init = gnu_terminal_init_inferior;
2498 gnu_ops.to_terminal_inferior = terminal_inferior;
2499 gnu_ops.to_terminal_ours_for_output = terminal_ours_for_output;
2500 gnu_ops.to_terminal_ours = terminal_ours;
2501 gnu_ops.to_terminal_info = child_terminal_info;
2502 gnu_ops.to_kill = gnu_kill_inferior; /* to_kill */
2503 gnu_ops.to_load = 0; /* to_load */
2504 gnu_ops.to_lookup_symbol = 0; /* to_lookup_symbol */
2505 gnu_ops.to_create_inferior = gnu_create_inferior; /* to_create_inferior */
2506 gnu_ops.to_post_startup_inferior = NULL; /* to_post_startup_inferior */
2507 gnu_ops.to_acknowledge_created_inferior = NULL; /* to_acknowledge_created_inferior */
2508 gnu_ops.to_clone_and_follow_inferior = NULL; /* to_clone_and_follow_inferior */
2509 gnu_ops.to_post_follow_inferior_by_clone = NULL; /* to_post_follow_inferior_by_clone */
c906108c
SS
2510 gnu_ops.to_insert_fork_catchpoint = NULL;
2511 gnu_ops.to_remove_fork_catchpoint = NULL;
2512 gnu_ops.to_insert_vfork_catchpoint = NULL;
2513 gnu_ops.to_remove_vfork_catchpoint = NULL;
c5aa993b
JM
2514 gnu_ops.to_has_forked = NULL; /* to_has_forked */
2515 gnu_ops.to_has_vforked = NULL; /* to_has_vforked */
c906108c 2516 gnu_ops.to_can_follow_vfork_prior_to_exec = NULL;
c5aa993b 2517 gnu_ops.to_post_follow_vfork = NULL; /* to_post_follow_vfork */
c906108c
SS
2518 gnu_ops.to_insert_exec_catchpoint = NULL;
2519 gnu_ops.to_remove_exec_catchpoint = NULL;
2520 gnu_ops.to_has_execd = NULL;
2521 gnu_ops.to_reported_exec_events_per_exec_call = NULL;
2522 gnu_ops.to_has_exited = NULL;
c5aa993b
JM
2523 gnu_ops.to_mourn_inferior = gnu_mourn_inferior; /* to_mourn_inferior */
2524 gnu_ops.to_can_run = gnu_can_run; /* to_can_run */
2525 gnu_ops.to_notice_signals = 0; /* to_notice_signals */
2526 gnu_ops.to_thread_alive = gnu_thread_alive; /* to_thread_alive */
ed9a39eb 2527 gnu_ops.to_pid_to_str = gnu_pid_to_str; /* to_pid_to_str */
c5aa993b
JM
2528 gnu_ops.to_stop = gnu_stop; /* to_stop */
2529 gnu_ops.to_pid_to_exec_file = gnu_pid_to_exec_file; /* to_pid_to_exec_file */
c906108c 2530 gnu_ops.to_core_file_to_sym_file = NULL;
c5aa993b
JM
2531 gnu_ops.to_stratum = process_stratum; /* to_stratum */
2532 gnu_ops.DONT_USE = 0; /* to_next */
2533 gnu_ops.to_has_all_memory = 1; /* to_has_all_memory */
2534 gnu_ops.to_has_memory = 1; /* to_has_memory */
2535 gnu_ops.to_has_stack = 1; /* to_has_stack */
2536 gnu_ops.to_has_registers = 1; /* to_has_registers */
2537 gnu_ops.to_has_execution = 1; /* to_has_execution */
2538 gnu_ops.to_sections = 0; /* sections */
2539 gnu_ops.to_sections_end = 0; /* sections_end */
2540 gnu_ops.to_magic = OPS_MAGIC; /* to_magic */
2541} /* init_gnu_ops */
c906108c 2542\f
c906108c
SS
2543/* User task commands. */
2544
2545struct cmd_list_element *set_task_cmd_list = 0;
2546struct cmd_list_element *show_task_cmd_list = 0;
2547/* User thread commands. */
2548
2549/* Commands with a prefix of `set/show thread'. */
2550extern struct cmd_list_element *thread_cmd_list;
2551struct cmd_list_element *set_thread_cmd_list = NULL;
2552struct cmd_list_element *show_thread_cmd_list = NULL;
2553
2554/* Commands with a prefix of `set/show thread default'. */
2555struct cmd_list_element *set_thread_default_cmd_list = NULL;
2556struct cmd_list_element *show_thread_default_cmd_list = NULL;
2557
2558static void
2559set_thread_cmd (char *args, int from_tty)
2560{
9846de1b 2561 printf_unfiltered ("\"set thread\" must be followed by the name of a thread property, or \"default\".\n");
c906108c
SS
2562}
2563
2564static void
2565show_thread_cmd (char *args, int from_tty)
2566{
2567 printf_unfiltered ("\"show thread\" must be followed by the name of a thread property, or \"default\".\n");
2568}
2569
2570static void
2571set_thread_default_cmd (char *args, int from_tty)
2572{
2573 printf_unfiltered ("\"set thread default\" must be followed by the name of a thread property.\n");
2574}
2575
2576static void
2577show_thread_default_cmd (char *args, int from_tty)
2578{
2579 printf_unfiltered ("\"show thread default\" must be followed by the name of a thread property.\n");
2580}
2581
2582static int
2583parse_int_arg (char *args, char *cmd_prefix)
2584{
2585 if (args)
2586 {
2587 char *arg_end;
2588 int val = strtoul (args, &arg_end, 10);
2589 if (*args && *arg_end == '\0')
2590 return val;
2591 }
2592 error ("Illegal argument for \"%s\" command, should be an integer.", cmd_prefix);
2593}
2594
2595static int
2596_parse_bool_arg (char *args, char *t_val, char *f_val, char *cmd_prefix)
2597{
2598 if (!args || strcmp (args, t_val) == 0)
2599 return 1;
2600 else if (strcmp (args, f_val) == 0)
2601 return 0;
2602 else
2603 error ("Illegal argument for \"%s\" command, should be \"%s\" or \"%s\".",
2604 cmd_prefix, t_val, f_val);
2605}
2606
2607#define parse_bool_arg(args, cmd_prefix) \
2608 _parse_bool_arg (args, "on", "off", cmd_prefix)
2609
2610static void
2611check_empty (char *args, char *cmd_prefix)
2612{
2613 if (args)
2614 error ("Garbage after \"%s\" command: `%s'", cmd_prefix, args);
2615}
2616
2617/* Returns the alive thread named by INFERIOR_PID, or signals an error. */
2618static struct proc *
2619cur_thread ()
2620{
2621 struct inf *inf = cur_inf ();
2622 struct proc *thread = inf_tid_to_thread (inf, inferior_pid);
2623 if (!thread)
2624 error ("No current thread.");
2625 return thread;
2626}
2627
2628/* Returns the current inferior, but signals an error if it has no task. */
2629static struct inf *
2630active_inf ()
2631{
2632 struct inf *inf = cur_inf ();
c5aa993b 2633 if (!inf->task)
c906108c
SS
2634 error ("No current process.");
2635 return inf;
2636}
2637\f
2638static void
2639set_task_pause_cmd (char *args, int from_tty)
2640{
2641 struct inf *inf = cur_inf ();
2642 int old_sc = inf->pause_sc;
2643
2644 inf->pause_sc = parse_bool_arg (args, "set task pause");
2645
2646 if (old_sc == 0 && inf->pause_sc != 0)
2647 /* If the task is currently unsuspended, immediately suspend it,
2648 otherwise wait until the next time it gets control. */
2649 inf_suspend (inf);
2650}
2651
2652static void
2653show_task_pause_cmd (char *args, int from_tty)
2654{
2655 struct inf *inf = cur_inf ();
2656 check_empty (args, "show task pause");
2657 printf_unfiltered ("The inferior task %s suspended while gdb has control.\n",
2658 inf->task
2659 ? (inf->pause_sc == 0 ? "isn't" : "is")
2660 : (inf->pause_sc == 0 ? "won't be" : "will be"));
2661}
2662
2663static void
2664set_task_detach_sc_cmd (char *args, int from_tty)
2665{
2666 cur_inf ()->detach_sc = parse_int_arg (args, "set task detach-suspend-count");
2667}
2668
2669static void
2670show_task_detach_sc_cmd (char *args, int from_tty)
2671{
2672 check_empty (args, "show task detach-suspend-count");
2673 printf_unfiltered ("The inferior task will be left with a suspend count of %d when detaching.\n",
2674 cur_inf ()->detach_sc);
2675}
2676\f
2677static void
2678set_thread_default_pause_cmd (char *args, int from_tty)
2679{
2680 struct inf *inf = cur_inf ();
2681 inf->default_thread_pause_sc =
2682 parse_bool_arg (args, "set thread default pause") ? 0 : 1;
2683}
2684
2685static void
2686show_thread_default_pause_cmd (char *args, int from_tty)
2687{
2688 struct inf *inf = cur_inf ();
2689 int sc = inf->default_thread_pause_sc;
2690 check_empty (args, "show thread default pause");
2691 printf_unfiltered ("New threads %s suspended while gdb has control%s.\n",
2692 sc ? "are" : "aren't",
2693 !sc && inf->pause_sc ? " (but the task is)" : "");
2694}
2695
2696static void
2697set_thread_default_run_cmd (char *args, int from_tty)
2698{
2699 struct inf *inf = cur_inf ();
2700 inf->default_thread_run_sc =
2701 parse_bool_arg (args, "set thread default run") ? 0 : 1;
2702}
2703
2704static void
2705show_thread_default_run_cmd (char *args, int from_tty)
2706{
2707 struct inf *inf = cur_inf ();
2708 check_empty (args, "show thread default run");
2709 printf_unfiltered ("New threads %s allowed to run.\n",
2710 inf->default_thread_run_sc == 0 ? "are" : "aren't");
2711}
2712
2713static void
2714set_thread_default_detach_sc_cmd (char *args, int from_tty)
2715{
2716 cur_inf ()->default_thread_detach_sc =
2717 parse_int_arg (args, "set thread default detach-suspend-count");
2718}
2719
2720static void
2721show_thread_default_detach_sc_cmd (char *args, int from_tty)
2722{
2723 check_empty (args, "show thread default detach-suspend-count");
2724 printf_unfiltered ("New threads will get a detach-suspend-count of %d.\n",
2725 cur_inf ()->default_thread_detach_sc);
2726}
2727\f
2728/* Steal a send right called NAME in the inferior task, and make it PROC's
2729 saved exception port. */
2730static void
2731steal_exc_port (struct proc *proc, mach_port_t name)
2732{
2733 error_t err;
2734 mach_port_t port;
2735 mach_msg_type_name_t port_type;
2736
2737 if (!proc || !proc->inf->task)
2738 error ("No inferior task.");
2739
2740 err = mach_port_extract_right (proc->inf->task->port,
2741 name, MACH_MSG_TYPE_COPY_SEND,
2742 &port, &port_type);
2743 if (err)
2744 error ("Couldn't extract send right %d from inferior: %s",
2745 name, strerror (err));
2746
2747 if (proc->saved_exc_port)
2748 /* Get rid of our reference to the old one. */
2749 mach_port_deallocate (mach_task_self (), proc->saved_exc_port);
2750
2751 proc->saved_exc_port = port;
2752
c5aa993b 2753 if (!proc->exc_port)
c906108c
SS
2754 /* If PROC is a thread, we may not have set its exception port before.
2755 We can't use proc_steal_exc_port because it also sets saved_exc_port. */
2756 {
c5aa993b
JM
2757 proc->exc_port = proc->inf->event_port;
2758 err = proc_set_exception_port (proc, proc->exc_port);
2759 error ("Can't set exception port for %s: %s",
2760 proc_string (proc), strerror (err));
c906108c
SS
2761 }
2762}
2763\f
2764static void
2765set_task_exc_port_cmd (char *args, int from_tty)
2766{
2767 struct inf *inf = cur_inf ();
2768 if (!args)
2769 error ("No argument to \"set task exception-port\" command.");
2770 steal_exc_port (inf->task, parse_and_eval_address (args));
2771}
2772
c5aa993b 2773static void
c906108c
SS
2774set_stopped_cmd (char *args, int from_tty)
2775{
2776 cur_inf ()->stopped = _parse_bool_arg (args, "yes", "no", "set stopped");
2777}
2778
2779static void
2780show_stopped_cmd (char *args, int from_tty)
2781{
2782 struct inf *inf = active_inf ();
2783 check_empty (args, "show stopped");
2784 printf_unfiltered ("The inferior process %s stopped.\n",
2785 inf->stopped ? "is" : "isn't");
2786}
2787
c5aa993b 2788static void
c906108c
SS
2789set_sig_thread_cmd (char *args, int from_tty)
2790{
2791 int tid;
2792 struct inf *inf = cur_inf ();
2793
c5aa993b 2794 if (!args || (!isdigit (*args) && strcmp (args, "none") != 0))
c906108c
SS
2795 error ("Illegal argument to \"set signal-thread\" command.\n"
2796 "Should be an integer thread ID, or `none'.");
2797
2798 if (strcmp (args, "none") == 0)
2799 inf->signal_thread = 0;
2800 else
2801 {
2802 int tid = thread_id_to_pid (atoi (args));
2803 if (tid < 0)
2804 error ("Thread ID %s not known. Use the \"info threads\" command to\n"
2805 "see the IDs of currently known threads.", args);
2806 inf->signal_thread = inf_tid_to_thread (inf, tid);
2807 }
2808}
2809
2810static void
2811show_sig_thread_cmd (char *args, int from_tty)
2812{
2813 struct inf *inf = active_inf ();
2814 check_empty (args, "show signal-thread");
2815 if (inf->signal_thread)
2816 printf_unfiltered ("The signal thread is %s.\n",
2817 proc_string (inf->signal_thread));
2818 else
2819 printf_unfiltered ("There is no signal thread.\n");
2820}
2821\f
c5aa993b 2822static void
c906108c
SS
2823set_signals_cmd (char *args, int from_tty)
2824{
2825 int trace;
2826 struct inf *inf = cur_inf ();
2827
2828 inf->want_signals = parse_bool_arg (args, "set signals");
2829
2830 if (inf->task && inf->want_signals != inf->traced)
2831 /* Make this take effect immediately in a running process. */
2832 inf_set_traced (inf, inf->want_signals);
2833}
2834
2835static void
2836show_signals_cmd (char *args, int from_tty)
2837{
2838 struct inf *inf = cur_inf ();
2839 check_empty (args, "show signals");
2840 printf_unfiltered ("The inferior process's signals %s intercepted.\n",
2841 inf->task
2842 ? (inf->traced ? "are" : "aren't")
2843 : (inf->want_signals ? "will be" : "won't be"));
2844}
2845
c5aa993b 2846static void
c906108c
SS
2847set_exceptions_cmd (char *args, int from_tty)
2848{
2849 struct inf *inf = cur_inf ();
2850 int val = parse_bool_arg (args, "set exceptions");
2851
2852 if (inf->task && inf->want_exceptions != val)
2853 /* Make this take effect immediately in a running process. */
c5aa993b 2854 /* XXX */ ;
c906108c
SS
2855
2856 inf->want_exceptions = val;
2857}
2858
2859static void
2860show_exceptions_cmd (char *args, int from_tty)
2861{
2862 struct inf *inf = cur_inf ();
2863 check_empty (args, "show exceptions");
2864 printf_unfiltered ("Exceptions in the inferior %s trapped.\n",
2865 inf->task
2866 ? (inf->want_exceptions ? "are" : "aren't")
2867 : (inf->want_exceptions ? "will be" : "won't be"));
2868}
2869\f
2870static void
2871set_task_cmd (char *args, int from_tty)
2872{
2873 printf_unfiltered ("\"set task\" must be followed by the name of a task property.\n");
2874}
2875
2876static void
2877show_task_cmd (char *args, int from_tty)
2878{
2879 struct inf *inf = cur_inf ();
2880
2881 check_empty (args, "show task");
2882
2883 show_signals_cmd (0, from_tty);
2884 show_exceptions_cmd (0, from_tty);
2885 show_task_pause_cmd (0, from_tty);
2886
2887 if (inf->pause_sc == 0)
2888 show_thread_default_pause_cmd (0, from_tty);
2889 show_thread_default_run_cmd (0, from_tty);
2890
2891 if (inf->task)
2892 {
2893 show_stopped_cmd (0, from_tty);
2894 show_sig_thread_cmd (0, from_tty);
2895 }
2896
2897 if (inf->detach_sc != 0)
2898 show_task_detach_sc_cmd (0, from_tty);
2899 if (inf->default_thread_detach_sc != 0)
2900 show_thread_default_detach_sc_cmd (0, from_tty);
2901}
2902\f
2903static void
2904set_noninvasive_cmd (char *args, int from_tty)
2905{
2906 /* Invert the sense of the arg for each component. */
2907 char *inv_args = parse_bool_arg (args, "set noninvasive") ? "off" : "on";
2908
2909 set_task_pause_cmd (inv_args, from_tty);
2910 set_signals_cmd (inv_args, from_tty);
2911 set_exceptions_cmd (inv_args, from_tty);
2912}
2913\f
2914static void
2915info_port_rights (char *args, mach_port_type_t only)
2916{
2917 struct inf *inf = active_inf ();
2918 value_ptr vmark = value_mark ();
2919
2920 if (args)
2921 /* Explicit list of port rights. */
2922 {
2923 while (*args)
2924 {
2925 value_ptr val = parse_to_comma_and_eval (&args);
2926 long right = value_as_long (val);
2927 error_t err =
c5aa993b
JM
2928 print_port_info (right, 0, inf->task->port, PORTINFO_DETAILS,
2929 stdout);
c906108c
SS
2930 if (err)
2931 error ("%ld: %s.", right, strerror (err));
2932 }
2933 }
2934 else
2935 /* Print all of them. */
2936 {
2937 error_t err =
c5aa993b
JM
2938 print_task_ports_info (inf->task->port, only, PORTINFO_DETAILS,
2939 stdout);
c906108c
SS
2940 if (err)
2941 error ("%s.", strerror (err));
2942 }
2943
2944 value_free_to_mark (vmark);
2945}
2946
2947static void
2948info_send_rights_cmd (char *args, int from_tty)
2949{
2950 info_port_rights (args, MACH_PORT_TYPE_SEND);
2951}
2952static void
2953info_recv_rights_cmd (char *args, int from_tty)
2954{
2955 info_port_rights (args, MACH_PORT_TYPE_RECEIVE);
2956}
2957static void
2958info_port_sets_cmd (char *args, int from_tty)
2959{
2960 info_port_rights (args, MACH_PORT_TYPE_PORT_SET);
2961}
2962static void
2963info_dead_names_cmd (char *args, int from_tty)
2964{
2965 info_port_rights (args, MACH_PORT_TYPE_DEAD_NAME);
2966}
2967static void
2968info_port_rights_cmd (char *args, int from_tty)
2969{
2970 info_port_rights (args, ~0);
2971}
2972\f
c5aa993b
JM
2973static void
2974add_task_commands ()
c906108c
SS
2975{
2976 add_cmd ("pause", class_run, set_thread_default_pause_cmd,
c5aa993b 2977 "Set whether the new threads are suspended while gdb has control.\n"
c906108c 2978 "This property normally has no effect because the whole task is\n"
c5aa993b 2979 "suspended, however, that may be disabled with \"set task pause off\".\n"
c906108c
SS
2980 "The default value is \"off\".",
2981 &set_thread_default_cmd_list);
2982 add_cmd ("pause", no_class, show_thread_default_pause_cmd,
2983 "Show whether new threads are suspended while gdb has control.",
2984 &show_thread_default_cmd_list);
2985 add_cmd ("run", class_run, set_thread_default_run_cmd,
c5aa993b 2986 "Set whether new threads are allowed to run (once gdb has noticed them).",
c906108c
SS
2987 &set_thread_default_cmd_list);
2988 add_cmd ("run", no_class, show_thread_default_run_cmd,
c5aa993b 2989 "Show whether new threads are allowed to run (once gdb has noticed them).",
c906108c
SS
2990 &show_thread_default_cmd_list);
2991 add_cmd ("detach-suspend-count", class_run, set_thread_default_detach_sc_cmd,
2992 "Set the default detach-suspend-count value for new threads.",
2993 &set_thread_default_cmd_list);
2994 add_cmd ("detach-suspend-count", no_class, show_thread_default_detach_sc_cmd,
2995 "Show the default detach-suspend-count value for new threads.",
2996 &show_thread_default_cmd_list);
2997
2998 add_cmd ("signals", class_run, set_signals_cmd,
c5aa993b 2999 "Set whether the inferior process's signals will be intercepted.\n"
c906108c
SS
3000 "Mach exceptions (such as breakpoint traps) are not affected.",
3001 &setlist);
3002 add_alias_cmd ("sigs", "signals", class_run, 1, &setlist);
3003 add_cmd ("signals", no_class, show_signals_cmd,
c5aa993b 3004 "Show whether the inferior process's signals will be intercepted.",
c906108c
SS
3005 &showlist);
3006 add_alias_cmd ("sigs", "signals", no_class, 1, &showlist);
3007
3008 add_cmd ("signal-thread", class_run, set_sig_thread_cmd,
3009 "Set the thread that gdb thinks is the libc signal thread.\n"
c5aa993b 3010 "This thread is run when delivering a signal to a non-stopped process.",
c906108c
SS
3011 &setlist);
3012 add_alias_cmd ("sigthread", "signal-thread", class_run, 1, &setlist);
3013 add_cmd ("signal-thread", no_class, show_sig_thread_cmd,
3014 "Set the thread that gdb thinks is the libc signal thread.",
3015 &showlist);
3016 add_alias_cmd ("sigthread", "signal-thread", no_class, 1, &showlist);
3017
3018 add_cmd ("stopped", class_run, set_stopped_cmd,
c5aa993b 3019 "Set whether gdb thinks the inferior process is stopped as with SIGSTOP.\n"
c906108c
SS
3020 "Stopped process will be continued by sending them a signal.",
3021 &setlist);
3022 add_cmd ("stopped", no_class, show_signals_cmd,
c5aa993b 3023 "Show whether gdb thinks the inferior process is stopped as with SIGSTOP.",
c906108c
SS
3024 &showlist);
3025
3026 add_cmd ("exceptions", class_run, set_exceptions_cmd,
c5aa993b
JM
3027 "Set whether exceptions in the inferior process will be trapped.\n"
3028 "When exceptions are turned off, neither breakpoints nor single-stepping\n"
c906108c
SS
3029 "will work.",
3030 &setlist);
3031 /* Allow `set exc' despite conflict with `set exception-port'. */
3032 add_alias_cmd ("exc", "exceptions", class_run, 1, &setlist);
3033 add_cmd ("exceptions", no_class, show_exceptions_cmd,
c5aa993b 3034 "Show whether exceptions in the inferior process will be trapped.",
c906108c
SS
3035 &showlist);
3036
3037 add_prefix_cmd ("task", no_class, set_task_cmd,
3038 "Command prefix for setting task attributes.",
3039 &set_task_cmd_list, "set task ", 0, &setlist);
3040 add_prefix_cmd ("task", no_class, show_task_cmd,
3041 "Command prefix for showing task attributes.",
3042 &show_task_cmd_list, "show task ", 0, &showlist);
3043
3044 add_cmd ("pause", class_run, set_task_pause_cmd,
3045 "Set whether the task is suspended while gdb has control.\n"
3046 "A value of \"on\" takes effect immediately, otherwise nothing\n"
3047 "happens until the next time the program is continued.\n"
3048 "When setting this to \"off\", \"set thread default pause on\"\n"
3049 "can be used to pause individual threads by default instead.",
3050 &set_task_cmd_list);
3051 add_cmd ("pause", no_class, show_task_pause_cmd,
3052 "Show whether the task is suspended while gdb has control.",
3053 &show_task_cmd_list);
3054 add_cmd ("detach-suspend-count", class_run, set_task_detach_sc_cmd,
3055 "Set the suspend count will leave on the thread when detaching.",
3056 &set_task_cmd_list);
3057 add_cmd ("detach-suspend-count", no_class, show_task_detach_sc_cmd,
3058 "Show the suspend count will leave on the thread when detaching.",
3059 &show_task_cmd_list);
3060
3061 add_cmd ("exception-port", no_class, set_task_exc_port_cmd,
3062 "Set the task exception port to which we forward exceptions.\n"
3063 "The argument should be the value of the send right in the task.",
3064 &set_task_cmd_list);
3065 add_alias_cmd ("excp", "exception-port", no_class, 1, &set_task_cmd_list);
3066 add_alias_cmd ("exc-port", "exception-port", no_class, 1, &set_task_cmd_list);
3067
3068 /* A convenient way of turning on all options require to noninvasively
3069 debug running tasks. */
3070 add_cmd ("noninvasive", no_class, set_noninvasive_cmd,
3071 "Set task options so that we interfere as little as possible.\n"
3072 "This is the same as setting `task pause', `exceptions', and"
3073 "`signals' to the opposite value.",
3074 &setlist);
3075
3076 /* Commands to show information about the task's ports. */
3077 add_cmd ("send-rights", class_info, info_send_rights_cmd,
3078 "Show information about the task's send rights",
3079 &infolist);
3080 add_cmd ("receive-rights", class_info, info_recv_rights_cmd,
3081 "Show information about the task's receive rights",
3082 &infolist);
3083 add_cmd ("port-rights", class_info, info_send_rights_cmd,
3084 "Show information about the task's port rights",
3085 &infolist);
3086 add_cmd ("port-sets", class_info, info_port_sets_cmd,
3087 "Show information about the task's port sets",
3088 &infolist);
3089 add_cmd ("dead-names", class_info, info_dead_names_cmd,
3090 "Show information about the task's dead names",
3091 &infolist);
3092 add_info_alias ("ports", "port-rights", 1);
3093 add_info_alias ("port", "port-rights", 1);
3094 add_info_alias ("psets", "port-sets", 1);
3095}
3096\f
3097
3098static void
3099set_thread_pause_cmd (char *args, int from_tty)
3100{
3101 struct proc *thread = cur_thread ();
3102 int old_sc = thread->pause_sc;
3103 thread->pause_sc = parse_bool_arg (args, "set thread pause");
3104 if (old_sc == 0 && thread->pause_sc != 0 && thread->inf->pause_sc == 0)
3105 /* If the task is currently unsuspended, immediately suspend it,
3106 otherwise wait until the next time it gets control. */
3107 inf_suspend (thread->inf);
3108}
3109
3110static void
3111show_thread_pause_cmd (char *args, int from_tty)
3112{
3113 struct proc *thread = cur_thread ();
3114 int sc = thread->pause_sc;
3115 check_empty (args, "show task pause");
3116 printf_unfiltered ("Thread %s %s suspended while gdb has control%s.\n",
3117 proc_string (thread),
3118 sc ? "is" : "isn't",
c5aa993b 3119 !sc && thread->inf->pause_sc ? " (but the task is)" : "");
c906108c
SS
3120}
3121
3122static void
3123set_thread_run_cmd (char *args, int from_tty)
3124{
3125 struct proc *thread = cur_thread ();
3126 thread->run_sc = parse_bool_arg (args, "set thread run") ? 0 : 1;
3127}
3128
3129static void
3130show_thread_run_cmd (char *args, int from_tty)
3131{
3132 struct proc *thread = cur_thread ();
3133 check_empty (args, "show thread run");
3134 printf_unfiltered ("Thread %s %s allowed to run.",
3135 proc_string (thread),
3136 thread->run_sc == 0 ? "is" : "isn't");
3137}
3138
3139static void
3140set_thread_detach_sc_cmd (char *args, int from_tty)
3141{
3142 cur_thread ()->detach_sc = parse_int_arg (args, "set thread detach-suspend-count");
3143}
3144
3145static void
3146show_thread_detach_sc_cmd (char *args, int from_tty)
3147{
3148 struct proc *thread = cur_thread ();
3149 check_empty (args, "show thread detach-suspend-count");
3150 printf_unfiltered ("Thread %s will be left with a suspend count of %d when detaching.\n",
3151 proc_string (thread),
3152 thread->detach_sc);
3153}
3154
3155static void
3156set_thread_exc_port_cmd (char *args, int from_tty)
3157{
3158 struct proc *thread = cur_thread ();
3159 if (!args)
3160 error ("No argument to \"set thread exception-port\" command.");
3161 steal_exc_port (thread, parse_and_eval_address (args));
3162}
3163
3164#if 0
3165static void
3166show_thread_cmd (char *args, int from_tty)
3167{
3168 struct proc *thread = cur_thread ();
3169 check_empty (args, "show thread");
3170 show_thread_run_cmd (0, from_tty);
3171 show_thread_pause_cmd (0, from_tty);
3172 if (thread->detach_sc != 0)
3173 show_thread_detach_sc_cmd (0, from_tty);
3174}
3175#endif
3176
3177static void
3178thread_takeover_sc_cmd (char *args, int from_tty)
3179{
3180 struct proc *thread = cur_thread ();
3181 thread_basic_info_data_t _info;
3182 thread_basic_info_t info = &_info;
3183 mach_msg_type_number_t info_len = THREAD_BASIC_INFO_COUNT;
3184 error_t err =
c5aa993b 3185 thread_info (thread->port, THREAD_BASIC_INFO, (int *) &info, &info_len);
c906108c
SS
3186 if (err)
3187 error ("%s.", strerror (err));
3188 thread->sc = info->suspend_count;
3189 if (from_tty)
3190 printf_unfiltered ("Suspend count was %d.\n", thread->sc);
3191 if (info != &_info)
c5aa993b 3192 vm_deallocate (mach_task_self (), (vm_address_t) info, info_len * sizeof (int));
c906108c
SS
3193}
3194
3195add_thread_commands ()
3196{
3197 add_prefix_cmd ("thread", no_class, set_thread_cmd,
3198 "Command prefix for setting thread properties.",
3199 &set_thread_cmd_list, "set thread ", 0, &setlist);
3200 add_prefix_cmd ("default", no_class, show_thread_cmd,
3201 "Command prefix for setting default thread properties.",
3202 &set_thread_default_cmd_list, "set thread default ", 0,
3203 &set_thread_cmd_list);
3204 add_prefix_cmd ("thread", no_class, set_thread_default_cmd,
3205 "Command prefix for showing thread properties.",
3206 &show_thread_cmd_list, "show thread ", 0, &showlist);
3207 add_prefix_cmd ("default", no_class, show_thread_default_cmd,
3208 "Command prefix for showing default thread properties.",
3209 &show_thread_default_cmd_list, "show thread default ", 0,
3210 &show_thread_cmd_list);
3211
3212 add_cmd ("pause", class_run, set_thread_pause_cmd,
c5aa993b 3213 "Set whether the current thread is suspended while gdb has control.\n"
c906108c
SS
3214 "A value of \"on\" takes effect immediately, otherwise nothing\n"
3215 "happens until the next time the program is continued. This\n"
c5aa993b 3216 "property normally has no effect because the whole task is suspended,\n"
c906108c
SS
3217 "however, that may be disabled with \"set task pause off\".\n"
3218 "The default value is \"off\".",
3219 &set_thread_cmd_list);
3220 add_cmd ("pause", no_class, show_thread_pause_cmd,
c5aa993b 3221 "Show whether the current thread is suspended while gdb has control.",
c906108c
SS
3222 &show_thread_cmd_list);
3223
3224 add_cmd ("run", class_run, set_thread_run_cmd,
3225 "Set whether the current thread is allowed to run.",
3226 &set_thread_cmd_list);
3227 add_cmd ("run", no_class, show_thread_run_cmd,
3228 "Show whether the current thread is allowed to run.",
3229 &show_thread_cmd_list);
3230
3231 add_cmd ("detach-suspend-count", class_run, set_thread_detach_sc_cmd,
3232 "Set the suspend count will leave on the thread when detaching.\n"
3233 "Note that this is relative to suspend count when gdb noticed the thread;\n"
3234 "use the `thread takeover-suspend-count' to force it to an absolute value.",
3235 &set_thread_cmd_list);
3236 add_cmd ("detach-suspend-count", no_class, show_thread_detach_sc_cmd,
3237 "Show the suspend count will leave on the thread when detaching."
3238 "Note that this is relative to suspend count when gdb noticed the thread;\n"
3239 "use the `thread takeover-suspend-count' to force it to an absolute value.",
3240 &show_thread_cmd_list);
3241
3242 add_cmd ("exception-port", no_class, set_thread_exc_port_cmd,
3243 "Set the exception port to which we forward exceptions for the\n"
3244 "current thread, overriding the task exception port.\n"
3245 "The argument should be the value of the send right in the task.",
3246 &set_thread_cmd_list);
3247 add_alias_cmd ("excp", "exception-port", no_class, 1, &set_thread_cmd_list);
3248 add_alias_cmd ("exc-port", "exception-port", no_class, 1, &set_thread_cmd_list);
3249
3250 add_cmd ("takeover-suspend-count", no_class, thread_takeover_sc_cmd,
3251 "Force the threads absolute suspend-count to be gdb's.\n"
3252 "Prior to giving this command, gdb's thread suspend-counts are relative to\n"
c5aa993b 3253 "the thread's initial suspend-count when gdb notices the threads.",
c906108c
SS
3254 &thread_cmd_list);
3255}
3256\f
3257void
3258_initialize_gnu_nat ()
3259{
3260 proc_server = getproc ();
c5aa993b 3261 init_gnu_ops ();
c906108c
SS
3262 add_target (&gnu_ops);
3263 add_task_commands ();
3264 add_thread_commands ();
3265
c906108c 3266 add_set_cmd ("gnu-debug", class_maintenance,
c5aa993b
JM
3267 var_boolean, (char *) &gnu_debug_flag,
3268 "Set debugging output for the gnu backend.", &maintenancelist);
c906108c
SS
3269}
3270\f
3271#ifdef FLUSH_INFERIOR_CACHE
3272
3273/* When over-writing code on some machines the I-Cache must be flushed
3274 explicitly, because it is not kept coherent by the lazy hardware.
3275 This definitely includes breakpoints, for instance, or else we
3276 end up looping in mysterious Bpt traps */
3277
3278void
c5aa993b 3279flush_inferior_icache (pc, amount)
c906108c
SS
3280 CORE_ADDR pc;
3281{
3282 vm_machine_attribute_val_t flush = MATTR_VAL_ICACHE_FLUSH;
c5aa993b
JM
3283 error_t ret;
3284
c906108c
SS
3285 ret = vm_machine_attribute (current_inferior->task->port,
3286 pc,
3287 amount,
3288 MATTR_CACHE,
3289 &flush);
3290 if (ret != KERN_SUCCESS)
3291 warning ("Error flushing inferior's cache : %s", strerror (ret));
3292}
c5aa993b 3293#endif /* FLUSH_INFERIOR_CACHE */
This page took 0.165415 seconds and 4 git commands to generate.