2000-12-17 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
[deliverable/binutils-gdb.git] / gdb / target.c
CommitLineData
c906108c 1/* Select target systems and architectures at runtime for GDB.
d9fcf2fb 2 Copyright 1990, 1992-1995, 1998-2000 Free Software Foundation, Inc.
c906108c
SS
3 Contributed by Cygnus Support.
4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b
JM
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
c906108c
SS
21
22#include "defs.h"
23#include <errno.h>
24#include <ctype.h>
25#include "gdb_string.h"
26#include "target.h"
27#include "gdbcmd.h"
28#include "symtab.h"
29#include "inferior.h"
30#include "bfd.h"
31#include "symfile.h"
32#include "objfiles.h"
03f2053f 33#include "gdb_wait.h"
4930751a 34#include "dcache.h"
c906108c
SS
35#include <signal.h>
36
37extern int errno;
38
a14ed312 39static void target_info (char *, int);
c906108c 40
a14ed312 41static void cleanup_target (struct target_ops *);
c906108c 42
a14ed312 43static void maybe_kill_then_create_inferior (char *, char *, char **);
c906108c 44
a14ed312 45static void default_clone_and_follow_inferior (int, int *);
c906108c 46
a14ed312 47static void maybe_kill_then_attach (char *, int);
c906108c 48
a14ed312 49static void kill_or_be_killed (int);
c906108c 50
a14ed312 51static void default_terminal_info (char *, int);
c906108c 52
a14ed312 53static int nosymbol (char *, CORE_ADDR *);
c906108c 54
a14ed312 55static void tcomplain (void);
c906108c 56
a14ed312 57static int nomemory (CORE_ADDR, char *, int, int, struct target_ops *);
c906108c 58
a14ed312 59static int return_zero (void);
c906108c 60
a14ed312 61static int return_one (void);
c906108c 62
a14ed312 63void target_ignore (void);
c906108c 64
a14ed312 65static void target_command (char *, int);
c906108c 66
a14ed312 67static struct target_ops *find_default_run_target (char *);
c906108c 68
a14ed312 69static void update_current_target (void);
c906108c 70
a14ed312 71static void nosupport_runtime (void);
392a587b 72
a14ed312 73static void normal_target_post_startup_inferior (int pid);
392a587b 74
917317f4
JM
75/* Transfer LEN bytes between target address MEMADDR and GDB address
76 MYADDR. Returns 0 for success, errno code for failure (which
77 includes partial transfers -- if you want a more useful response to
78 partial transfers, try either target_read_memory_partial or
79 target_write_memory_partial). */
c906108c
SS
80
81static int
a14ed312 82target_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write);
c906108c 83
a14ed312 84static void init_dummy_target (void);
c906108c 85
a14ed312 86static void debug_to_open (char *, int);
c906108c 87
a14ed312 88static void debug_to_close (int);
c906108c 89
a14ed312 90static void debug_to_attach (char *, int);
c906108c 91
a14ed312 92static void debug_to_detach (char *, int);
c906108c 93
a14ed312 94static void debug_to_resume (int, int, enum target_signal);
c906108c 95
a14ed312 96static int debug_to_wait (int, struct target_waitstatus *);
c906108c 97
a14ed312 98static void debug_to_fetch_registers (int);
c906108c 99
a14ed312 100static void debug_to_store_registers (int);
c906108c 101
a14ed312 102static void debug_to_prepare_to_store (void);
c906108c
SS
103
104static int
a14ed312 105debug_to_xfer_memory (CORE_ADDR, char *, int, int, struct target_ops *);
c906108c 106
a14ed312 107static void debug_to_files_info (struct target_ops *);
c906108c 108
a14ed312 109static int debug_to_insert_breakpoint (CORE_ADDR, char *);
c906108c 110
a14ed312 111static int debug_to_remove_breakpoint (CORE_ADDR, char *);
c906108c 112
a14ed312 113static void debug_to_terminal_init (void);
c906108c 114
a14ed312 115static void debug_to_terminal_inferior (void);
c906108c 116
a14ed312 117static void debug_to_terminal_ours_for_output (void);
c906108c 118
a14ed312 119static void debug_to_terminal_ours (void);
c906108c 120
a14ed312 121static void debug_to_terminal_info (char *, int);
c906108c 122
a14ed312 123static void debug_to_kill (void);
c906108c 124
a14ed312 125static void debug_to_load (char *, int);
c906108c 126
a14ed312 127static int debug_to_lookup_symbol (char *, CORE_ADDR *);
c906108c 128
a14ed312 129static void debug_to_create_inferior (char *, char *, char **);
c906108c 130
a14ed312 131static void debug_to_mourn_inferior (void);
c906108c 132
a14ed312 133static int debug_to_can_run (void);
c906108c 134
a14ed312 135static void debug_to_notice_signals (int);
c906108c 136
a14ed312 137static int debug_to_thread_alive (int);
c906108c 138
a14ed312 139static void debug_to_stop (void);
c906108c 140
a14ed312 141static int debug_to_query (int /*char */ , char *, char *, int *);
c906108c
SS
142
143/* Pointer to array of target architecture structures; the size of the
144 array; the current index into the array; the allocated size of the
145 array. */
146struct target_ops **target_structs;
147unsigned target_struct_size;
148unsigned target_struct_index;
149unsigned target_struct_allocsize;
150#define DEFAULT_ALLOCSIZE 10
151
152/* The initial current target, so that there is always a semi-valid
153 current target. */
154
155static struct target_ops dummy_target;
156
157/* Top of target stack. */
158
159struct target_stack_item *target_stack;
160
161/* The target structure we are currently using to talk to a process
162 or file or whatever "inferior" we have. */
163
164struct target_ops current_target;
165
166/* Command list for target. */
167
168static struct cmd_list_element *targetlist = NULL;
169
170/* Nonzero if we are debugging an attached outside process
171 rather than an inferior. */
172
173int attach_flag;
174
c906108c
SS
175/* Non-zero if we want to see trace of target level stuff. */
176
177static int targetdebug = 0;
178
a14ed312 179static void setup_target_debug (void);
c906108c 180
4930751a
C
181DCACHE *target_dcache;
182
c906108c
SS
183/* The user just typed 'target' without the name of a target. */
184
185/* ARGSUSED */
186static void
fba45db2 187target_command (char *arg, int from_tty)
c906108c
SS
188{
189 fputs_filtered ("Argument required (target name). Try `help target'\n",
190 gdb_stdout);
191}
192
193/* Add a possible target architecture to the list. */
194
195void
fba45db2 196add_target (struct target_ops *t)
c906108c
SS
197{
198 if (!target_structs)
199 {
200 target_struct_allocsize = DEFAULT_ALLOCSIZE;
201 target_structs = (struct target_ops **) xmalloc
202 (target_struct_allocsize * sizeof (*target_structs));
203 }
204 if (target_struct_size >= target_struct_allocsize)
205 {
206 target_struct_allocsize *= 2;
207 target_structs = (struct target_ops **)
c5aa993b
JM
208 xrealloc ((char *) target_structs,
209 target_struct_allocsize * sizeof (*target_structs));
c906108c
SS
210 }
211 target_structs[target_struct_size++] = t;
c5aa993b 212/* cleanup_target (t); */
c906108c
SS
213
214 if (targetlist == NULL)
215 add_prefix_cmd ("target", class_run, target_command,
216 "Connect to a target machine or process.\n\
217The first argument is the type or protocol of the target machine.\n\
218Remaining arguments are interpreted by the target protocol. For more\n\
219information on the arguments for a particular protocol, type\n\
220`help target ' followed by the protocol name.",
221 &targetlist, "target ", 0, &cmdlist);
222 add_cmd (t->to_shortname, no_class, t->to_open, t->to_doc, &targetlist);
223}
224
225/* Stub functions */
226
227void
fba45db2 228target_ignore (void)
c906108c
SS
229{
230}
231
11cf8741
JM
232void
233target_load (char *arg, int from_tty)
234{
4930751a 235 dcache_invalidate (target_dcache);
11cf8741
JM
236 (*current_target.to_load) (arg, from_tty);
237}
238
c906108c
SS
239/* ARGSUSED */
240static int
fba45db2
KB
241nomemory (CORE_ADDR memaddr, char *myaddr, int len, int write,
242 struct target_ops *t)
c906108c 243{
c5aa993b
JM
244 errno = EIO; /* Can't read/write this location */
245 return 0; /* No bytes handled */
c906108c
SS
246}
247
248static void
fba45db2 249tcomplain (void)
c906108c
SS
250{
251 error ("You can't do that when your target is `%s'",
252 current_target.to_shortname);
253}
254
255void
fba45db2 256noprocess (void)
c906108c
SS
257{
258 error ("You can't do that without a process to debug.");
259}
260
261/* ARGSUSED */
262static int
fba45db2 263nosymbol (char *name, CORE_ADDR *addrp)
c906108c 264{
c5aa993b 265 return 1; /* Symbol does not exist in target env */
c906108c
SS
266}
267
268/* ARGSUSED */
392a587b 269static void
fba45db2 270nosupport_runtime (void)
c906108c
SS
271{
272 if (!inferior_pid)
273 noprocess ();
274 else
275 error ("No run-time support for this");
276}
277
278
279/* ARGSUSED */
280static void
fba45db2 281default_terminal_info (char *args, int from_tty)
c906108c 282{
c5aa993b 283 printf_unfiltered ("No saved terminal information.\n");
c906108c
SS
284}
285
286/* This is the default target_create_inferior and target_attach function.
287 If the current target is executing, it asks whether to kill it off.
288 If this function returns without calling error(), it has killed off
289 the target, and the operation should be attempted. */
290
291static void
fba45db2 292kill_or_be_killed (int from_tty)
c906108c
SS
293{
294 if (target_has_execution)
295 {
296 printf_unfiltered ("You are already running a program:\n");
297 target_files_info ();
c5aa993b
JM
298 if (query ("Kill it? "))
299 {
300 target_kill ();
301 if (target_has_execution)
302 error ("Killing the program did not help.");
303 return;
304 }
305 else
306 {
307 error ("Program not killed.");
308 }
c906108c 309 }
c5aa993b 310 tcomplain ();
c906108c
SS
311}
312
313static void
fba45db2 314maybe_kill_then_attach (char *args, int from_tty)
c906108c
SS
315{
316 kill_or_be_killed (from_tty);
317 target_attach (args, from_tty);
318}
319
320static void
fba45db2 321maybe_kill_then_create_inferior (char *exec, char *args, char **env)
c906108c
SS
322{
323 kill_or_be_killed (0);
324 target_create_inferior (exec, args, env);
325}
326
327static void
fba45db2 328default_clone_and_follow_inferior (int child_pid, int *followed_child)
c906108c
SS
329{
330 target_clone_and_follow_inferior (child_pid, followed_child);
331}
332
333/* Clean up a target struct so it no longer has any zero pointers in it.
334 We default entries, at least to stubs that print error messages. */
335
336static void
fba45db2 337cleanup_target (struct target_ops *t)
c906108c
SS
338{
339
340#define de_fault(field, value) \
0d06e24b
JM
341 if (!t->field) \
342 t->field = value
343
344 de_fault (to_open,
345 (void (*) (char *, int))
346 tcomplain);
347 de_fault (to_close,
348 (void (*) (int))
349 target_ignore);
350 de_fault (to_attach,
351 maybe_kill_then_attach);
352 de_fault (to_post_attach,
353 (void (*) (int))
354 target_ignore);
355 de_fault (to_require_attach,
356 maybe_kill_then_attach);
357 de_fault (to_detach,
358 (void (*) (char *, int))
359 target_ignore);
360 de_fault (to_require_detach,
361 (void (*) (int, char *, int))
362 target_ignore);
363 de_fault (to_resume,
364 (void (*) (int, int, enum target_signal))
365 noprocess);
366 de_fault (to_wait,
367 (int (*) (int, struct target_waitstatus *))
368 noprocess);
369 de_fault (to_post_wait,
370 (void (*) (int, int))
371 target_ignore);
372 de_fault (to_fetch_registers,
373 (void (*) (int))
374 target_ignore);
375 de_fault (to_store_registers,
376 (void (*) (int))
377 noprocess);
378 de_fault (to_prepare_to_store,
379 (void (*) (void))
380 noprocess);
381 de_fault (to_xfer_memory,
382 (int (*) (CORE_ADDR, char *, int, int, struct target_ops *))
383 nomemory);
384 de_fault (to_files_info,
385 (void (*) (struct target_ops *))
386 target_ignore);
387 de_fault (to_insert_breakpoint,
388 memory_insert_breakpoint);
389 de_fault (to_remove_breakpoint,
390 memory_remove_breakpoint);
391 de_fault (to_terminal_init,
392 (void (*) (void))
393 target_ignore);
394 de_fault (to_terminal_inferior,
395 (void (*) (void))
396 target_ignore);
397 de_fault (to_terminal_ours_for_output,
398 (void (*) (void))
399 target_ignore);
400 de_fault (to_terminal_ours,
401 (void (*) (void))
402 target_ignore);
403 de_fault (to_terminal_info,
404 default_terminal_info);
405 de_fault (to_kill,
406 (void (*) (void))
407 noprocess);
408 de_fault (to_load,
409 (void (*) (char *, int))
410 tcomplain);
411 de_fault (to_lookup_symbol,
412 (int (*) (char *, CORE_ADDR *))
413 nosymbol);
414 de_fault (to_create_inferior,
415 maybe_kill_then_create_inferior);
416 de_fault (to_post_startup_inferior,
417 (void (*) (int))
418 target_ignore);
419 de_fault (to_acknowledge_created_inferior,
420 (void (*) (int))
421 target_ignore);
422 de_fault (to_clone_and_follow_inferior,
423 default_clone_and_follow_inferior);
424 de_fault (to_post_follow_inferior_by_clone,
425 (void (*) (void))
426 target_ignore);
427 de_fault (to_insert_fork_catchpoint,
428 (int (*) (int))
429 tcomplain);
430 de_fault (to_remove_fork_catchpoint,
431 (int (*) (int))
432 tcomplain);
433 de_fault (to_insert_vfork_catchpoint,
434 (int (*) (int))
435 tcomplain);
436 de_fault (to_remove_vfork_catchpoint,
437 (int (*) (int))
438 tcomplain);
439 de_fault (to_has_forked,
440 (int (*) (int, int *))
441 return_zero);
442 de_fault (to_has_vforked,
443 (int (*) (int, int *))
444 return_zero);
445 de_fault (to_can_follow_vfork_prior_to_exec,
446 (int (*) (void))
447 return_zero);
448 de_fault (to_post_follow_vfork,
449 (void (*) (int, int, int, int))
450 target_ignore);
451 de_fault (to_insert_exec_catchpoint,
452 (int (*) (int))
453 tcomplain);
454 de_fault (to_remove_exec_catchpoint,
455 (int (*) (int))
456 tcomplain);
457 de_fault (to_has_execd,
458 (int (*) (int, char **))
459 return_zero);
460 de_fault (to_reported_exec_events_per_exec_call,
461 (int (*) (void))
462 return_one);
463 de_fault (to_has_syscall_event,
464 (int (*) (int, enum target_waitkind *, int *))
465 return_zero);
466 de_fault (to_has_exited,
467 (int (*) (int, int, int *))
468 return_zero);
469 de_fault (to_mourn_inferior,
470 (void (*) (void))
471 noprocess);
472 de_fault (to_can_run,
473 return_zero);
474 de_fault (to_notice_signals,
475 (void (*) (int))
476 target_ignore);
477 de_fault (to_thread_alive,
478 (int (*) (int))
479 return_zero);
480 de_fault (to_find_new_threads,
481 (void (*) (void))
482 target_ignore);
483 de_fault (to_extra_thread_info,
484 (char *(*) (struct thread_info *))
485 return_zero);
486 de_fault (to_stop,
487 (void (*) (void))
488 target_ignore);
489 de_fault (to_query,
490 (int (*) (int, char *, char *, int *))
491 return_zero);
492 de_fault (to_rcmd,
d9fcf2fb 493 (void (*) (char *, struct ui_file *))
0d06e24b
JM
494 tcomplain);
495 de_fault (to_enable_exception_callback,
496 (struct symtab_and_line * (*) (enum exception_event_kind, int))
497 nosupport_runtime);
498 de_fault (to_get_current_exception_event,
499 (struct exception_event_record * (*) (void))
500 nosupport_runtime);
501 de_fault (to_pid_to_exec_file,
502 (char *(*) (int))
503 return_zero);
504 de_fault (to_core_file_to_sym_file,
505 (char *(*) (char *))
506 return_zero);
507 de_fault (to_can_async_p,
508 (int (*) (void))
509 return_zero);
510 de_fault (to_is_async_p,
511 (int (*) (void))
512 return_zero);
513 de_fault (to_async,
514 (void (*) (void (*) (enum inferior_event_type, void*), void*))
515 tcomplain);
c906108c
SS
516#undef de_fault
517}
518
519/* Go through the target stack from top to bottom, copying over zero entries in
520 current_target. In effect, we are doing class inheritance through the
521 pushed target vectors. */
522
523static void
fba45db2 524update_current_target (void)
c906108c
SS
525{
526 struct target_stack_item *item;
527 struct target_ops *t;
528
529 /* First, reset current_target */
530 memset (&current_target, 0, sizeof current_target);
531
532 for (item = target_stack; item; item = item->next)
533 {
534 t = item->target_ops;
535
536#define INHERIT(FIELD, TARGET) \
537 if (!current_target.FIELD) \
538 current_target.FIELD = TARGET->FIELD
539
540 INHERIT (to_shortname, t);
541 INHERIT (to_longname, t);
542 INHERIT (to_doc, t);
543 INHERIT (to_open, t);
544 INHERIT (to_close, t);
545 INHERIT (to_attach, t);
546 INHERIT (to_post_attach, t);
547 INHERIT (to_require_attach, t);
548 INHERIT (to_detach, t);
549 INHERIT (to_require_detach, t);
550 INHERIT (to_resume, t);
551 INHERIT (to_wait, t);
552 INHERIT (to_post_wait, t);
553 INHERIT (to_fetch_registers, t);
554 INHERIT (to_store_registers, t);
555 INHERIT (to_prepare_to_store, t);
556 INHERIT (to_xfer_memory, t);
557 INHERIT (to_files_info, t);
558 INHERIT (to_insert_breakpoint, t);
559 INHERIT (to_remove_breakpoint, t);
560 INHERIT (to_terminal_init, t);
561 INHERIT (to_terminal_inferior, t);
562 INHERIT (to_terminal_ours_for_output, t);
563 INHERIT (to_terminal_ours, t);
564 INHERIT (to_terminal_info, t);
565 INHERIT (to_kill, t);
566 INHERIT (to_load, t);
567 INHERIT (to_lookup_symbol, t);
568 INHERIT (to_create_inferior, t);
569 INHERIT (to_post_startup_inferior, t);
570 INHERIT (to_acknowledge_created_inferior, t);
571 INHERIT (to_clone_and_follow_inferior, t);
572 INHERIT (to_post_follow_inferior_by_clone, t);
573 INHERIT (to_insert_fork_catchpoint, t);
574 INHERIT (to_remove_fork_catchpoint, t);
575 INHERIT (to_insert_vfork_catchpoint, t);
576 INHERIT (to_remove_vfork_catchpoint, t);
577 INHERIT (to_has_forked, t);
578 INHERIT (to_has_vforked, t);
579 INHERIT (to_can_follow_vfork_prior_to_exec, t);
580 INHERIT (to_post_follow_vfork, t);
581 INHERIT (to_insert_exec_catchpoint, t);
582 INHERIT (to_remove_exec_catchpoint, t);
583 INHERIT (to_has_execd, t);
584 INHERIT (to_reported_exec_events_per_exec_call, t);
585 INHERIT (to_has_syscall_event, t);
586 INHERIT (to_has_exited, t);
587 INHERIT (to_mourn_inferior, t);
588 INHERIT (to_can_run, t);
589 INHERIT (to_notice_signals, t);
590 INHERIT (to_thread_alive, t);
b83266a0 591 INHERIT (to_find_new_threads, t);
ed9a39eb 592 INHERIT (to_pid_to_str, t);
0d06e24b 593 INHERIT (to_extra_thread_info, t);
c906108c
SS
594 INHERIT (to_stop, t);
595 INHERIT (to_query, t);
96baa820 596 INHERIT (to_rcmd, t);
c906108c
SS
597 INHERIT (to_enable_exception_callback, t);
598 INHERIT (to_get_current_exception_event, t);
599 INHERIT (to_pid_to_exec_file, t);
600 INHERIT (to_core_file_to_sym_file, t);
601 INHERIT (to_stratum, t);
602 INHERIT (DONT_USE, t);
603 INHERIT (to_has_all_memory, t);
604 INHERIT (to_has_memory, t);
605 INHERIT (to_has_stack, t);
606 INHERIT (to_has_registers, t);
607 INHERIT (to_has_execution, t);
608 INHERIT (to_has_thread_control, t);
609 INHERIT (to_sections, t);
610 INHERIT (to_sections_end, t);
6426a772
JM
611 INHERIT (to_can_async_p, t);
612 INHERIT (to_is_async_p, t);
613 INHERIT (to_async, t);
ed9a39eb 614 INHERIT (to_async_mask_value, t);
c906108c
SS
615 INHERIT (to_magic, t);
616
617#undef INHERIT
618 }
619}
620
621/* Push a new target type into the stack of the existing target accessors,
622 possibly superseding some of the existing accessors.
623
624 Result is zero if the pushed target ended up on top of the stack,
625 nonzero if at least one target is on top of it.
626
627 Rather than allow an empty stack, we always have the dummy target at
628 the bottom stratum, so we can call the function vectors without
629 checking them. */
630
631int
fba45db2 632push_target (struct target_ops *t)
c906108c
SS
633{
634 struct target_stack_item *cur, *prev, *tmp;
635
636 /* Check magic number. If wrong, it probably means someone changed
637 the struct definition, but not all the places that initialize one. */
638 if (t->to_magic != OPS_MAGIC)
639 {
c5aa993b
JM
640 fprintf_unfiltered (gdb_stderr,
641 "Magic number of %s target struct wrong\n",
642 t->to_shortname);
643 abort ();
c906108c
SS
644 }
645
646 /* Find the proper stratum to install this target in. */
647
648 for (prev = NULL, cur = target_stack; cur; prev = cur, cur = cur->next)
649 {
c5aa993b 650 if ((int) (t->to_stratum) >= (int) (cur->target_ops->to_stratum))
c906108c
SS
651 break;
652 }
653
654 /* If there's already targets at this stratum, remove them. */
655
656 if (cur)
657 while (t->to_stratum == cur->target_ops->to_stratum)
658 {
659 /* There's already something on this stratum. Close it off. */
660 if (cur->target_ops->to_close)
661 (cur->target_ops->to_close) (0);
662 if (prev)
c5aa993b 663 prev->next = cur->next; /* Unchain old target_ops */
c906108c 664 else
c5aa993b 665 target_stack = cur->next; /* Unchain first on list */
c906108c 666 tmp = cur->next;
b8c9b27d 667 xfree (cur);
c906108c
SS
668 cur = tmp;
669 }
670
671 /* We have removed all targets in our stratum, now add the new one. */
672
673 tmp = (struct target_stack_item *)
674 xmalloc (sizeof (struct target_stack_item));
675 tmp->next = cur;
676 tmp->target_ops = t;
677
678 if (prev)
679 prev->next = tmp;
680 else
681 target_stack = tmp;
682
683 update_current_target ();
684
c5aa993b 685 cleanup_target (&current_target); /* Fill in the gaps */
c906108c 686
c906108c
SS
687 if (targetdebug)
688 setup_target_debug ();
c906108c
SS
689
690 return prev != 0;
691}
692
693/* Remove a target_ops vector from the stack, wherever it may be.
694 Return how many times it was removed (0 or 1). */
695
696int
fba45db2 697unpush_target (struct target_ops *t)
c906108c
SS
698{
699 struct target_stack_item *cur, *prev;
700
701 if (t->to_close)
702 t->to_close (0); /* Let it clean up */
703
704 /* Look for the specified target. Note that we assume that a target
705 can only occur once in the target stack. */
706
707 for (cur = target_stack, prev = NULL; cur; prev = cur, cur = cur->next)
708 if (cur->target_ops == t)
709 break;
710
711 if (!cur)
712 return 0; /* Didn't find target_ops, quit now */
713
714 /* Unchain the target */
715
716 if (!prev)
717 target_stack = cur->next;
718 else
719 prev->next = cur->next;
720
b8c9b27d 721 xfree (cur); /* Release the target_stack_item */
c906108c
SS
722
723 update_current_target ();
724 cleanup_target (&current_target);
725
726 return 1;
727}
728
729void
fba45db2 730pop_target (void)
c906108c 731{
c5aa993b 732 (current_target.to_close) (0); /* Let it clean up */
c906108c
SS
733 if (unpush_target (target_stack->target_ops) == 1)
734 return;
735
c5aa993b
JM
736 fprintf_unfiltered (gdb_stderr,
737 "pop_target couldn't find target %s\n",
738 current_target.to_shortname);
739 abort ();
c906108c
SS
740}
741
742#undef MIN
743#define MIN(A, B) (((A) <= (B)) ? (A) : (B))
744
745/* target_read_string -- read a null terminated string, up to LEN bytes,
746 from MEMADDR in target. Set *ERRNOP to the errno code, or 0 if successful.
747 Set *STRING to a pointer to malloc'd memory containing the data; the caller
748 is responsible for freeing it. Return the number of bytes successfully
749 read. */
750
751int
fba45db2 752target_read_string (CORE_ADDR memaddr, char **string, int len, int *errnop)
c906108c
SS
753{
754 int tlen, origlen, offset, i;
755 char buf[4];
756 int errcode = 0;
757 char *buffer;
758 int buffer_allocated;
759 char *bufptr;
760 unsigned int nbytes_read = 0;
761
762 /* Small for testing. */
763 buffer_allocated = 4;
764 buffer = xmalloc (buffer_allocated);
765 bufptr = buffer;
766
767 origlen = len;
768
769 while (len > 0)
770 {
771 tlen = MIN (len, 4 - (memaddr & 3));
772 offset = memaddr & 3;
773
d4b2399a 774 errcode = target_xfer_memory (memaddr & ~3, buf, 4, 0);
c906108c
SS
775 if (errcode != 0)
776 {
777 /* The transfer request might have crossed the boundary to an
778 unallocated region of memory. Retry the transfer, requesting
779 a single byte. */
780 tlen = 1;
781 offset = 0;
d4b2399a 782 errcode = target_xfer_memory (memaddr, buf, 1, 0);
c906108c
SS
783 if (errcode != 0)
784 goto done;
785 }
786
787 if (bufptr - buffer + tlen > buffer_allocated)
788 {
789 unsigned int bytes;
790 bytes = bufptr - buffer;
791 buffer_allocated *= 2;
792 buffer = xrealloc (buffer, buffer_allocated);
793 bufptr = buffer + bytes;
794 }
795
796 for (i = 0; i < tlen; i++)
797 {
798 *bufptr++ = buf[i + offset];
799 if (buf[i + offset] == '\000')
800 {
801 nbytes_read += i + 1;
802 goto done;
803 }
804 }
805
806 memaddr += tlen;
807 len -= tlen;
808 nbytes_read += tlen;
809 }
c5aa993b 810done:
c906108c
SS
811 if (errnop != NULL)
812 *errnop = errcode;
813 if (string != NULL)
814 *string = buffer;
815 return nbytes_read;
816}
817
818/* Read LEN bytes of target memory at address MEMADDR, placing the results in
819 GDB's memory at MYADDR. Returns either 0 for success or an errno value
820 if any error occurs.
821
822 If an error occurs, no guarantee is made about the contents of the data at
823 MYADDR. In particular, the caller should not depend upon partial reads
824 filling the buffer with good data. There is no way for the caller to know
825 how much good data might have been transfered anyway. Callers that can
826 deal with partial reads should call target_read_memory_partial. */
827
828int
fba45db2 829target_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
c906108c 830{
d4b2399a 831 return target_xfer_memory (memaddr, myaddr, len, 0);
c906108c
SS
832}
833
c906108c 834int
fba45db2 835target_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
c906108c 836{
d4b2399a 837 return target_xfer_memory (memaddr, myaddr, len, 1);
c906108c 838}
c5aa993b 839
67e0617e
C
840/* Move memory to or from the targets. The top target gets priority;
841 if it cannot handle it, it is offered to the next one down, etc.
c906108c 842
67e0617e 843 Result is -1 on error, or the number of bytes transfered. */
c906108c 844
4930751a
C
845int
846do_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write)
c906108c 847{
c906108c 848 int res;
4930751a 849 int done = 0;
c906108c
SS
850 struct target_ops *t;
851 struct target_stack_item *item;
852
853 /* Zero length requests are ok and require no work. */
854 if (len == 0)
855 return 0;
856
c906108c
SS
857 /* to_xfer_memory is not guaranteed to set errno, even when it returns
858 0. */
859 errno = 0;
860
67e0617e 861 /* The quick case is that the top target can handle the transfer. */
c906108c 862 res = current_target.to_xfer_memory
c5aa993b 863 (memaddr, myaddr, len, write, &current_target);
c906108c 864
67e0617e
C
865 /* If res <= 0 then we call it again in the loop. Ah well. */
866 if (res <= 0)
c906108c 867 {
c906108c
SS
868 for (item = target_stack; item; item = item->next)
869 {
870 t = item->target_ops;
871 if (!t->to_has_memory)
872 continue;
873
4930751a 874 res = t->to_xfer_memory (memaddr, myaddr, len, write, t);
c906108c
SS
875 if (res > 0)
876 break; /* Handled all or part of xfer */
877 if (t->to_has_all_memory)
878 break;
879 }
880
4930751a 881 if (res <= 0)
67e0617e 882 return -1;
4930751a 883 }
67e0617e
C
884
885 return res;
4930751a
C
886}
887
67e0617e
C
888
889/* Perform a memory transfer. Iterate until the entire region has
890 been transfered.
891
892 Result is 0 or errno value. */
893
4930751a
C
894static int
895target_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write)
896{
897 int res;
898
899 /* Zero length requests are ok and require no work. */
900 if (len == 0)
901 {
902 return 0;
903 }
904
905 while (len > 0)
906 {
907 res = dcache_xfer_memory(target_dcache, memaddr, myaddr, len, write);
c906108c
SS
908 if (res <= 0)
909 {
910 /* If this address is for nonexistent memory,
911 read zeros if reading, or do nothing if writing. Return error. */
912 if (!write)
913 memset (myaddr, 0, len);
914 if (errno == 0)
915 return EIO;
916 else
917 return errno;
918 }
4930751a 919
c906108c 920 memaddr += res;
4930751a
C
921 myaddr += res;
922 len -= res;
c906108c 923 }
4930751a 924
c906108c
SS
925 return 0; /* We managed to cover it all somehow. */
926}
927
928
67e0617e
C
929/* Perform a partial memory transfer.
930
931 Result is -1 on error, or the number of bytes transfered. */
917317f4
JM
932
933static int
4930751a 934target_xfer_memory_partial (CORE_ADDR memaddr, char *myaddr, int len,
917317f4
JM
935 int write_p, int *err)
936{
937 int res;
917317f4
JM
938
939 /* Zero length requests are ok and require no work. */
940 if (len == 0)
941 {
942 *err = 0;
943 return 0;
944 }
945
4930751a
C
946 res = dcache_xfer_memory (target_dcache, memaddr, myaddr, len, write_p);
947 if (res <= 0)
917317f4 948 {
4930751a
C
949 if (errno != 0)
950 *err = errno;
951 else
952 *err = EIO;
917317f4 953
4930751a 954 return -1;
917317f4
JM
955 }
956
4930751a 957 *err = 0;
67e0617e 958 return res;
917317f4
JM
959}
960
961int
962target_read_memory_partial (CORE_ADDR memaddr, char *buf, int len, int *err)
963{
964 return target_xfer_memory_partial (memaddr, buf, len, 0, err);
965}
966
967int
968target_write_memory_partial (CORE_ADDR memaddr, char *buf, int len, int *err)
969{
970 return target_xfer_memory_partial (memaddr, buf, len, 1, err);
971}
972
c906108c
SS
973/* ARGSUSED */
974static void
fba45db2 975target_info (char *args, int from_tty)
c906108c
SS
976{
977 struct target_ops *t;
978 struct target_stack_item *item;
979 int has_all_mem = 0;
c5aa993b 980
c906108c
SS
981 if (symfile_objfile != NULL)
982 printf_unfiltered ("Symbols from \"%s\".\n", symfile_objfile->name);
983
984#ifdef FILES_INFO_HOOK
985 if (FILES_INFO_HOOK ())
986 return;
987#endif
988
989 for (item = target_stack; item; item = item->next)
990 {
991 t = item->target_ops;
992
993 if (!t->to_has_memory)
994 continue;
995
c5aa993b 996 if ((int) (t->to_stratum) <= (int) dummy_stratum)
c906108c
SS
997 continue;
998 if (has_all_mem)
c5aa993b
JM
999 printf_unfiltered ("\tWhile running this, GDB does not access memory from...\n");
1000 printf_unfiltered ("%s:\n", t->to_longname);
1001 (t->to_files_info) (t);
c906108c
SS
1002 has_all_mem = t->to_has_all_memory;
1003 }
1004}
1005
1006/* This is to be called by the open routine before it does
1007 anything. */
1008
1009void
fba45db2 1010target_preopen (int from_tty)
c906108c 1011{
c5aa993b 1012 dont_repeat ();
c906108c
SS
1013
1014 if (target_has_execution)
c5aa993b 1015 {
adf40b2e
JM
1016 if (!from_tty
1017 || query ("A program is being debugged already. Kill it? "))
c5aa993b 1018 target_kill ();
c906108c 1019 else
c5aa993b 1020 error ("Program not killed.");
c906108c
SS
1021 }
1022
1023 /* Calling target_kill may remove the target from the stack. But if
1024 it doesn't (which seems like a win for UDI), remove it now. */
1025
1026 if (target_has_execution)
1027 pop_target ();
1028}
1029
1030/* Detach a target after doing deferred register stores. */
1031
1032void
fba45db2 1033target_detach (char *args, int from_tty)
c906108c
SS
1034{
1035 /* Handle any optimized stores to the inferior. */
1036#ifdef DO_DEFERRED_STORES
1037 DO_DEFERRED_STORES;
1038#endif
1039 (current_target.to_detach) (args, from_tty);
1040}
1041
1042void
fba45db2 1043target_link (char *modname, CORE_ADDR *t_reloc)
c906108c 1044{
c5aa993b 1045 if (STREQ (current_target.to_shortname, "rombug"))
c906108c
SS
1046 {
1047 (current_target.to_lookup_symbol) (modname, t_reloc);
1048 if (*t_reloc == 0)
c5aa993b 1049 error ("Unable to link to %s and get relocation in rombug", modname);
c906108c
SS
1050 }
1051 else
2acceee2 1052 *t_reloc = (CORE_ADDR) -1;
c906108c
SS
1053}
1054
ed9a39eb
JM
1055int
1056target_async_mask (int mask)
1057{
1058 int saved_async_masked_status = target_async_mask_value;
1059 target_async_mask_value = mask;
1060 return saved_async_masked_status;
1061}
1062
c906108c
SS
1063/* Look through the list of possible targets for a target that can
1064 execute a run or attach command without any other data. This is
1065 used to locate the default process stratum.
1066
1067 Result is always valid (error() is called for errors). */
1068
1069static struct target_ops *
fba45db2 1070find_default_run_target (char *do_mesg)
c906108c
SS
1071{
1072 struct target_ops **t;
1073 struct target_ops *runable = NULL;
1074 int count;
1075
1076 count = 0;
1077
1078 for (t = target_structs; t < target_structs + target_struct_size;
1079 ++t)
1080 {
c5aa993b 1081 if ((*t)->to_can_run && target_can_run (*t))
c906108c
SS
1082 {
1083 runable = *t;
1084 ++count;
1085 }
1086 }
1087
1088 if (count != 1)
1089 error ("Don't know how to %s. Try \"help target\".", do_mesg);
1090
1091 return runable;
1092}
1093
1094void
fba45db2 1095find_default_attach (char *args, int from_tty)
c906108c
SS
1096{
1097 struct target_ops *t;
1098
c5aa993b 1099 t = find_default_run_target ("attach");
c906108c
SS
1100 (t->to_attach) (args, from_tty);
1101 return;
1102}
1103
1104void
fba45db2 1105find_default_require_attach (char *args, int from_tty)
c906108c
SS
1106{
1107 struct target_ops *t;
1108
c5aa993b 1109 t = find_default_run_target ("require_attach");
c906108c
SS
1110 (t->to_require_attach) (args, from_tty);
1111 return;
1112}
1113
1114void
fba45db2 1115find_default_require_detach (int pid, char *args, int from_tty)
c906108c
SS
1116{
1117 struct target_ops *t;
1118
c5aa993b 1119 t = find_default_run_target ("require_detach");
c906108c
SS
1120 (t->to_require_detach) (pid, args, from_tty);
1121 return;
1122}
1123
1124void
fba45db2 1125find_default_create_inferior (char *exec_file, char *allargs, char **env)
c906108c
SS
1126{
1127 struct target_ops *t;
1128
c5aa993b 1129 t = find_default_run_target ("run");
c906108c
SS
1130 (t->to_create_inferior) (exec_file, allargs, env);
1131 return;
1132}
1133
1134void
fba45db2 1135find_default_clone_and_follow_inferior (int child_pid, int *followed_child)
c906108c
SS
1136{
1137 struct target_ops *t;
1138
c5aa993b 1139 t = find_default_run_target ("run");
c906108c
SS
1140 (t->to_clone_and_follow_inferior) (child_pid, followed_child);
1141 return;
1142}
1143
1144static int
fba45db2 1145return_zero (void)
c906108c
SS
1146{
1147 return 0;
1148}
1149
1150static int
fba45db2 1151return_one (void)
c906108c
SS
1152{
1153 return 1;
1154}
1155
6426a772
JM
1156/*
1157 * Resize the to_sections pointer. Also make sure that anyone that
1158 * was holding on to an old value of it gets updated.
1159 * Returns the old size.
1160 */
1161
1162int
1163target_resize_to_sections (struct target_ops *target, int num_added)
1164{
1165 struct target_ops **t;
1166 struct section_table *old_value;
1167 int old_count;
1168
1169 old_value = target->to_sections;
1170
1171 if (target->to_sections)
1172 {
1173 old_count = target->to_sections_end - target->to_sections;
1174 target->to_sections = (struct section_table *)
1175 xrealloc ((char *) target->to_sections,
1176 (sizeof (struct section_table)) * (num_added + old_count));
1177 }
1178 else
1179 {
1180 old_count = 0;
1181 target->to_sections = (struct section_table *)
1182 xmalloc ((sizeof (struct section_table)) * num_added);
1183 }
1184 target->to_sections_end = target->to_sections + (num_added + old_count);
1185
1186 /* Check to see if anyone else was pointing to this structure.
1187 If old_value was null, then no one was. */
1188
1189 if (old_value)
1190 {
1191 for (t = target_structs; t < target_structs + target_struct_size;
1192 ++t)
1193 {
1194 if ((*t)->to_sections == old_value)
1195 {
1196 (*t)->to_sections = target->to_sections;
1197 (*t)->to_sections_end = target->to_sections_end;
1198 }
1199 }
1200 }
1201
1202 return old_count;
1203
1204}
1205
07cd4b97
JB
1206/* Remove all target sections taken from ABFD.
1207
1208 Scan the current target stack for targets whose section tables
1209 refer to sections from BFD, and remove those sections. We use this
1210 when we notice that the inferior has unloaded a shared object, for
1211 example. */
1212void
1213remove_target_sections (bfd *abfd)
1214{
1215 struct target_ops **t;
1216
1217 for (t = target_structs; t < target_structs + target_struct_size; t++)
1218 {
1219 struct section_table *src, *dest;
1220
1221 dest = (*t)->to_sections;
1222 for (src = (*t)->to_sections; src < (*t)->to_sections_end; src++)
1223 if (src->bfd != abfd)
1224 {
1225 /* Keep this section. */
1226 if (dest < src) *dest = *src;
1227 dest++;
1228 }
1229
1230 /* If we've dropped any sections, resize the section table. */
1231 if (dest < src)
1232 target_resize_to_sections (*t, dest - src);
1233 }
1234}
1235
1236
1237
1238
7a292a7a
SS
1239/* Find a single runnable target in the stack and return it. If for
1240 some reason there is more than one, return NULL. */
1241
1242struct target_ops *
fba45db2 1243find_run_target (void)
7a292a7a
SS
1244{
1245 struct target_ops **t;
1246 struct target_ops *runable = NULL;
1247 int count;
c5aa993b 1248
7a292a7a 1249 count = 0;
c5aa993b 1250
7a292a7a
SS
1251 for (t = target_structs; t < target_structs + target_struct_size; ++t)
1252 {
c5aa993b 1253 if ((*t)->to_can_run && target_can_run (*t))
7a292a7a
SS
1254 {
1255 runable = *t;
1256 ++count;
1257 }
1258 }
c5aa993b 1259
7a292a7a
SS
1260 return (count == 1 ? runable : NULL);
1261}
1262
ed9a39eb
JM
1263/* Find a single core_stratum target in the list of targets and return it.
1264 If for some reason there is more than one, return NULL. */
1265
c906108c 1266struct target_ops *
fba45db2 1267find_core_target (void)
c906108c
SS
1268{
1269 struct target_ops **t;
1270 struct target_ops *runable = NULL;
1271 int count;
c5aa993b 1272
c906108c 1273 count = 0;
c5aa993b 1274
c906108c
SS
1275 for (t = target_structs; t < target_structs + target_struct_size;
1276 ++t)
1277 {
1278 if ((*t)->to_stratum == core_stratum)
1279 {
1280 runable = *t;
1281 ++count;
1282 }
1283 }
c5aa993b
JM
1284
1285 return (count == 1 ? runable : NULL);
c906108c 1286}
ed9a39eb
JM
1287
1288/*
1289 * Find the next target down the stack from the specified target.
1290 */
1291
1292struct target_ops *
fba45db2 1293find_target_beneath (struct target_ops *t)
ed9a39eb
JM
1294{
1295 struct target_stack_item *cur;
1296
1297 for (cur = target_stack; cur; cur = cur->next)
1298 if (cur->target_ops == t)
1299 break;
1300
1301 if (cur == NULL || cur->next == NULL)
1302 return NULL;
1303 else
1304 return cur->next->target_ops;
1305}
1306
c906108c
SS
1307\f
1308/* The inferior process has died. Long live the inferior! */
1309
1310void
fba45db2 1311generic_mourn_inferior (void)
c906108c
SS
1312{
1313 extern int show_breakpoint_hit_counts;
1314
1315 inferior_pid = 0;
1316 attach_flag = 0;
1317 breakpoint_init_inferior (inf_exited);
1318 registers_changed ();
1319
1320#ifdef CLEAR_DEFERRED_STORES
1321 /* Delete any pending stores to the inferior... */
1322 CLEAR_DEFERRED_STORES;
1323#endif
1324
1325 reopen_exec_file ();
1326 reinit_frame_cache ();
1327
1328 /* It is confusing to the user for ignore counts to stick around
1329 from previous runs of the inferior. So clear them. */
1330 /* However, it is more confusing for the ignore counts to disappear when
1331 using hit counts. So don't clear them if we're counting hits. */
1332 if (!show_breakpoint_hit_counts)
1333 breakpoint_clear_ignore_counts ();
c5b739b5
FN
1334
1335 if (detach_hook)
1336 detach_hook ();
c906108c
SS
1337}
1338\f
1339/* This table must match in order and size the signals in enum target_signal
1340 in target.h. */
9846de1b 1341/* *INDENT-OFF* */
c906108c
SS
1342static struct {
1343 char *name;
1344 char *string;
1345 } signals [] =
1346{
1347 {"0", "Signal 0"},
1348 {"SIGHUP", "Hangup"},
1349 {"SIGINT", "Interrupt"},
1350 {"SIGQUIT", "Quit"},
1351 {"SIGILL", "Illegal instruction"},
1352 {"SIGTRAP", "Trace/breakpoint trap"},
1353 {"SIGABRT", "Aborted"},
1354 {"SIGEMT", "Emulation trap"},
1355 {"SIGFPE", "Arithmetic exception"},
1356 {"SIGKILL", "Killed"},
1357 {"SIGBUS", "Bus error"},
1358 {"SIGSEGV", "Segmentation fault"},
1359 {"SIGSYS", "Bad system call"},
1360 {"SIGPIPE", "Broken pipe"},
1361 {"SIGALRM", "Alarm clock"},
1362 {"SIGTERM", "Terminated"},
1363 {"SIGURG", "Urgent I/O condition"},
1364 {"SIGSTOP", "Stopped (signal)"},
1365 {"SIGTSTP", "Stopped (user)"},
1366 {"SIGCONT", "Continued"},
1367 {"SIGCHLD", "Child status changed"},
1368 {"SIGTTIN", "Stopped (tty input)"},
1369 {"SIGTTOU", "Stopped (tty output)"},
1370 {"SIGIO", "I/O possible"},
1371 {"SIGXCPU", "CPU time limit exceeded"},
1372 {"SIGXFSZ", "File size limit exceeded"},
1373 {"SIGVTALRM", "Virtual timer expired"},
1374 {"SIGPROF", "Profiling timer expired"},
1375 {"SIGWINCH", "Window size changed"},
1376 {"SIGLOST", "Resource lost"},
1377 {"SIGUSR1", "User defined signal 1"},
1378 {"SIGUSR2", "User defined signal 2"},
1379 {"SIGPWR", "Power fail/restart"},
1380 {"SIGPOLL", "Pollable event occurred"},
1381 {"SIGWIND", "SIGWIND"},
1382 {"SIGPHONE", "SIGPHONE"},
1383 {"SIGWAITING", "Process's LWPs are blocked"},
1384 {"SIGLWP", "Signal LWP"},
1385 {"SIGDANGER", "Swap space dangerously low"},
1386 {"SIGGRANT", "Monitor mode granted"},
1387 {"SIGRETRACT", "Need to relinquish monitor mode"},
1388 {"SIGMSG", "Monitor mode data available"},
1389 {"SIGSOUND", "Sound completed"},
1390 {"SIGSAK", "Secure attention"},
1391 {"SIGPRIO", "SIGPRIO"},
1392 {"SIG33", "Real-time event 33"},
1393 {"SIG34", "Real-time event 34"},
1394 {"SIG35", "Real-time event 35"},
1395 {"SIG36", "Real-time event 36"},
1396 {"SIG37", "Real-time event 37"},
1397 {"SIG38", "Real-time event 38"},
1398 {"SIG39", "Real-time event 39"},
1399 {"SIG40", "Real-time event 40"},
1400 {"SIG41", "Real-time event 41"},
1401 {"SIG42", "Real-time event 42"},
1402 {"SIG43", "Real-time event 43"},
1403 {"SIG44", "Real-time event 44"},
1404 {"SIG45", "Real-time event 45"},
1405 {"SIG46", "Real-time event 46"},
1406 {"SIG47", "Real-time event 47"},
1407 {"SIG48", "Real-time event 48"},
1408 {"SIG49", "Real-time event 49"},
1409 {"SIG50", "Real-time event 50"},
1410 {"SIG51", "Real-time event 51"},
1411 {"SIG52", "Real-time event 52"},
1412 {"SIG53", "Real-time event 53"},
1413 {"SIG54", "Real-time event 54"},
1414 {"SIG55", "Real-time event 55"},
1415 {"SIG56", "Real-time event 56"},
1416 {"SIG57", "Real-time event 57"},
1417 {"SIG58", "Real-time event 58"},
1418 {"SIG59", "Real-time event 59"},
1419 {"SIG60", "Real-time event 60"},
1420 {"SIG61", "Real-time event 61"},
1421 {"SIG62", "Real-time event 62"},
1422 {"SIG63", "Real-time event 63"},
cd0fc7c3 1423 {"SIGCANCEL", "LWP internal signal"},
d4f3574e 1424 {"SIG32", "Real-time event 32"},
d57fc352 1425 {"SIG64", "Real-time event 64"},
c906108c
SS
1426
1427#if defined(MACH) || defined(__MACH__)
1428 /* Mach exceptions */
1429 {"EXC_BAD_ACCESS", "Could not access memory"},
1430 {"EXC_BAD_INSTRUCTION", "Illegal instruction/operand"},
1431 {"EXC_ARITHMETIC", "Arithmetic exception"},
1432 {"EXC_EMULATION", "Emulation instruction"},
1433 {"EXC_SOFTWARE", "Software generated exception"},
1434 {"EXC_BREAKPOINT", "Breakpoint"},
1435#endif
7a292a7a
SS
1436 {"SIGINFO", "Information request"},
1437
c906108c
SS
1438 {NULL, "Unknown signal"},
1439 {NULL, "Internal error: printing TARGET_SIGNAL_DEFAULT"},
1440
1441 /* Last entry, used to check whether the table is the right size. */
1442 {NULL, "TARGET_SIGNAL_MAGIC"}
1443};
9846de1b 1444/* *INDENT-ON* */
c906108c 1445
c5aa993b
JM
1446
1447
c906108c
SS
1448/* Return the string for a signal. */
1449char *
fba45db2 1450target_signal_to_string (enum target_signal sig)
c906108c 1451{
7a292a7a
SS
1452 if ((sig >= TARGET_SIGNAL_FIRST) && (sig <= TARGET_SIGNAL_LAST))
1453 return signals[sig].string;
1454 else
1455 return signals[TARGET_SIGNAL_UNKNOWN].string;
c906108c
SS
1456}
1457
1458/* Return the name for a signal. */
1459char *
fba45db2 1460target_signal_to_name (enum target_signal sig)
c906108c
SS
1461{
1462 if (sig == TARGET_SIGNAL_UNKNOWN)
1463 /* I think the code which prints this will always print it along with
1464 the string, so no need to be verbose. */
1465 return "?";
1466 return signals[sig].name;
1467}
1468
1469/* Given a name, return its signal. */
1470enum target_signal
fba45db2 1471target_signal_from_name (char *name)
c906108c
SS
1472{
1473 enum target_signal sig;
1474
1475 /* It's possible we also should allow "SIGCLD" as well as "SIGCHLD"
1476 for TARGET_SIGNAL_SIGCHLD. SIGIOT, on the other hand, is more
1477 questionable; seems like by now people should call it SIGABRT
1478 instead. */
1479
1480 /* This ugly cast brought to you by the native VAX compiler. */
1481 for (sig = TARGET_SIGNAL_HUP;
1482 signals[sig].name != NULL;
c5aa993b 1483 sig = (enum target_signal) ((int) sig + 1))
c906108c
SS
1484 if (STREQ (name, signals[sig].name))
1485 return sig;
1486 return TARGET_SIGNAL_UNKNOWN;
1487}
1488\f
1489/* The following functions are to help certain targets deal
1490 with the signal/waitstatus stuff. They could just as well be in
1491 a file called native-utils.c or unixwaitstatus-utils.c or whatever. */
1492
1493/* Convert host signal to our signals. */
1494enum target_signal
fba45db2 1495target_signal_from_host (int hostsig)
c906108c
SS
1496{
1497 /* A switch statement would make sense but would require special kludges
1498 to deal with the cases where more than one signal has the same number. */
1499
c5aa993b
JM
1500 if (hostsig == 0)
1501 return TARGET_SIGNAL_0;
c906108c
SS
1502
1503#if defined (SIGHUP)
c5aa993b
JM
1504 if (hostsig == SIGHUP)
1505 return TARGET_SIGNAL_HUP;
c906108c
SS
1506#endif
1507#if defined (SIGINT)
c5aa993b
JM
1508 if (hostsig == SIGINT)
1509 return TARGET_SIGNAL_INT;
c906108c
SS
1510#endif
1511#if defined (SIGQUIT)
c5aa993b
JM
1512 if (hostsig == SIGQUIT)
1513 return TARGET_SIGNAL_QUIT;
c906108c
SS
1514#endif
1515#if defined (SIGILL)
c5aa993b
JM
1516 if (hostsig == SIGILL)
1517 return TARGET_SIGNAL_ILL;
c906108c
SS
1518#endif
1519#if defined (SIGTRAP)
c5aa993b
JM
1520 if (hostsig == SIGTRAP)
1521 return TARGET_SIGNAL_TRAP;
c906108c
SS
1522#endif
1523#if defined (SIGABRT)
c5aa993b
JM
1524 if (hostsig == SIGABRT)
1525 return TARGET_SIGNAL_ABRT;
c906108c
SS
1526#endif
1527#if defined (SIGEMT)
c5aa993b
JM
1528 if (hostsig == SIGEMT)
1529 return TARGET_SIGNAL_EMT;
c906108c
SS
1530#endif
1531#if defined (SIGFPE)
c5aa993b
JM
1532 if (hostsig == SIGFPE)
1533 return TARGET_SIGNAL_FPE;
c906108c
SS
1534#endif
1535#if defined (SIGKILL)
c5aa993b
JM
1536 if (hostsig == SIGKILL)
1537 return TARGET_SIGNAL_KILL;
c906108c
SS
1538#endif
1539#if defined (SIGBUS)
c5aa993b
JM
1540 if (hostsig == SIGBUS)
1541 return TARGET_SIGNAL_BUS;
c906108c
SS
1542#endif
1543#if defined (SIGSEGV)
c5aa993b
JM
1544 if (hostsig == SIGSEGV)
1545 return TARGET_SIGNAL_SEGV;
c906108c
SS
1546#endif
1547#if defined (SIGSYS)
c5aa993b
JM
1548 if (hostsig == SIGSYS)
1549 return TARGET_SIGNAL_SYS;
c906108c
SS
1550#endif
1551#if defined (SIGPIPE)
c5aa993b
JM
1552 if (hostsig == SIGPIPE)
1553 return TARGET_SIGNAL_PIPE;
c906108c
SS
1554#endif
1555#if defined (SIGALRM)
c5aa993b
JM
1556 if (hostsig == SIGALRM)
1557 return TARGET_SIGNAL_ALRM;
c906108c
SS
1558#endif
1559#if defined (SIGTERM)
c5aa993b
JM
1560 if (hostsig == SIGTERM)
1561 return TARGET_SIGNAL_TERM;
c906108c
SS
1562#endif
1563#if defined (SIGUSR1)
c5aa993b
JM
1564 if (hostsig == SIGUSR1)
1565 return TARGET_SIGNAL_USR1;
c906108c
SS
1566#endif
1567#if defined (SIGUSR2)
c5aa993b
JM
1568 if (hostsig == SIGUSR2)
1569 return TARGET_SIGNAL_USR2;
c906108c
SS
1570#endif
1571#if defined (SIGCLD)
c5aa993b
JM
1572 if (hostsig == SIGCLD)
1573 return TARGET_SIGNAL_CHLD;
c906108c
SS
1574#endif
1575#if defined (SIGCHLD)
c5aa993b
JM
1576 if (hostsig == SIGCHLD)
1577 return TARGET_SIGNAL_CHLD;
c906108c
SS
1578#endif
1579#if defined (SIGPWR)
c5aa993b
JM
1580 if (hostsig == SIGPWR)
1581 return TARGET_SIGNAL_PWR;
c906108c
SS
1582#endif
1583#if defined (SIGWINCH)
c5aa993b
JM
1584 if (hostsig == SIGWINCH)
1585 return TARGET_SIGNAL_WINCH;
c906108c
SS
1586#endif
1587#if defined (SIGURG)
c5aa993b
JM
1588 if (hostsig == SIGURG)
1589 return TARGET_SIGNAL_URG;
c906108c
SS
1590#endif
1591#if defined (SIGIO)
c5aa993b
JM
1592 if (hostsig == SIGIO)
1593 return TARGET_SIGNAL_IO;
c906108c
SS
1594#endif
1595#if defined (SIGPOLL)
c5aa993b
JM
1596 if (hostsig == SIGPOLL)
1597 return TARGET_SIGNAL_POLL;
c906108c
SS
1598#endif
1599#if defined (SIGSTOP)
c5aa993b
JM
1600 if (hostsig == SIGSTOP)
1601 return TARGET_SIGNAL_STOP;
c906108c
SS
1602#endif
1603#if defined (SIGTSTP)
c5aa993b
JM
1604 if (hostsig == SIGTSTP)
1605 return TARGET_SIGNAL_TSTP;
c906108c
SS
1606#endif
1607#if defined (SIGCONT)
c5aa993b
JM
1608 if (hostsig == SIGCONT)
1609 return TARGET_SIGNAL_CONT;
c906108c
SS
1610#endif
1611#if defined (SIGTTIN)
c5aa993b
JM
1612 if (hostsig == SIGTTIN)
1613 return TARGET_SIGNAL_TTIN;
c906108c
SS
1614#endif
1615#if defined (SIGTTOU)
c5aa993b
JM
1616 if (hostsig == SIGTTOU)
1617 return TARGET_SIGNAL_TTOU;
c906108c
SS
1618#endif
1619#if defined (SIGVTALRM)
c5aa993b
JM
1620 if (hostsig == SIGVTALRM)
1621 return TARGET_SIGNAL_VTALRM;
c906108c
SS
1622#endif
1623#if defined (SIGPROF)
c5aa993b
JM
1624 if (hostsig == SIGPROF)
1625 return TARGET_SIGNAL_PROF;
c906108c
SS
1626#endif
1627#if defined (SIGXCPU)
c5aa993b
JM
1628 if (hostsig == SIGXCPU)
1629 return TARGET_SIGNAL_XCPU;
c906108c
SS
1630#endif
1631#if defined (SIGXFSZ)
c5aa993b
JM
1632 if (hostsig == SIGXFSZ)
1633 return TARGET_SIGNAL_XFSZ;
c906108c
SS
1634#endif
1635#if defined (SIGWIND)
c5aa993b
JM
1636 if (hostsig == SIGWIND)
1637 return TARGET_SIGNAL_WIND;
c906108c
SS
1638#endif
1639#if defined (SIGPHONE)
c5aa993b
JM
1640 if (hostsig == SIGPHONE)
1641 return TARGET_SIGNAL_PHONE;
c906108c
SS
1642#endif
1643#if defined (SIGLOST)
c5aa993b
JM
1644 if (hostsig == SIGLOST)
1645 return TARGET_SIGNAL_LOST;
c906108c
SS
1646#endif
1647#if defined (SIGWAITING)
c5aa993b
JM
1648 if (hostsig == SIGWAITING)
1649 return TARGET_SIGNAL_WAITING;
c906108c 1650#endif
cd0fc7c3 1651#if defined (SIGCANCEL)
c5aa993b
JM
1652 if (hostsig == SIGCANCEL)
1653 return TARGET_SIGNAL_CANCEL;
cd0fc7c3 1654#endif
c906108c 1655#if defined (SIGLWP)
c5aa993b
JM
1656 if (hostsig == SIGLWP)
1657 return TARGET_SIGNAL_LWP;
c906108c
SS
1658#endif
1659#if defined (SIGDANGER)
c5aa993b
JM
1660 if (hostsig == SIGDANGER)
1661 return TARGET_SIGNAL_DANGER;
c906108c
SS
1662#endif
1663#if defined (SIGGRANT)
c5aa993b
JM
1664 if (hostsig == SIGGRANT)
1665 return TARGET_SIGNAL_GRANT;
c906108c
SS
1666#endif
1667#if defined (SIGRETRACT)
c5aa993b
JM
1668 if (hostsig == SIGRETRACT)
1669 return TARGET_SIGNAL_RETRACT;
c906108c
SS
1670#endif
1671#if defined (SIGMSG)
c5aa993b
JM
1672 if (hostsig == SIGMSG)
1673 return TARGET_SIGNAL_MSG;
c906108c
SS
1674#endif
1675#if defined (SIGSOUND)
c5aa993b
JM
1676 if (hostsig == SIGSOUND)
1677 return TARGET_SIGNAL_SOUND;
c906108c
SS
1678#endif
1679#if defined (SIGSAK)
c5aa993b
JM
1680 if (hostsig == SIGSAK)
1681 return TARGET_SIGNAL_SAK;
c906108c
SS
1682#endif
1683#if defined (SIGPRIO)
c5aa993b
JM
1684 if (hostsig == SIGPRIO)
1685 return TARGET_SIGNAL_PRIO;
c906108c
SS
1686#endif
1687
1688 /* Mach exceptions. Assumes that the values for EXC_ are positive! */
1689#if defined (EXC_BAD_ACCESS) && defined (_NSIG)
c5aa993b
JM
1690 if (hostsig == _NSIG + EXC_BAD_ACCESS)
1691 return TARGET_EXC_BAD_ACCESS;
c906108c
SS
1692#endif
1693#if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG)
c5aa993b
JM
1694 if (hostsig == _NSIG + EXC_BAD_INSTRUCTION)
1695 return TARGET_EXC_BAD_INSTRUCTION;
c906108c
SS
1696#endif
1697#if defined (EXC_ARITHMETIC) && defined (_NSIG)
c5aa993b
JM
1698 if (hostsig == _NSIG + EXC_ARITHMETIC)
1699 return TARGET_EXC_ARITHMETIC;
c906108c
SS
1700#endif
1701#if defined (EXC_EMULATION) && defined (_NSIG)
c5aa993b
JM
1702 if (hostsig == _NSIG + EXC_EMULATION)
1703 return TARGET_EXC_EMULATION;
c906108c
SS
1704#endif
1705#if defined (EXC_SOFTWARE) && defined (_NSIG)
c5aa993b
JM
1706 if (hostsig == _NSIG + EXC_SOFTWARE)
1707 return TARGET_EXC_SOFTWARE;
c906108c
SS
1708#endif
1709#if defined (EXC_BREAKPOINT) && defined (_NSIG)
c5aa993b
JM
1710 if (hostsig == _NSIG + EXC_BREAKPOINT)
1711 return TARGET_EXC_BREAKPOINT;
c906108c
SS
1712#endif
1713
7a292a7a 1714#if defined (SIGINFO)
c5aa993b
JM
1715 if (hostsig == SIGINFO)
1716 return TARGET_SIGNAL_INFO;
7a292a7a
SS
1717#endif
1718
c906108c
SS
1719#if defined (REALTIME_LO)
1720 if (hostsig >= REALTIME_LO && hostsig < REALTIME_HI)
d4f3574e
SS
1721 {
1722 /* This block of TARGET_SIGNAL_REALTIME value is in order. */
1723 if (33 <= hostsig && hostsig <= 63)
1724 return (enum target_signal)
1725 (hostsig - 33 + (int) TARGET_SIGNAL_REALTIME_33);
1726 else if (hostsig == 32)
1727 return TARGET_SIGNAL_REALTIME_32;
1728 else
1729 error ("GDB bug: target.c (target_signal_from_host): unrecognized real-time signal");
1730 }
c906108c 1731#endif
5ef22741
PS
1732
1733#if defined (SIGRTMIN)
1734 if (hostsig >= SIGRTMIN && hostsig <= SIGRTMAX)
1735 {
1736 /* This block of TARGET_SIGNAL_REALTIME value is in order. */
1737 if (33 <= hostsig && hostsig <= 63)
1738 return (enum target_signal)
1739 (hostsig - 33 + (int) TARGET_SIGNAL_REALTIME_33);
d57fc352
PS
1740 else if (hostsig == 64)
1741 return TARGET_SIGNAL_REALTIME_64;
5ef22741
PS
1742 else
1743 error ("GDB bug: target.c (target_signal_from_host): unrecognized real-time signal");
1744 }
1745#endif
c906108c
SS
1746 return TARGET_SIGNAL_UNKNOWN;
1747}
1748
c2d11a7d
JM
1749/* Convert a OURSIG (an enum target_signal) to the form used by the
1750 target operating system (refered to as the ``host'') or zero if the
1751 equivalent host signal is not available. Set/clear OURSIG_OK
1752 accordingly. */
1753
1754static int
1755do_target_signal_to_host (enum target_signal oursig,
1756 int *oursig_ok)
c906108c 1757{
c2d11a7d 1758 *oursig_ok = 1;
c906108c
SS
1759 switch (oursig)
1760 {
c5aa993b
JM
1761 case TARGET_SIGNAL_0:
1762 return 0;
c906108c
SS
1763
1764#if defined (SIGHUP)
c5aa993b
JM
1765 case TARGET_SIGNAL_HUP:
1766 return SIGHUP;
c906108c
SS
1767#endif
1768#if defined (SIGINT)
c5aa993b
JM
1769 case TARGET_SIGNAL_INT:
1770 return SIGINT;
c906108c
SS
1771#endif
1772#if defined (SIGQUIT)
c5aa993b
JM
1773 case TARGET_SIGNAL_QUIT:
1774 return SIGQUIT;
c906108c
SS
1775#endif
1776#if defined (SIGILL)
c5aa993b
JM
1777 case TARGET_SIGNAL_ILL:
1778 return SIGILL;
c906108c
SS
1779#endif
1780#if defined (SIGTRAP)
c5aa993b
JM
1781 case TARGET_SIGNAL_TRAP:
1782 return SIGTRAP;
c906108c
SS
1783#endif
1784#if defined (SIGABRT)
c5aa993b
JM
1785 case TARGET_SIGNAL_ABRT:
1786 return SIGABRT;
c906108c
SS
1787#endif
1788#if defined (SIGEMT)
c5aa993b
JM
1789 case TARGET_SIGNAL_EMT:
1790 return SIGEMT;
c906108c
SS
1791#endif
1792#if defined (SIGFPE)
c5aa993b
JM
1793 case TARGET_SIGNAL_FPE:
1794 return SIGFPE;
c906108c
SS
1795#endif
1796#if defined (SIGKILL)
c5aa993b
JM
1797 case TARGET_SIGNAL_KILL:
1798 return SIGKILL;
c906108c
SS
1799#endif
1800#if defined (SIGBUS)
c5aa993b
JM
1801 case TARGET_SIGNAL_BUS:
1802 return SIGBUS;
c906108c
SS
1803#endif
1804#if defined (SIGSEGV)
c5aa993b
JM
1805 case TARGET_SIGNAL_SEGV:
1806 return SIGSEGV;
c906108c
SS
1807#endif
1808#if defined (SIGSYS)
c5aa993b
JM
1809 case TARGET_SIGNAL_SYS:
1810 return SIGSYS;
c906108c
SS
1811#endif
1812#if defined (SIGPIPE)
c5aa993b
JM
1813 case TARGET_SIGNAL_PIPE:
1814 return SIGPIPE;
c906108c
SS
1815#endif
1816#if defined (SIGALRM)
c5aa993b
JM
1817 case TARGET_SIGNAL_ALRM:
1818 return SIGALRM;
c906108c
SS
1819#endif
1820#if defined (SIGTERM)
c5aa993b
JM
1821 case TARGET_SIGNAL_TERM:
1822 return SIGTERM;
c906108c
SS
1823#endif
1824#if defined (SIGUSR1)
c5aa993b
JM
1825 case TARGET_SIGNAL_USR1:
1826 return SIGUSR1;
c906108c
SS
1827#endif
1828#if defined (SIGUSR2)
c5aa993b
JM
1829 case TARGET_SIGNAL_USR2:
1830 return SIGUSR2;
c906108c
SS
1831#endif
1832#if defined (SIGCHLD) || defined (SIGCLD)
c5aa993b 1833 case TARGET_SIGNAL_CHLD:
c906108c
SS
1834#if defined (SIGCHLD)
1835 return SIGCHLD;
1836#else
1837 return SIGCLD;
1838#endif
1839#endif /* SIGCLD or SIGCHLD */
1840#if defined (SIGPWR)
c5aa993b
JM
1841 case TARGET_SIGNAL_PWR:
1842 return SIGPWR;
c906108c
SS
1843#endif
1844#if defined (SIGWINCH)
c5aa993b
JM
1845 case TARGET_SIGNAL_WINCH:
1846 return SIGWINCH;
c906108c
SS
1847#endif
1848#if defined (SIGURG)
c5aa993b
JM
1849 case TARGET_SIGNAL_URG:
1850 return SIGURG;
c906108c
SS
1851#endif
1852#if defined (SIGIO)
c5aa993b
JM
1853 case TARGET_SIGNAL_IO:
1854 return SIGIO;
c906108c
SS
1855#endif
1856#if defined (SIGPOLL)
c5aa993b
JM
1857 case TARGET_SIGNAL_POLL:
1858 return SIGPOLL;
c906108c
SS
1859#endif
1860#if defined (SIGSTOP)
c5aa993b
JM
1861 case TARGET_SIGNAL_STOP:
1862 return SIGSTOP;
c906108c
SS
1863#endif
1864#if defined (SIGTSTP)
c5aa993b
JM
1865 case TARGET_SIGNAL_TSTP:
1866 return SIGTSTP;
c906108c
SS
1867#endif
1868#if defined (SIGCONT)
c5aa993b
JM
1869 case TARGET_SIGNAL_CONT:
1870 return SIGCONT;
c906108c
SS
1871#endif
1872#if defined (SIGTTIN)
c5aa993b
JM
1873 case TARGET_SIGNAL_TTIN:
1874 return SIGTTIN;
c906108c
SS
1875#endif
1876#if defined (SIGTTOU)
c5aa993b
JM
1877 case TARGET_SIGNAL_TTOU:
1878 return SIGTTOU;
c906108c
SS
1879#endif
1880#if defined (SIGVTALRM)
c5aa993b
JM
1881 case TARGET_SIGNAL_VTALRM:
1882 return SIGVTALRM;
c906108c
SS
1883#endif
1884#if defined (SIGPROF)
c5aa993b
JM
1885 case TARGET_SIGNAL_PROF:
1886 return SIGPROF;
c906108c
SS
1887#endif
1888#if defined (SIGXCPU)
c5aa993b
JM
1889 case TARGET_SIGNAL_XCPU:
1890 return SIGXCPU;
c906108c
SS
1891#endif
1892#if defined (SIGXFSZ)
c5aa993b
JM
1893 case TARGET_SIGNAL_XFSZ:
1894 return SIGXFSZ;
c906108c
SS
1895#endif
1896#if defined (SIGWIND)
c5aa993b
JM
1897 case TARGET_SIGNAL_WIND:
1898 return SIGWIND;
c906108c
SS
1899#endif
1900#if defined (SIGPHONE)
c5aa993b
JM
1901 case TARGET_SIGNAL_PHONE:
1902 return SIGPHONE;
c906108c
SS
1903#endif
1904#if defined (SIGLOST)
c5aa993b
JM
1905 case TARGET_SIGNAL_LOST:
1906 return SIGLOST;
c906108c
SS
1907#endif
1908#if defined (SIGWAITING)
c5aa993b
JM
1909 case TARGET_SIGNAL_WAITING:
1910 return SIGWAITING;
c906108c 1911#endif
cd0fc7c3 1912#if defined (SIGCANCEL)
c5aa993b
JM
1913 case TARGET_SIGNAL_CANCEL:
1914 return SIGCANCEL;
cd0fc7c3 1915#endif
c906108c 1916#if defined (SIGLWP)
c5aa993b
JM
1917 case TARGET_SIGNAL_LWP:
1918 return SIGLWP;
c906108c
SS
1919#endif
1920#if defined (SIGDANGER)
c5aa993b
JM
1921 case TARGET_SIGNAL_DANGER:
1922 return SIGDANGER;
c906108c
SS
1923#endif
1924#if defined (SIGGRANT)
c5aa993b
JM
1925 case TARGET_SIGNAL_GRANT:
1926 return SIGGRANT;
c906108c
SS
1927#endif
1928#if defined (SIGRETRACT)
c5aa993b
JM
1929 case TARGET_SIGNAL_RETRACT:
1930 return SIGRETRACT;
c906108c
SS
1931#endif
1932#if defined (SIGMSG)
c5aa993b
JM
1933 case TARGET_SIGNAL_MSG:
1934 return SIGMSG;
c906108c
SS
1935#endif
1936#if defined (SIGSOUND)
c5aa993b
JM
1937 case TARGET_SIGNAL_SOUND:
1938 return SIGSOUND;
c906108c
SS
1939#endif
1940#if defined (SIGSAK)
c5aa993b
JM
1941 case TARGET_SIGNAL_SAK:
1942 return SIGSAK;
c906108c
SS
1943#endif
1944#if defined (SIGPRIO)
c5aa993b
JM
1945 case TARGET_SIGNAL_PRIO:
1946 return SIGPRIO;
c906108c
SS
1947#endif
1948
1949 /* Mach exceptions. Assumes that the values for EXC_ are positive! */
1950#if defined (EXC_BAD_ACCESS) && defined (_NSIG)
c5aa993b
JM
1951 case TARGET_EXC_BAD_ACCESS:
1952 return _NSIG + EXC_BAD_ACCESS;
c906108c
SS
1953#endif
1954#if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG)
c5aa993b
JM
1955 case TARGET_EXC_BAD_INSTRUCTION:
1956 return _NSIG + EXC_BAD_INSTRUCTION;
c906108c
SS
1957#endif
1958#if defined (EXC_ARITHMETIC) && defined (_NSIG)
c5aa993b
JM
1959 case TARGET_EXC_ARITHMETIC:
1960 return _NSIG + EXC_ARITHMETIC;
c906108c
SS
1961#endif
1962#if defined (EXC_EMULATION) && defined (_NSIG)
c5aa993b
JM
1963 case TARGET_EXC_EMULATION:
1964 return _NSIG + EXC_EMULATION;
c906108c
SS
1965#endif
1966#if defined (EXC_SOFTWARE) && defined (_NSIG)
c5aa993b
JM
1967 case TARGET_EXC_SOFTWARE:
1968 return _NSIG + EXC_SOFTWARE;
c906108c
SS
1969#endif
1970#if defined (EXC_BREAKPOINT) && defined (_NSIG)
c5aa993b
JM
1971 case TARGET_EXC_BREAKPOINT:
1972 return _NSIG + EXC_BREAKPOINT;
c906108c
SS
1973#endif
1974
7a292a7a 1975#if defined (SIGINFO)
c5aa993b
JM
1976 case TARGET_SIGNAL_INFO:
1977 return SIGINFO;
7a292a7a
SS
1978#endif
1979
c906108c
SS
1980 default:
1981#if defined (REALTIME_LO)
1982 if (oursig >= TARGET_SIGNAL_REALTIME_33
1983 && oursig <= TARGET_SIGNAL_REALTIME_63)
1984 {
e95a43ad
MK
1985 /* This block of signals is continuous, and
1986 TARGET_SIGNAL_REALTIME_33 is 33 by definition. */
c906108c 1987 int retsig =
e95a43ad
MK
1988 (int) oursig - (int) TARGET_SIGNAL_REALTIME_33 + 33;
1989 if (retsig >= REALTIME_LO && retsig < REALTIME_HI)
c906108c
SS
1990 return retsig;
1991 }
e95a43ad
MK
1992#if (REALTIME_LO < 33)
1993 else if (oursig == TARGET_SIGNAL_REALTIME_32)
1994 {
1995 /* TARGET_SIGNAL_REALTIME_32 isn't contiguous with
1996 TARGET_SIGNAL_REALTIME_33. It is 32 by definition. */
1997 return 32;
1998 }
1999#endif
5ef22741
PS
2000#endif
2001
2002#if defined (SIGRTMIN)
2003 if (oursig >= TARGET_SIGNAL_REALTIME_33
2004 && oursig <= TARGET_SIGNAL_REALTIME_63)
2005 {
2006 /* This block of signals is continuous, and
2007 TARGET_SIGNAL_REALTIME_33 is 33 by definition. */
2008 int retsig =
2009 (int) oursig - (int) TARGET_SIGNAL_REALTIME_33 + 33;
2010 if (retsig >= SIGRTMIN && retsig <= SIGRTMAX)
2011 return retsig;
2012 }
d57fc352
PS
2013 else if (oursig == TARGET_SIGNAL_REALTIME_64)
2014 return 64;
c906108c 2015#endif
c2d11a7d
JM
2016 *oursig_ok = 0;
2017 return 0;
2018 }
2019}
2020
2021int
2022target_signal_to_host_p (enum target_signal oursig)
2023{
2024 int oursig_ok;
2025 do_target_signal_to_host (oursig, &oursig_ok);
2026 return oursig_ok;
2027}
2028
2029int
2030target_signal_to_host (enum target_signal oursig)
2031{
2032 int oursig_ok;
2033 int targ_signo = do_target_signal_to_host (oursig, &oursig_ok);
2034 if (!oursig_ok)
2035 {
c906108c 2036 /* The user might be trying to do "signal SIGSAK" where this system
c5aa993b 2037 doesn't have SIGSAK. */
c906108c
SS
2038 warning ("Signal %s does not exist on this system.\n",
2039 target_signal_to_name (oursig));
2040 return 0;
2041 }
c2d11a7d
JM
2042 else
2043 return targ_signo;
c906108c
SS
2044}
2045
2046/* Helper function for child_wait and the Lynx derivatives of child_wait.
2047 HOSTSTATUS is the waitstatus from wait() or the equivalent; store our
2048 translation of that in OURSTATUS. */
2049void
fba45db2 2050store_waitstatus (struct target_waitstatus *ourstatus, int hoststatus)
c906108c
SS
2051{
2052#ifdef CHILD_SPECIAL_WAITSTATUS
2053 /* CHILD_SPECIAL_WAITSTATUS should return nonzero and set *OURSTATUS
2054 if it wants to deal with hoststatus. */
2055 if (CHILD_SPECIAL_WAITSTATUS (ourstatus, hoststatus))
2056 return;
2057#endif
2058
2059 if (WIFEXITED (hoststatus))
2060 {
2061 ourstatus->kind = TARGET_WAITKIND_EXITED;
2062 ourstatus->value.integer = WEXITSTATUS (hoststatus);
2063 }
2064 else if (!WIFSTOPPED (hoststatus))
2065 {
2066 ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
2067 ourstatus->value.sig = target_signal_from_host (WTERMSIG (hoststatus));
2068 }
2069 else
2070 {
2071 ourstatus->kind = TARGET_WAITKIND_STOPPED;
2072 ourstatus->value.sig = target_signal_from_host (WSTOPSIG (hoststatus));
2073 }
2074}
2075\f
2076/* In some circumstances we allow a command to specify a numeric
2077 signal. The idea is to keep these circumstances limited so that
2078 users (and scripts) develop portable habits. For comparison,
2079 POSIX.2 `kill' requires that 1,2,3,6,9,14, and 15 work (and using a
7e73cedf 2080 numeric signal at all is obsolescent. We are slightly more
c906108c
SS
2081 lenient and allow 1-15 which should match host signal numbers on
2082 most systems. Use of symbolic signal names is strongly encouraged. */
2083
2084enum target_signal
fba45db2 2085target_signal_from_command (int num)
c906108c
SS
2086{
2087 if (num >= 1 && num <= 15)
c5aa993b 2088 return (enum target_signal) num;
c906108c
SS
2089 error ("Only signals 1-15 are valid as numeric signals.\n\
2090Use \"info signals\" for a list of symbolic signals.");
2091}
2092\f
2093/* Returns zero to leave the inferior alone, one to interrupt it. */
507f3c78 2094int (*target_activity_function) (void);
c906108c
SS
2095int target_activity_fd;
2096\f
2097/* Convert a normal process ID to a string. Returns the string in a static
2098 buffer. */
2099
2100char *
fba45db2 2101normal_pid_to_str (int pid)
c906108c
SS
2102{
2103 static char buf[30];
2104
2105 if (STREQ (current_target.to_shortname, "remote"))
104c1213 2106 sprintf (buf, "thread %d", pid);
c906108c 2107 else
104c1213 2108 sprintf (buf, "process %d", pid);
c906108c
SS
2109
2110 return buf;
2111}
2112
2113/* Some targets (such as ttrace-based HPUX) don't allow us to request
2114 notification of inferior events such as fork and vork immediately
2115 after the inferior is created. (This because of how gdb gets an
2116 inferior created via invoking a shell to do it. In such a scenario,
2117 if the shell init file has commands in it, the shell will fork and
2118 exec for each of those commands, and we will see each such fork
2119 event. Very bad.)
c5aa993b 2120
c906108c
SS
2121 This function is used by all targets that allow us to request
2122 notification of forks, etc at inferior creation time; e.g., in
2123 target_acknowledge_forked_child.
c5aa993b 2124 */
392a587b 2125static void
fba45db2 2126normal_target_post_startup_inferior (int pid)
c906108c
SS
2127{
2128 /* This space intentionally left blank. */
2129}
2130
2131/* Set up the handful of non-empty slots needed by the dummy target
2132 vector. */
2133
2134static void
fba45db2 2135init_dummy_target (void)
c906108c
SS
2136{
2137 dummy_target.to_shortname = "None";
2138 dummy_target.to_longname = "None";
2139 dummy_target.to_doc = "";
2140 dummy_target.to_attach = find_default_attach;
2141 dummy_target.to_require_attach = find_default_require_attach;
2142 dummy_target.to_require_detach = find_default_require_detach;
2143 dummy_target.to_create_inferior = find_default_create_inferior;
2144 dummy_target.to_clone_and_follow_inferior = find_default_clone_and_follow_inferior;
ed9a39eb 2145 dummy_target.to_pid_to_str = normal_pid_to_str;
c906108c
SS
2146 dummy_target.to_stratum = dummy_stratum;
2147 dummy_target.to_magic = OPS_MAGIC;
2148}
c906108c 2149\f
c5aa993b 2150
c906108c
SS
2151static struct target_ops debug_target;
2152
2153static void
fba45db2 2154debug_to_open (char *args, int from_tty)
c906108c
SS
2155{
2156 debug_target.to_open (args, from_tty);
2157
96baa820 2158 fprintf_unfiltered (gdb_stdlog, "target_open (%s, %d)\n", args, from_tty);
c906108c
SS
2159}
2160
2161static void
fba45db2 2162debug_to_close (int quitting)
c906108c
SS
2163{
2164 debug_target.to_close (quitting);
2165
96baa820 2166 fprintf_unfiltered (gdb_stdlog, "target_close (%d)\n", quitting);
c906108c
SS
2167}
2168
2169static void
fba45db2 2170debug_to_attach (char *args, int from_tty)
c906108c
SS
2171{
2172 debug_target.to_attach (args, from_tty);
2173
96baa820 2174 fprintf_unfiltered (gdb_stdlog, "target_attach (%s, %d)\n", args, from_tty);
c906108c
SS
2175}
2176
2177
2178static void
fba45db2 2179debug_to_post_attach (int pid)
c906108c
SS
2180{
2181 debug_target.to_post_attach (pid);
2182
96baa820 2183 fprintf_unfiltered (gdb_stdlog, "target_post_attach (%d)\n", pid);
c906108c
SS
2184}
2185
2186static void
fba45db2 2187debug_to_require_attach (char *args, int from_tty)
c906108c
SS
2188{
2189 debug_target.to_require_attach (args, from_tty);
2190
96baa820 2191 fprintf_unfiltered (gdb_stdlog,
c906108c
SS
2192 "target_require_attach (%s, %d)\n", args, from_tty);
2193}
2194
2195static void
fba45db2 2196debug_to_detach (char *args, int from_tty)
c906108c
SS
2197{
2198 debug_target.to_detach (args, from_tty);
2199
96baa820 2200 fprintf_unfiltered (gdb_stdlog, "target_detach (%s, %d)\n", args, from_tty);
c906108c
SS
2201}
2202
2203static void
fba45db2 2204debug_to_require_detach (int pid, char *args, int from_tty)
c906108c
SS
2205{
2206 debug_target.to_require_detach (pid, args, from_tty);
2207
96baa820 2208 fprintf_unfiltered (gdb_stdlog,
c5aa993b 2209 "target_require_detach (%d, %s, %d)\n", pid, args, from_tty);
c906108c
SS
2210}
2211
2212static void
fba45db2 2213debug_to_resume (int pid, int step, enum target_signal siggnal)
c906108c
SS
2214{
2215 debug_target.to_resume (pid, step, siggnal);
2216
96baa820 2217 fprintf_unfiltered (gdb_stdlog, "target_resume (%d, %s, %s)\n", pid,
c906108c
SS
2218 step ? "step" : "continue",
2219 target_signal_to_name (siggnal));
2220}
2221
2222static int
fba45db2 2223debug_to_wait (int pid, struct target_waitstatus *status)
c906108c
SS
2224{
2225 int retval;
2226
2227 retval = debug_target.to_wait (pid, status);
2228
96baa820 2229 fprintf_unfiltered (gdb_stdlog,
c906108c 2230 "target_wait (%d, status) = %d, ", pid, retval);
96baa820 2231 fprintf_unfiltered (gdb_stdlog, "status->kind = ");
c906108c
SS
2232 switch (status->kind)
2233 {
2234 case TARGET_WAITKIND_EXITED:
96baa820 2235 fprintf_unfiltered (gdb_stdlog, "exited, status = %d\n",
c906108c
SS
2236 status->value.integer);
2237 break;
2238 case TARGET_WAITKIND_STOPPED:
96baa820 2239 fprintf_unfiltered (gdb_stdlog, "stopped, signal = %s\n",
c906108c
SS
2240 target_signal_to_name (status->value.sig));
2241 break;
2242 case TARGET_WAITKIND_SIGNALLED:
96baa820 2243 fprintf_unfiltered (gdb_stdlog, "signalled, signal = %s\n",
c906108c
SS
2244 target_signal_to_name (status->value.sig));
2245 break;
2246 case TARGET_WAITKIND_LOADED:
96baa820 2247 fprintf_unfiltered (gdb_stdlog, "loaded\n");
c906108c
SS
2248 break;
2249 case TARGET_WAITKIND_FORKED:
96baa820 2250 fprintf_unfiltered (gdb_stdlog, "forked\n");
c906108c
SS
2251 break;
2252 case TARGET_WAITKIND_VFORKED:
96baa820 2253 fprintf_unfiltered (gdb_stdlog, "vforked\n");
c906108c
SS
2254 break;
2255 case TARGET_WAITKIND_EXECD:
96baa820 2256 fprintf_unfiltered (gdb_stdlog, "execd\n");
c906108c
SS
2257 break;
2258 case TARGET_WAITKIND_SPURIOUS:
96baa820 2259 fprintf_unfiltered (gdb_stdlog, "spurious\n");
c906108c
SS
2260 break;
2261 default:
96baa820 2262 fprintf_unfiltered (gdb_stdlog, "unknown???\n");
c906108c
SS
2263 break;
2264 }
2265
2266 return retval;
2267}
2268
2269static void
fba45db2 2270debug_to_post_wait (int pid, int status)
c906108c
SS
2271{
2272 debug_target.to_post_wait (pid, status);
2273
96baa820 2274 fprintf_unfiltered (gdb_stdlog, "target_post_wait (%d, %d)\n",
c906108c
SS
2275 pid, status);
2276}
2277
2278static void
fba45db2 2279debug_to_fetch_registers (int regno)
c906108c
SS
2280{
2281 debug_target.to_fetch_registers (regno);
2282
96baa820 2283 fprintf_unfiltered (gdb_stdlog, "target_fetch_registers (%s)",
c906108c
SS
2284 regno != -1 ? REGISTER_NAME (regno) : "-1");
2285 if (regno != -1)
104c1213 2286 fprintf_unfiltered (gdb_stdlog, " = 0x%lx %ld",
c906108c 2287 (unsigned long) read_register (regno),
104c1213 2288 (unsigned long) read_register (regno));
96baa820 2289 fprintf_unfiltered (gdb_stdlog, "\n");
c906108c
SS
2290}
2291
2292static void
fba45db2 2293debug_to_store_registers (int regno)
c906108c
SS
2294{
2295 debug_target.to_store_registers (regno);
2296
2297 if (regno >= 0 && regno < NUM_REGS)
104c1213 2298 fprintf_unfiltered (gdb_stdlog, "target_store_registers (%s) = 0x%lx %ld\n",
c906108c
SS
2299 REGISTER_NAME (regno),
2300 (unsigned long) read_register (regno),
2301 (unsigned long) read_register (regno));
2302 else
96baa820 2303 fprintf_unfiltered (gdb_stdlog, "target_store_registers (%d)\n", regno);
c906108c
SS
2304}
2305
2306static void
fba45db2 2307debug_to_prepare_to_store (void)
c906108c
SS
2308{
2309 debug_target.to_prepare_to_store ();
2310
96baa820 2311 fprintf_unfiltered (gdb_stdlog, "target_prepare_to_store ()\n");
c906108c
SS
2312}
2313
2314static int
fba45db2
KB
2315debug_to_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
2316 struct target_ops *target)
c906108c
SS
2317{
2318 int retval;
2319
2320 retval = debug_target.to_xfer_memory (memaddr, myaddr, len, write, target);
2321
96baa820 2322 fprintf_unfiltered (gdb_stdlog,
c906108c 2323 "target_xfer_memory (0x%x, xxx, %d, %s, xxx) = %d",
c5aa993b 2324 (unsigned int) memaddr, /* possable truncate long long */
c906108c
SS
2325 len, write ? "write" : "read", retval);
2326
c5aa993b 2327
c906108c
SS
2328
2329 if (retval > 0)
2330 {
2331 int i;
2332
96baa820 2333 fputs_unfiltered (", bytes =", gdb_stdlog);
c906108c
SS
2334 for (i = 0; i < retval; i++)
2335 {
2336 if ((((long) &(myaddr[i])) & 0xf) == 0)
96baa820
JM
2337 fprintf_unfiltered (gdb_stdlog, "\n");
2338 fprintf_unfiltered (gdb_stdlog, " %02x", myaddr[i] & 0xff);
c906108c
SS
2339 }
2340 }
2341
96baa820 2342 fputc_unfiltered ('\n', gdb_stdlog);
c906108c
SS
2343
2344 return retval;
2345}
2346
2347static void
fba45db2 2348debug_to_files_info (struct target_ops *target)
c906108c
SS
2349{
2350 debug_target.to_files_info (target);
2351
96baa820 2352 fprintf_unfiltered (gdb_stdlog, "target_files_info (xxx)\n");
c906108c
SS
2353}
2354
2355static int
fba45db2 2356debug_to_insert_breakpoint (CORE_ADDR addr, char *save)
c906108c
SS
2357{
2358 int retval;
2359
2360 retval = debug_target.to_insert_breakpoint (addr, save);
2361
96baa820 2362 fprintf_unfiltered (gdb_stdlog,
104c1213
JM
2363 "target_insert_breakpoint (0x%lx, xxx) = %ld\n",
2364 (unsigned long) addr,
2365 (unsigned long) retval);
c906108c
SS
2366 return retval;
2367}
2368
2369static int
fba45db2 2370debug_to_remove_breakpoint (CORE_ADDR addr, char *save)
c906108c
SS
2371{
2372 int retval;
2373
2374 retval = debug_target.to_remove_breakpoint (addr, save);
2375
96baa820 2376 fprintf_unfiltered (gdb_stdlog,
104c1213
JM
2377 "target_remove_breakpoint (0x%lx, xxx) = %ld\n",
2378 (unsigned long) addr,
2379 (unsigned long) retval);
c906108c
SS
2380 return retval;
2381}
2382
2383static void
fba45db2 2384debug_to_terminal_init (void)
c906108c
SS
2385{
2386 debug_target.to_terminal_init ();
2387
96baa820 2388 fprintf_unfiltered (gdb_stdlog, "target_terminal_init ()\n");
c906108c
SS
2389}
2390
2391static void
fba45db2 2392debug_to_terminal_inferior (void)
c906108c
SS
2393{
2394 debug_target.to_terminal_inferior ();
2395
96baa820 2396 fprintf_unfiltered (gdb_stdlog, "target_terminal_inferior ()\n");
c906108c
SS
2397}
2398
2399static void
fba45db2 2400debug_to_terminal_ours_for_output (void)
c906108c
SS
2401{
2402 debug_target.to_terminal_ours_for_output ();
2403
96baa820 2404 fprintf_unfiltered (gdb_stdlog, "target_terminal_ours_for_output ()\n");
c906108c
SS
2405}
2406
2407static void
fba45db2 2408debug_to_terminal_ours (void)
c906108c
SS
2409{
2410 debug_target.to_terminal_ours ();
2411
96baa820 2412 fprintf_unfiltered (gdb_stdlog, "target_terminal_ours ()\n");
c906108c
SS
2413}
2414
2415static void
fba45db2 2416debug_to_terminal_info (char *arg, int from_tty)
c906108c
SS
2417{
2418 debug_target.to_terminal_info (arg, from_tty);
2419
96baa820 2420 fprintf_unfiltered (gdb_stdlog, "target_terminal_info (%s, %d)\n", arg,
c906108c
SS
2421 from_tty);
2422}
2423
2424static void
fba45db2 2425debug_to_kill (void)
c906108c
SS
2426{
2427 debug_target.to_kill ();
2428
96baa820 2429 fprintf_unfiltered (gdb_stdlog, "target_kill ()\n");
c906108c
SS
2430}
2431
2432static void
fba45db2 2433debug_to_load (char *args, int from_tty)
c906108c
SS
2434{
2435 debug_target.to_load (args, from_tty);
2436
96baa820 2437 fprintf_unfiltered (gdb_stdlog, "target_load (%s, %d)\n", args, from_tty);
c906108c
SS
2438}
2439
2440static int
fba45db2 2441debug_to_lookup_symbol (char *name, CORE_ADDR *addrp)
c906108c
SS
2442{
2443 int retval;
2444
2445 retval = debug_target.to_lookup_symbol (name, addrp);
2446
96baa820 2447 fprintf_unfiltered (gdb_stdlog, "target_lookup_symbol (%s, xxx)\n", name);
c906108c
SS
2448
2449 return retval;
2450}
2451
2452static void
fba45db2 2453debug_to_create_inferior (char *exec_file, char *args, char **env)
c906108c
SS
2454{
2455 debug_target.to_create_inferior (exec_file, args, env);
2456
96baa820 2457 fprintf_unfiltered (gdb_stdlog, "target_create_inferior (%s, %s, xxx)\n",
c906108c
SS
2458 exec_file, args);
2459}
2460
2461static void
fba45db2 2462debug_to_post_startup_inferior (int pid)
c906108c
SS
2463{
2464 debug_target.to_post_startup_inferior (pid);
2465
96baa820 2466 fprintf_unfiltered (gdb_stdlog, "target_post_startup_inferior (%d)\n",
c906108c
SS
2467 pid);
2468}
2469
2470static void
fba45db2 2471debug_to_acknowledge_created_inferior (int pid)
c906108c
SS
2472{
2473 debug_target.to_acknowledge_created_inferior (pid);
2474
96baa820 2475 fprintf_unfiltered (gdb_stdlog, "target_acknowledge_created_inferior (%d)\n",
c906108c
SS
2476 pid);
2477}
2478
2479static void
fba45db2 2480debug_to_clone_and_follow_inferior (int child_pid, int *followed_child)
c906108c
SS
2481{
2482 debug_target.to_clone_and_follow_inferior (child_pid, followed_child);
2483
96baa820 2484 fprintf_unfiltered (gdb_stdlog,
c906108c
SS
2485 "target_clone_and_follow_inferior (%d, %d)\n",
2486 child_pid, *followed_child);
2487}
2488
2489static void
fba45db2 2490debug_to_post_follow_inferior_by_clone (void)
c906108c
SS
2491{
2492 debug_target.to_post_follow_inferior_by_clone ();
2493
96baa820 2494 fprintf_unfiltered (gdb_stdlog, "target_post_follow_inferior_by_clone ()\n");
c906108c
SS
2495}
2496
2497static int
fba45db2 2498debug_to_insert_fork_catchpoint (int pid)
c906108c 2499{
c5aa993b 2500 int retval;
c906108c
SS
2501
2502 retval = debug_target.to_insert_fork_catchpoint (pid);
2503
96baa820 2504 fprintf_unfiltered (gdb_stdlog, "target_insert_fork_catchpoint (%d) = %d\n",
c5aa993b 2505 pid, retval);
c906108c
SS
2506
2507 return retval;
2508}
2509
2510static int
fba45db2 2511debug_to_remove_fork_catchpoint (int pid)
c906108c 2512{
c5aa993b 2513 int retval;
c906108c
SS
2514
2515 retval = debug_target.to_remove_fork_catchpoint (pid);
2516
96baa820 2517 fprintf_unfiltered (gdb_stdlog, "target_remove_fork_catchpoint (%d) = %d\n",
c5aa993b 2518 pid, retval);
c906108c
SS
2519
2520 return retval;
2521}
2522
2523static int
fba45db2 2524debug_to_insert_vfork_catchpoint (int pid)
c906108c 2525{
c5aa993b 2526 int retval;
c906108c
SS
2527
2528 retval = debug_target.to_insert_vfork_catchpoint (pid);
2529
96baa820 2530 fprintf_unfiltered (gdb_stdlog, "target_insert_vfork_catchpoint (%d)= %d\n",
c5aa993b 2531 pid, retval);
c906108c
SS
2532
2533 return retval;
2534}
2535
2536static int
fba45db2 2537debug_to_remove_vfork_catchpoint (int pid)
c906108c 2538{
c5aa993b 2539 int retval;
c906108c
SS
2540
2541 retval = debug_target.to_remove_vfork_catchpoint (pid);
2542
96baa820 2543 fprintf_unfiltered (gdb_stdlog, "target_remove_vfork_catchpoint (%d) = %d\n",
c5aa993b 2544 pid, retval);
c906108c
SS
2545
2546 return retval;
2547}
2548
2549static int
fba45db2 2550debug_to_has_forked (int pid, int *child_pid)
c906108c 2551{
c5aa993b 2552 int has_forked;
c906108c
SS
2553
2554 has_forked = debug_target.to_has_forked (pid, child_pid);
2555
96baa820 2556 fprintf_unfiltered (gdb_stdlog, "target_has_forked (%d, %d) = %d\n",
c5aa993b 2557 pid, *child_pid, has_forked);
c906108c
SS
2558
2559 return has_forked;
2560}
2561
2562static int
fba45db2 2563debug_to_has_vforked (int pid, int *child_pid)
c906108c 2564{
c5aa993b 2565 int has_vforked;
c906108c
SS
2566
2567 has_vforked = debug_target.to_has_vforked (pid, child_pid);
2568
96baa820 2569 fprintf_unfiltered (gdb_stdlog, "target_has_vforked (%d, %d) = %d\n",
c5aa993b 2570 pid, *child_pid, has_vforked);
c906108c
SS
2571
2572 return has_vforked;
2573}
2574
2575static int
fba45db2 2576debug_to_can_follow_vfork_prior_to_exec (void)
c906108c 2577{
c5aa993b 2578 int can_immediately_follow_vfork;
c906108c
SS
2579
2580 can_immediately_follow_vfork = debug_target.to_can_follow_vfork_prior_to_exec ();
2581
96baa820 2582 fprintf_unfiltered (gdb_stdlog, "target_can_follow_vfork_prior_to_exec () = %d\n",
c5aa993b 2583 can_immediately_follow_vfork);
c906108c
SS
2584
2585 return can_immediately_follow_vfork;
2586}
2587
2588static void
fba45db2
KB
2589debug_to_post_follow_vfork (int parent_pid, int followed_parent, int child_pid,
2590 int followed_child)
c906108c
SS
2591{
2592 debug_target.to_post_follow_vfork (parent_pid, followed_parent, child_pid, followed_child);
2593
96baa820 2594 fprintf_unfiltered (gdb_stdlog,
c906108c 2595 "target_post_follow_vfork (%d, %d, %d, %d)\n",
c5aa993b 2596 parent_pid, followed_parent, child_pid, followed_child);
c906108c
SS
2597}
2598
2599static int
fba45db2 2600debug_to_insert_exec_catchpoint (int pid)
c906108c 2601{
c5aa993b 2602 int retval;
c906108c
SS
2603
2604 retval = debug_target.to_insert_exec_catchpoint (pid);
2605
96baa820 2606 fprintf_unfiltered (gdb_stdlog, "target_insert_exec_catchpoint (%d) = %d\n",
c5aa993b 2607 pid, retval);
c906108c
SS
2608
2609 return retval;
2610}
2611
2612static int
fba45db2 2613debug_to_remove_exec_catchpoint (int pid)
c906108c 2614{
c5aa993b 2615 int retval;
c906108c
SS
2616
2617 retval = debug_target.to_remove_exec_catchpoint (pid);
2618
96baa820 2619 fprintf_unfiltered (gdb_stdlog, "target_remove_exec_catchpoint (%d) = %d\n",
c5aa993b 2620 pid, retval);
c906108c
SS
2621
2622 return retval;
2623}
2624
2625static int
fba45db2 2626debug_to_has_execd (int pid, char **execd_pathname)
c906108c 2627{
c5aa993b 2628 int has_execd;
c906108c
SS
2629
2630 has_execd = debug_target.to_has_execd (pid, execd_pathname);
2631
96baa820 2632 fprintf_unfiltered (gdb_stdlog, "target_has_execd (%d, %s) = %d\n",
c5aa993b 2633 pid, (*execd_pathname ? *execd_pathname : "<NULL>"),
7a292a7a 2634 has_execd);
c906108c
SS
2635
2636 return has_execd;
2637}
2638
2639static int
fba45db2 2640debug_to_reported_exec_events_per_exec_call (void)
c906108c 2641{
c5aa993b 2642 int reported_exec_events;
c906108c
SS
2643
2644 reported_exec_events = debug_target.to_reported_exec_events_per_exec_call ();
2645
96baa820 2646 fprintf_unfiltered (gdb_stdlog,
c906108c 2647 "target_reported_exec_events_per_exec_call () = %d\n",
c5aa993b 2648 reported_exec_events);
c906108c
SS
2649
2650 return reported_exec_events;
2651}
2652
2653static int
fba45db2
KB
2654debug_to_has_syscall_event (int pid, enum target_waitkind *kind,
2655 int *syscall_id)
c906108c 2656{
c5aa993b
JM
2657 int has_syscall_event;
2658 char *kind_spelling = "??";
c906108c
SS
2659
2660 has_syscall_event = debug_target.to_has_syscall_event (pid, kind, syscall_id);
2661 if (has_syscall_event)
2662 {
2663 switch (*kind)
c5aa993b
JM
2664 {
2665 case TARGET_WAITKIND_SYSCALL_ENTRY:
2666 kind_spelling = "SYSCALL_ENTRY";
2667 break;
2668 case TARGET_WAITKIND_SYSCALL_RETURN:
2669 kind_spelling = "SYSCALL_RETURN";
2670 break;
2671 default:
2672 break;
2673 }
c906108c
SS
2674 }
2675
96baa820 2676 fprintf_unfiltered (gdb_stdlog,
c906108c 2677 "target_has_syscall_event (%d, %s, %d) = %d\n",
c5aa993b 2678 pid, kind_spelling, *syscall_id, has_syscall_event);
c906108c
SS
2679
2680 return has_syscall_event;
2681}
2682
2683static int
fba45db2 2684debug_to_has_exited (int pid, int wait_status, int *exit_status)
c906108c 2685{
c5aa993b 2686 int has_exited;
c906108c
SS
2687
2688 has_exited = debug_target.to_has_exited (pid, wait_status, exit_status);
2689
96baa820 2690 fprintf_unfiltered (gdb_stdlog, "target_has_exited (%d, %d, %d) = %d\n",
c5aa993b 2691 pid, wait_status, *exit_status, has_exited);
c906108c
SS
2692
2693 return has_exited;
2694}
2695
2696static void
fba45db2 2697debug_to_mourn_inferior (void)
c906108c
SS
2698{
2699 debug_target.to_mourn_inferior ();
2700
96baa820 2701 fprintf_unfiltered (gdb_stdlog, "target_mourn_inferior ()\n");
c906108c
SS
2702}
2703
2704static int
fba45db2 2705debug_to_can_run (void)
c906108c
SS
2706{
2707 int retval;
2708
2709 retval = debug_target.to_can_run ();
2710
96baa820 2711 fprintf_unfiltered (gdb_stdlog, "target_can_run () = %d\n", retval);
c906108c
SS
2712
2713 return retval;
2714}
2715
2716static void
fba45db2 2717debug_to_notice_signals (int pid)
c906108c
SS
2718{
2719 debug_target.to_notice_signals (pid);
2720
96baa820 2721 fprintf_unfiltered (gdb_stdlog, "target_notice_signals (%d)\n", pid);
c906108c
SS
2722}
2723
2724static int
fba45db2 2725debug_to_thread_alive (int pid)
c906108c
SS
2726{
2727 int retval;
2728
2729 retval = debug_target.to_thread_alive (pid);
2730
96baa820 2731 fprintf_unfiltered (gdb_stdlog, "target_thread_alive (%d) = %d\n",
c906108c
SS
2732 pid, retval);
2733
2734 return retval;
2735}
2736
0d06e24b 2737static void
fba45db2 2738debug_to_find_new_threads (void)
0d06e24b
JM
2739{
2740 debug_target.to_find_new_threads ();
2741
2742 fputs_unfiltered ("target_find_new_threads ()\n", gdb_stdlog);
2743}
2744
c906108c 2745static void
fba45db2 2746debug_to_stop (void)
c906108c
SS
2747{
2748 debug_target.to_stop ();
2749
96baa820 2750 fprintf_unfiltered (gdb_stdlog, "target_stop ()\n");
c906108c
SS
2751}
2752
2753static int
fba45db2 2754debug_to_query (int type, char *req, char *resp, int *siz)
c906108c
SS
2755{
2756 int retval;
2757
2758 retval = debug_target.to_query (type, req, resp, siz);
2759
96baa820 2760 fprintf_unfiltered (gdb_stdlog, "target_query (%c, %s, %s, %d) = %d\n", type, req, resp, *siz, retval);
c906108c
SS
2761
2762 return retval;
2763}
2764
96baa820
JM
2765static void
2766debug_to_rcmd (char *command,
d9fcf2fb 2767 struct ui_file *outbuf)
96baa820
JM
2768{
2769 debug_target.to_rcmd (command, outbuf);
2770 fprintf_unfiltered (gdb_stdlog, "target_rcmd (%s, ...)\n", command);
2771}
2772
c906108c 2773static struct symtab_and_line *
fba45db2 2774debug_to_enable_exception_callback (enum exception_event_kind kind, int enable)
c906108c 2775{
7a292a7a
SS
2776 struct symtab_and_line *result;
2777 result = debug_target.to_enable_exception_callback (kind, enable);
96baa820 2778 fprintf_unfiltered (gdb_stdlog,
c906108c
SS
2779 "target get_exception_callback_sal (%d, %d)\n",
2780 kind, enable);
7a292a7a 2781 return result;
c906108c
SS
2782}
2783
2784static struct exception_event_record *
fba45db2 2785debug_to_get_current_exception_event (void)
c906108c 2786{
7a292a7a 2787 struct exception_event_record *result;
c5aa993b 2788 result = debug_target.to_get_current_exception_event ();
96baa820 2789 fprintf_unfiltered (gdb_stdlog, "target get_current_exception_event ()\n");
7a292a7a 2790 return result;
c906108c
SS
2791}
2792
2793static char *
fba45db2 2794debug_to_pid_to_exec_file (int pid)
c906108c 2795{
c5aa993b 2796 char *exec_file;
c906108c
SS
2797
2798 exec_file = debug_target.to_pid_to_exec_file (pid);
2799
96baa820 2800 fprintf_unfiltered (gdb_stdlog, "target_pid_to_exec_file (%d) = %s\n",
c5aa993b 2801 pid, exec_file);
c906108c
SS
2802
2803 return exec_file;
2804}
2805
2806static char *
fba45db2 2807debug_to_core_file_to_sym_file (char *core)
c906108c 2808{
c5aa993b 2809 char *sym_file;
c906108c
SS
2810
2811 sym_file = debug_target.to_core_file_to_sym_file (core);
2812
96baa820 2813 fprintf_unfiltered (gdb_stdlog, "target_core_file_to_sym_file (%s) = %s\n",
c5aa993b 2814 core, sym_file);
c906108c
SS
2815
2816 return sym_file;
2817}
2818
2819static void
fba45db2 2820setup_target_debug (void)
c906108c
SS
2821{
2822 memcpy (&debug_target, &current_target, sizeof debug_target);
2823
2824 current_target.to_open = debug_to_open;
2825 current_target.to_close = debug_to_close;
2826 current_target.to_attach = debug_to_attach;
2827 current_target.to_post_attach = debug_to_post_attach;
2828 current_target.to_require_attach = debug_to_require_attach;
2829 current_target.to_detach = debug_to_detach;
2830 current_target.to_require_detach = debug_to_require_detach;
2831 current_target.to_resume = debug_to_resume;
2832 current_target.to_wait = debug_to_wait;
2833 current_target.to_post_wait = debug_to_post_wait;
2834 current_target.to_fetch_registers = debug_to_fetch_registers;
2835 current_target.to_store_registers = debug_to_store_registers;
2836 current_target.to_prepare_to_store = debug_to_prepare_to_store;
2837 current_target.to_xfer_memory = debug_to_xfer_memory;
2838 current_target.to_files_info = debug_to_files_info;
2839 current_target.to_insert_breakpoint = debug_to_insert_breakpoint;
2840 current_target.to_remove_breakpoint = debug_to_remove_breakpoint;
2841 current_target.to_terminal_init = debug_to_terminal_init;
2842 current_target.to_terminal_inferior = debug_to_terminal_inferior;
2843 current_target.to_terminal_ours_for_output = debug_to_terminal_ours_for_output;
2844 current_target.to_terminal_ours = debug_to_terminal_ours;
2845 current_target.to_terminal_info = debug_to_terminal_info;
2846 current_target.to_kill = debug_to_kill;
2847 current_target.to_load = debug_to_load;
2848 current_target.to_lookup_symbol = debug_to_lookup_symbol;
2849 current_target.to_create_inferior = debug_to_create_inferior;
2850 current_target.to_post_startup_inferior = debug_to_post_startup_inferior;
2851 current_target.to_acknowledge_created_inferior = debug_to_acknowledge_created_inferior;
2852 current_target.to_clone_and_follow_inferior = debug_to_clone_and_follow_inferior;
2853 current_target.to_post_follow_inferior_by_clone = debug_to_post_follow_inferior_by_clone;
2854 current_target.to_insert_fork_catchpoint = debug_to_insert_fork_catchpoint;
2855 current_target.to_remove_fork_catchpoint = debug_to_remove_fork_catchpoint;
2856 current_target.to_insert_vfork_catchpoint = debug_to_insert_vfork_catchpoint;
2857 current_target.to_remove_vfork_catchpoint = debug_to_remove_vfork_catchpoint;
2858 current_target.to_has_forked = debug_to_has_forked;
2859 current_target.to_has_vforked = debug_to_has_vforked;
2860 current_target.to_can_follow_vfork_prior_to_exec = debug_to_can_follow_vfork_prior_to_exec;
2861 current_target.to_post_follow_vfork = debug_to_post_follow_vfork;
2862 current_target.to_insert_exec_catchpoint = debug_to_insert_exec_catchpoint;
2863 current_target.to_remove_exec_catchpoint = debug_to_remove_exec_catchpoint;
2864 current_target.to_has_execd = debug_to_has_execd;
2865 current_target.to_reported_exec_events_per_exec_call = debug_to_reported_exec_events_per_exec_call;
2866 current_target.to_has_syscall_event = debug_to_has_syscall_event;
2867 current_target.to_has_exited = debug_to_has_exited;
2868 current_target.to_mourn_inferior = debug_to_mourn_inferior;
2869 current_target.to_can_run = debug_to_can_run;
2870 current_target.to_notice_signals = debug_to_notice_signals;
2871 current_target.to_thread_alive = debug_to_thread_alive;
0d06e24b 2872 current_target.to_find_new_threads = debug_to_find_new_threads;
c906108c
SS
2873 current_target.to_stop = debug_to_stop;
2874 current_target.to_query = debug_to_query;
96baa820 2875 current_target.to_rcmd = debug_to_rcmd;
c906108c
SS
2876 current_target.to_enable_exception_callback = debug_to_enable_exception_callback;
2877 current_target.to_get_current_exception_event = debug_to_get_current_exception_event;
2878 current_target.to_pid_to_exec_file = debug_to_pid_to_exec_file;
2879 current_target.to_core_file_to_sym_file = debug_to_core_file_to_sym_file;
2880
2881}
c906108c 2882\f
c5aa993b
JM
2883
2884static char targ_desc[] =
2885"Names of targets and files being debugged.\n\
c906108c
SS
2886Shows the entire stack of targets currently in use (including the exec-file,\n\
2887core-file, and process, if any), as well as the symbol file name.";
2888
96baa820
JM
2889static void
2890do_monitor_command (char *cmd,
2891 int from_tty)
2892{
2b5fe715
AC
2893 if ((current_target.to_rcmd
2894 == (void (*) (char *, struct ui_file *)) tcomplain)
96baa820 2895 || (current_target.to_rcmd == debug_to_rcmd
2b5fe715
AC
2896 && (debug_target.to_rcmd
2897 == (void (*) (char *, struct ui_file *)) tcomplain)))
96baa820
JM
2898 {
2899 error ("\"monitor\" command not supported by this target.\n");
2900 }
2901 target_rcmd (cmd, gdb_stdtarg);
2902}
2903
c906108c 2904void
fba45db2 2905initialize_targets (void)
c906108c
SS
2906{
2907 init_dummy_target ();
2908 push_target (&dummy_target);
2909
2910 add_info ("target", target_info, targ_desc);
2911 add_info ("files", target_info, targ_desc);
2912
c906108c 2913 add_show_from_set (
5d161b24 2914 add_set_cmd ("target", class_maintenance, var_zinteger,
c5aa993b
JM
2915 (char *) &targetdebug,
2916 "Set target debugging.\n\
5d161b24
DB
2917When non-zero, target debugging is enabled.", &setdebuglist),
2918 &showdebuglist);
c906108c 2919
96baa820
JM
2920
2921 add_com ("monitor", class_obscure, do_monitor_command,
2922 "Send a command to the remote monitor (remote targets only).");
2923
4930751a
C
2924 target_dcache = dcache_init();
2925
c906108c
SS
2926 if (!STREQ (signals[TARGET_SIGNAL_LAST].string, "TARGET_SIGNAL_MAGIC"))
2927 abort ();
2928}
This page took 0.225533 seconds and 4 git commands to generate.