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