xref: /openbsd-src/gnu/usr.bin/binutils/gdb/target.c (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
1e93f7393Sniklas /* Select target systems and architectures at runtime for GDB.
2b725ae77Skettenis 
3b725ae77Skettenis    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
4b725ae77Skettenis    1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
5b725ae77Skettenis 
6e93f7393Sniklas    Contributed by Cygnus Support.
7e93f7393Sniklas 
8e93f7393Sniklas    This file is part of GDB.
9e93f7393Sniklas 
10e93f7393Sniklas    This program is free software; you can redistribute it and/or modify
11e93f7393Sniklas    it under the terms of the GNU General Public License as published by
12e93f7393Sniklas    the Free Software Foundation; either version 2 of the License, or
13e93f7393Sniklas    (at your option) any later version.
14e93f7393Sniklas 
15e93f7393Sniklas    This program is distributed in the hope that it will be useful,
16e93f7393Sniklas    but WITHOUT ANY WARRANTY; without even the implied warranty of
17e93f7393Sniklas    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18e93f7393Sniklas    GNU General Public License for more details.
19e93f7393Sniklas 
20e93f7393Sniklas    You should have received a copy of the GNU General Public License
21e93f7393Sniklas    along with this program; if not, write to the Free Software
22b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330,
23b725ae77Skettenis    Boston, MA 02111-1307, USA.  */
24e93f7393Sniklas 
25e93f7393Sniklas #include "defs.h"
26e93f7393Sniklas #include <errno.h>
27e93f7393Sniklas #include "gdb_string.h"
28e93f7393Sniklas #include "target.h"
29e93f7393Sniklas #include "gdbcmd.h"
30e93f7393Sniklas #include "symtab.h"
31e93f7393Sniklas #include "inferior.h"
32e93f7393Sniklas #include "bfd.h"
33e93f7393Sniklas #include "symfile.h"
34e93f7393Sniklas #include "objfiles.h"
35b725ae77Skettenis #include "gdb_wait.h"
36b725ae77Skettenis #include "dcache.h"
37e93f7393Sniklas #include <signal.h>
38b725ae77Skettenis #include "regcache.h"
39b725ae77Skettenis #include "gdb_assert.h"
40b725ae77Skettenis #include "gdbcore.h"
41e93f7393Sniklas 
42b725ae77Skettenis static void target_info (char *, int);
43e93f7393Sniklas 
44b725ae77Skettenis static void maybe_kill_then_attach (char *, int);
45e93f7393Sniklas 
46b725ae77Skettenis static void kill_or_be_killed (int);
47e93f7393Sniklas 
48b725ae77Skettenis static void default_terminal_info (char *, int);
49e93f7393Sniklas 
50b725ae77Skettenis static int default_region_size_ok_for_hw_watchpoint (int);
51e93f7393Sniklas 
52b725ae77Skettenis static int nosymbol (char *, CORE_ADDR *);
53e93f7393Sniklas 
54b725ae77Skettenis static void tcomplain (void);
55e93f7393Sniklas 
56b725ae77Skettenis static int nomemory (CORE_ADDR, char *, int, int, struct target_ops *);
57e93f7393Sniklas 
58b725ae77Skettenis static int return_zero (void);
59e93f7393Sniklas 
60b725ae77Skettenis static int return_one (void);
61e93f7393Sniklas 
62b725ae77Skettenis static int return_minus_one (void);
63e93f7393Sniklas 
64b725ae77Skettenis void target_ignore (void);
65e93f7393Sniklas 
66b725ae77Skettenis static void target_command (char *, int);
67e93f7393Sniklas 
68b725ae77Skettenis static struct target_ops *find_default_run_target (char *);
69e93f7393Sniklas 
70b725ae77Skettenis static void nosupport_runtime (void);
71e93f7393Sniklas 
72b725ae77Skettenis static LONGEST default_xfer_partial (struct target_ops *ops,
73b725ae77Skettenis 				     enum target_object object,
74b725ae77Skettenis 				     const char *annex, void *readbuf,
75b725ae77Skettenis 				     const void *writebuf,
76b725ae77Skettenis 				     ULONGEST offset, LONGEST len);
77e93f7393Sniklas 
78b725ae77Skettenis /* Transfer LEN bytes between target address MEMADDR and GDB address
79b725ae77Skettenis    MYADDR.  Returns 0 for success, errno code for failure (which
80b725ae77Skettenis    includes partial transfers -- if you want a more useful response to
81b725ae77Skettenis    partial transfers, try either target_read_memory_partial or
82b725ae77Skettenis    target_write_memory_partial).  */
83e93f7393Sniklas 
84b725ae77Skettenis static int target_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
85b725ae77Skettenis 			       int write);
86e93f7393Sniklas 
87b725ae77Skettenis static void init_dummy_target (void);
88e93f7393Sniklas 
89*63addd46Skettenis static struct target_ops debug_target;
90*63addd46Skettenis 
91b725ae77Skettenis static void debug_to_open (char *, int);
92e93f7393Sniklas 
93b725ae77Skettenis static void debug_to_close (int);
94e93f7393Sniklas 
95b725ae77Skettenis static void debug_to_attach (char *, int);
96e93f7393Sniklas 
97b725ae77Skettenis static void debug_to_detach (char *, int);
98e93f7393Sniklas 
99b725ae77Skettenis static void debug_to_disconnect (char *, int);
100e93f7393Sniklas 
101b725ae77Skettenis static void debug_to_resume (ptid_t, int, enum target_signal);
102e93f7393Sniklas 
103b725ae77Skettenis static ptid_t debug_to_wait (ptid_t, struct target_waitstatus *);
104e93f7393Sniklas 
105b725ae77Skettenis static void debug_to_fetch_registers (int);
106e93f7393Sniklas 
107b725ae77Skettenis static void debug_to_store_registers (int);
108e93f7393Sniklas 
109b725ae77Skettenis static void debug_to_prepare_to_store (void);
110e93f7393Sniklas 
111*63addd46Skettenis static int deprecated_debug_xfer_memory (CORE_ADDR, char *, int, int,
112*63addd46Skettenis 					 struct mem_attrib *,
113*63addd46Skettenis 					 struct target_ops *);
114e93f7393Sniklas 
115b725ae77Skettenis static void debug_to_files_info (struct target_ops *);
116e93f7393Sniklas 
117b725ae77Skettenis static int debug_to_insert_breakpoint (CORE_ADDR, char *);
118e93f7393Sniklas 
119b725ae77Skettenis static int debug_to_remove_breakpoint (CORE_ADDR, char *);
120e93f7393Sniklas 
121b725ae77Skettenis static int debug_to_can_use_hw_breakpoint (int, int, int);
122e93f7393Sniklas 
123b725ae77Skettenis static int debug_to_insert_hw_breakpoint (CORE_ADDR, char *);
124e93f7393Sniklas 
125b725ae77Skettenis static int debug_to_remove_hw_breakpoint (CORE_ADDR, char *);
126e93f7393Sniklas 
127b725ae77Skettenis static int debug_to_insert_watchpoint (CORE_ADDR, int, int);
128e93f7393Sniklas 
129b725ae77Skettenis static int debug_to_remove_watchpoint (CORE_ADDR, int, int);
130e93f7393Sniklas 
131b725ae77Skettenis static int debug_to_stopped_by_watchpoint (void);
132e93f7393Sniklas 
133*63addd46Skettenis static int debug_to_stopped_data_address (struct target_ops *, CORE_ADDR *);
134e93f7393Sniklas 
135b725ae77Skettenis static int debug_to_region_size_ok_for_hw_watchpoint (int);
136b725ae77Skettenis 
137b725ae77Skettenis static void debug_to_terminal_init (void);
138b725ae77Skettenis 
139b725ae77Skettenis static void debug_to_terminal_inferior (void);
140b725ae77Skettenis 
141b725ae77Skettenis static void debug_to_terminal_ours_for_output (void);
142b725ae77Skettenis 
143b725ae77Skettenis static void debug_to_terminal_save_ours (void);
144b725ae77Skettenis 
145b725ae77Skettenis static void debug_to_terminal_ours (void);
146b725ae77Skettenis 
147b725ae77Skettenis static void debug_to_terminal_info (char *, int);
148b725ae77Skettenis 
149b725ae77Skettenis static void debug_to_kill (void);
150b725ae77Skettenis 
151b725ae77Skettenis static void debug_to_load (char *, int);
152b725ae77Skettenis 
153b725ae77Skettenis static int debug_to_lookup_symbol (char *, CORE_ADDR *);
154b725ae77Skettenis 
155b725ae77Skettenis static void debug_to_mourn_inferior (void);
156b725ae77Skettenis 
157b725ae77Skettenis static int debug_to_can_run (void);
158b725ae77Skettenis 
159b725ae77Skettenis static void debug_to_notice_signals (ptid_t);
160b725ae77Skettenis 
161b725ae77Skettenis static int debug_to_thread_alive (ptid_t);
162b725ae77Skettenis 
163b725ae77Skettenis static void debug_to_stop (void);
164e93f7393Sniklas 
165*63addd46Skettenis /* NOTE: cagney/2004-09-29: Many targets reference this variable in
166*63addd46Skettenis    wierd and mysterious ways.  Putting the variable here lets those
167*63addd46Skettenis    wierd and mysterious ways keep building while they are being
168*63addd46Skettenis    converted to the inferior inheritance structure.  */
169*63addd46Skettenis struct target_ops deprecated_child_ops;
170*63addd46Skettenis 
171e93f7393Sniklas /* Pointer to array of target architecture structures; the size of the
172e93f7393Sniklas    array; the current index into the array; the allocated size of the
173e93f7393Sniklas    array.  */
174e93f7393Sniklas struct target_ops **target_structs;
175e93f7393Sniklas unsigned target_struct_size;
176e93f7393Sniklas unsigned target_struct_index;
177e93f7393Sniklas unsigned target_struct_allocsize;
178e93f7393Sniklas #define	DEFAULT_ALLOCSIZE	10
179e93f7393Sniklas 
180e93f7393Sniklas /* The initial current target, so that there is always a semi-valid
181e93f7393Sniklas    current target.  */
182e93f7393Sniklas 
183b725ae77Skettenis static struct target_ops dummy_target;
184e93f7393Sniklas 
185e93f7393Sniklas /* Top of target stack.  */
186e93f7393Sniklas 
187b725ae77Skettenis static struct target_ops *target_stack;
188e93f7393Sniklas 
189e93f7393Sniklas /* The target structure we are currently using to talk to a process
190e93f7393Sniklas    or file or whatever "inferior" we have.  */
191e93f7393Sniklas 
192e93f7393Sniklas struct target_ops current_target;
193e93f7393Sniklas 
194e93f7393Sniklas /* Command list for target.  */
195e93f7393Sniklas 
196e93f7393Sniklas static struct cmd_list_element *targetlist = NULL;
197e93f7393Sniklas 
198e93f7393Sniklas /* Nonzero if we are debugging an attached outside process
199e93f7393Sniklas    rather than an inferior.  */
200e93f7393Sniklas 
201e93f7393Sniklas int attach_flag;
202e93f7393Sniklas 
203e93f7393Sniklas /* Non-zero if we want to see trace of target level stuff.  */
204e93f7393Sniklas 
205e93f7393Sniklas static int targetdebug = 0;
206e93f7393Sniklas 
207b725ae77Skettenis static void setup_target_debug (void);
208e93f7393Sniklas 
209b725ae77Skettenis DCACHE *target_dcache;
210e93f7393Sniklas 
211e93f7393Sniklas /* The user just typed 'target' without the name of a target.  */
212e93f7393Sniklas 
213e93f7393Sniklas static void
target_command(char * arg,int from_tty)214b725ae77Skettenis target_command (char *arg, int from_tty)
215e93f7393Sniklas {
216e93f7393Sniklas   fputs_filtered ("Argument required (target name).  Try `help target'\n",
217e93f7393Sniklas 		  gdb_stdout);
218e93f7393Sniklas }
219e93f7393Sniklas 
220e93f7393Sniklas /* Add a possible target architecture to the list.  */
221e93f7393Sniklas 
222e93f7393Sniklas void
add_target(struct target_ops * t)223b725ae77Skettenis add_target (struct target_ops *t)
224e93f7393Sniklas {
225b725ae77Skettenis   /* Provide default values for all "must have" methods.  */
226b725ae77Skettenis   if (t->to_xfer_partial == NULL)
227b725ae77Skettenis     t->to_xfer_partial = default_xfer_partial;
228b725ae77Skettenis 
229e93f7393Sniklas   if (!target_structs)
230e93f7393Sniklas     {
231e93f7393Sniklas       target_struct_allocsize = DEFAULT_ALLOCSIZE;
232e93f7393Sniklas       target_structs = (struct target_ops **) xmalloc
233e93f7393Sniklas 	(target_struct_allocsize * sizeof (*target_structs));
234e93f7393Sniklas     }
235e93f7393Sniklas   if (target_struct_size >= target_struct_allocsize)
236e93f7393Sniklas     {
237e93f7393Sniklas       target_struct_allocsize *= 2;
238e93f7393Sniklas       target_structs = (struct target_ops **)
239e93f7393Sniklas 	xrealloc ((char *) target_structs,
240e93f7393Sniklas 		  target_struct_allocsize * sizeof (*target_structs));
241e93f7393Sniklas     }
242e93f7393Sniklas   target_structs[target_struct_size++] = t;
243e93f7393Sniklas 
244e93f7393Sniklas   if (targetlist == NULL)
245e93f7393Sniklas     add_prefix_cmd ("target", class_run, target_command,
246e93f7393Sniklas 		    "Connect to a target machine or process.\n\
247e93f7393Sniklas The first argument is the type or protocol of the target machine.\n\
248e93f7393Sniklas Remaining arguments are interpreted by the target protocol.  For more\n\
249e93f7393Sniklas information on the arguments for a particular protocol, type\n\
250e93f7393Sniklas `help target ' followed by the protocol name.",
251e93f7393Sniklas 		    &targetlist, "target ", 0, &cmdlist);
252e93f7393Sniklas   add_cmd (t->to_shortname, no_class, t->to_open, t->to_doc, &targetlist);
253e93f7393Sniklas }
254e93f7393Sniklas 
255e93f7393Sniklas /* Stub functions */
256e93f7393Sniklas 
257b725ae77Skettenis void
target_ignore(void)258b725ae77Skettenis target_ignore (void)
259e93f7393Sniklas {
260e93f7393Sniklas }
261e93f7393Sniklas 
262b725ae77Skettenis void
target_load(char * arg,int from_tty)263b725ae77Skettenis target_load (char *arg, int from_tty)
264b725ae77Skettenis {
265b725ae77Skettenis   dcache_invalidate (target_dcache);
266b725ae77Skettenis   (*current_target.to_load) (arg, from_tty);
267b725ae77Skettenis }
268b725ae77Skettenis 
269e93f7393Sniklas static int
nomemory(CORE_ADDR memaddr,char * myaddr,int len,int write,struct target_ops * t)270b725ae77Skettenis nomemory (CORE_ADDR memaddr, char *myaddr, int len, int write,
271b725ae77Skettenis 	  struct target_ops *t)
272e93f7393Sniklas {
273e93f7393Sniklas   errno = EIO;			/* Can't read/write this location */
274e93f7393Sniklas   return 0;			/* No bytes handled */
275e93f7393Sniklas }
276e93f7393Sniklas 
277e93f7393Sniklas static void
tcomplain(void)278b725ae77Skettenis tcomplain (void)
279e93f7393Sniklas {
280e93f7393Sniklas   error ("You can't do that when your target is `%s'",
281e93f7393Sniklas 	 current_target.to_shortname);
282e93f7393Sniklas }
283e93f7393Sniklas 
284e93f7393Sniklas void
noprocess(void)285b725ae77Skettenis noprocess (void)
286e93f7393Sniklas {
287b725ae77Skettenis   error ("You can't do that without a process to debug.");
288e93f7393Sniklas }
289e93f7393Sniklas 
290e93f7393Sniklas static int
nosymbol(char * name,CORE_ADDR * addrp)291b725ae77Skettenis nosymbol (char *name, CORE_ADDR *addrp)
292e93f7393Sniklas {
293e93f7393Sniklas   return 1;			/* Symbol does not exist in target env */
294e93f7393Sniklas }
295e93f7393Sniklas 
296e93f7393Sniklas static void
nosupport_runtime(void)297b725ae77Skettenis nosupport_runtime (void)
298b725ae77Skettenis {
299b725ae77Skettenis   if (ptid_equal (inferior_ptid, null_ptid))
300b725ae77Skettenis     noprocess ();
301b725ae77Skettenis   else
302b725ae77Skettenis     error ("No run-time support for this");
303b725ae77Skettenis }
304b725ae77Skettenis 
305b725ae77Skettenis 
306b725ae77Skettenis static void
default_terminal_info(char * args,int from_tty)307b725ae77Skettenis default_terminal_info (char *args, int from_tty)
308e93f7393Sniklas {
309e93f7393Sniklas   printf_unfiltered ("No saved terminal information.\n");
310e93f7393Sniklas }
311e93f7393Sniklas 
312e93f7393Sniklas /* This is the default target_create_inferior and target_attach function.
313e93f7393Sniklas    If the current target is executing, it asks whether to kill it off.
314e93f7393Sniklas    If this function returns without calling error(), it has killed off
315e93f7393Sniklas    the target, and the operation should be attempted.  */
316e93f7393Sniklas 
317e93f7393Sniklas static void
kill_or_be_killed(int from_tty)318b725ae77Skettenis kill_or_be_killed (int from_tty)
319e93f7393Sniklas {
320e93f7393Sniklas   if (target_has_execution)
321e93f7393Sniklas     {
322e93f7393Sniklas       printf_unfiltered ("You are already running a program:\n");
323e93f7393Sniklas       target_files_info ();
324b725ae77Skettenis       if (query ("Kill it? "))
325b725ae77Skettenis 	{
326e93f7393Sniklas 	  target_kill ();
327e93f7393Sniklas 	  if (target_has_execution)
328e93f7393Sniklas 	    error ("Killing the program did not help.");
329e93f7393Sniklas 	  return;
330b725ae77Skettenis 	}
331b725ae77Skettenis       else
332b725ae77Skettenis 	{
333e93f7393Sniklas 	  error ("Program not killed.");
334e93f7393Sniklas 	}
335e93f7393Sniklas     }
336e93f7393Sniklas   tcomplain ();
337e93f7393Sniklas }
338e93f7393Sniklas 
339e93f7393Sniklas static void
maybe_kill_then_attach(char * args,int from_tty)340b725ae77Skettenis maybe_kill_then_attach (char *args, int from_tty)
341e93f7393Sniklas {
342e93f7393Sniklas   kill_or_be_killed (from_tty);
343e93f7393Sniklas   target_attach (args, from_tty);
344e93f7393Sniklas }
345e93f7393Sniklas 
346e93f7393Sniklas static void
maybe_kill_then_create_inferior(char * exec,char * args,char ** env,int from_tty)347*63addd46Skettenis maybe_kill_then_create_inferior (char *exec, char *args, char **env,
348*63addd46Skettenis 				 int from_tty)
349e93f7393Sniklas {
350e93f7393Sniklas   kill_or_be_killed (0);
351*63addd46Skettenis   target_create_inferior (exec, args, env, from_tty);
352e93f7393Sniklas }
353e93f7393Sniklas 
354b725ae77Skettenis /* Go through the target stack from top to bottom, copying over zero
355b725ae77Skettenis    entries in current_target, then filling in still empty entries.  In
356b725ae77Skettenis    effect, we are doing class inheritance through the pushed target
357b725ae77Skettenis    vectors.
358b725ae77Skettenis 
359b725ae77Skettenis    NOTE: cagney/2003-10-17: The problem with this inheritance, as it
360b725ae77Skettenis    is currently implemented, is that it discards any knowledge of
361b725ae77Skettenis    which target an inherited method originally belonged to.
362b725ae77Skettenis    Consequently, new new target methods should instead explicitly and
363b725ae77Skettenis    locally search the target stack for the target that can handle the
364b725ae77Skettenis    request.  */
365e93f7393Sniklas 
366e93f7393Sniklas static void
update_current_target(void)367b725ae77Skettenis update_current_target (void)
368e93f7393Sniklas {
369e93f7393Sniklas   struct target_ops *t;
370e93f7393Sniklas 
371b725ae77Skettenis   /* First, reset curren'ts contents.  */
372b725ae77Skettenis   memset (&current_target, 0, sizeof (current_target));
373e93f7393Sniklas 
374e93f7393Sniklas #define INHERIT(FIELD, TARGET) \
375e93f7393Sniklas       if (!current_target.FIELD) \
376b725ae77Skettenis 	current_target.FIELD = (TARGET)->FIELD
377e93f7393Sniklas 
378b725ae77Skettenis   for (t = target_stack; t; t = t->beneath)
379b725ae77Skettenis     {
380e93f7393Sniklas       INHERIT (to_shortname, t);
381e93f7393Sniklas       INHERIT (to_longname, t);
382e93f7393Sniklas       INHERIT (to_doc, t);
383e93f7393Sniklas       INHERIT (to_open, t);
384e93f7393Sniklas       INHERIT (to_close, t);
385e93f7393Sniklas       INHERIT (to_attach, t);
386b725ae77Skettenis       INHERIT (to_post_attach, t);
387e93f7393Sniklas       INHERIT (to_detach, t);
388b725ae77Skettenis       INHERIT (to_disconnect, t);
389e93f7393Sniklas       INHERIT (to_resume, t);
390e93f7393Sniklas       INHERIT (to_wait, t);
391e93f7393Sniklas       INHERIT (to_fetch_registers, t);
392e93f7393Sniklas       INHERIT (to_store_registers, t);
393e93f7393Sniklas       INHERIT (to_prepare_to_store, t);
394*63addd46Skettenis       INHERIT (deprecated_xfer_memory, t);
395e93f7393Sniklas       INHERIT (to_files_info, t);
396e93f7393Sniklas       INHERIT (to_insert_breakpoint, t);
397e93f7393Sniklas       INHERIT (to_remove_breakpoint, t);
398b725ae77Skettenis       INHERIT (to_can_use_hw_breakpoint, t);
399b725ae77Skettenis       INHERIT (to_insert_hw_breakpoint, t);
400b725ae77Skettenis       INHERIT (to_remove_hw_breakpoint, t);
401b725ae77Skettenis       INHERIT (to_insert_watchpoint, t);
402b725ae77Skettenis       INHERIT (to_remove_watchpoint, t);
403b725ae77Skettenis       INHERIT (to_stopped_data_address, t);
404b725ae77Skettenis       INHERIT (to_stopped_by_watchpoint, t);
405b725ae77Skettenis       INHERIT (to_have_continuable_watchpoint, t);
406b725ae77Skettenis       INHERIT (to_region_size_ok_for_hw_watchpoint, t);
407e93f7393Sniklas       INHERIT (to_terminal_init, t);
408e93f7393Sniklas       INHERIT (to_terminal_inferior, t);
409e93f7393Sniklas       INHERIT (to_terminal_ours_for_output, t);
410e93f7393Sniklas       INHERIT (to_terminal_ours, t);
411b725ae77Skettenis       INHERIT (to_terminal_save_ours, t);
412e93f7393Sniklas       INHERIT (to_terminal_info, t);
413e93f7393Sniklas       INHERIT (to_kill, t);
414e93f7393Sniklas       INHERIT (to_load, t);
415e93f7393Sniklas       INHERIT (to_lookup_symbol, t);
416e93f7393Sniklas       INHERIT (to_create_inferior, t);
417b725ae77Skettenis       INHERIT (to_post_startup_inferior, t);
418b725ae77Skettenis       INHERIT (to_acknowledge_created_inferior, t);
419b725ae77Skettenis       INHERIT (to_insert_fork_catchpoint, t);
420b725ae77Skettenis       INHERIT (to_remove_fork_catchpoint, t);
421b725ae77Skettenis       INHERIT (to_insert_vfork_catchpoint, t);
422b725ae77Skettenis       INHERIT (to_remove_vfork_catchpoint, t);
423b725ae77Skettenis       INHERIT (to_follow_fork, t);
424b725ae77Skettenis       INHERIT (to_insert_exec_catchpoint, t);
425b725ae77Skettenis       INHERIT (to_remove_exec_catchpoint, t);
426b725ae77Skettenis       INHERIT (to_reported_exec_events_per_exec_call, t);
427b725ae77Skettenis       INHERIT (to_has_exited, t);
428e93f7393Sniklas       INHERIT (to_mourn_inferior, t);
429e93f7393Sniklas       INHERIT (to_can_run, t);
430e93f7393Sniklas       INHERIT (to_notice_signals, t);
431e93f7393Sniklas       INHERIT (to_thread_alive, t);
432b725ae77Skettenis       INHERIT (to_find_new_threads, t);
433b725ae77Skettenis       INHERIT (to_pid_to_str, t);
434b725ae77Skettenis       INHERIT (to_extra_thread_info, t);
435e93f7393Sniklas       INHERIT (to_stop, t);
436b725ae77Skettenis       /* Do not inherit to_xfer_partial.  */
437b725ae77Skettenis       INHERIT (to_rcmd, t);
438b725ae77Skettenis       INHERIT (to_enable_exception_callback, t);
439b725ae77Skettenis       INHERIT (to_get_current_exception_event, t);
440b725ae77Skettenis       INHERIT (to_pid_to_exec_file, t);
441e93f7393Sniklas       INHERIT (to_stratum, t);
442e93f7393Sniklas       INHERIT (to_has_all_memory, t);
443e93f7393Sniklas       INHERIT (to_has_memory, t);
444e93f7393Sniklas       INHERIT (to_has_stack, t);
445e93f7393Sniklas       INHERIT (to_has_registers, t);
446e93f7393Sniklas       INHERIT (to_has_execution, t);
447b725ae77Skettenis       INHERIT (to_has_thread_control, t);
448e93f7393Sniklas       INHERIT (to_sections, t);
449e93f7393Sniklas       INHERIT (to_sections_end, t);
450b725ae77Skettenis       INHERIT (to_can_async_p, t);
451b725ae77Skettenis       INHERIT (to_is_async_p, t);
452b725ae77Skettenis       INHERIT (to_async, t);
453b725ae77Skettenis       INHERIT (to_async_mask_value, t);
454b725ae77Skettenis       INHERIT (to_find_memory_regions, t);
455b725ae77Skettenis       INHERIT (to_make_corefile_notes, t);
456b725ae77Skettenis       INHERIT (to_get_thread_local_address, t);
457e93f7393Sniklas       INHERIT (to_magic, t);
458e93f7393Sniklas     }
459b725ae77Skettenis #undef INHERIT
460b725ae77Skettenis 
461b725ae77Skettenis   /* Clean up a target struct so it no longer has any zero pointers in
462b725ae77Skettenis      it.  Some entries are defaulted to a method that print an error,
463b725ae77Skettenis      others are hard-wired to a standard recursive default.  */
464b725ae77Skettenis 
465b725ae77Skettenis #define de_fault(field, value) \
466b725ae77Skettenis   if (!current_target.field)               \
467b725ae77Skettenis     current_target.field = value
468b725ae77Skettenis 
469b725ae77Skettenis   de_fault (to_open,
470b725ae77Skettenis 	    (void (*) (char *, int))
471b725ae77Skettenis 	    tcomplain);
472b725ae77Skettenis   de_fault (to_close,
473b725ae77Skettenis 	    (void (*) (int))
474b725ae77Skettenis 	    target_ignore);
475b725ae77Skettenis   de_fault (to_attach,
476b725ae77Skettenis 	    maybe_kill_then_attach);
477b725ae77Skettenis   de_fault (to_post_attach,
478b725ae77Skettenis 	    (void (*) (int))
479b725ae77Skettenis 	    target_ignore);
480b725ae77Skettenis   de_fault (to_detach,
481b725ae77Skettenis 	    (void (*) (char *, int))
482b725ae77Skettenis 	    target_ignore);
483b725ae77Skettenis   de_fault (to_disconnect,
484b725ae77Skettenis 	    (void (*) (char *, int))
485b725ae77Skettenis 	    tcomplain);
486b725ae77Skettenis   de_fault (to_resume,
487b725ae77Skettenis 	    (void (*) (ptid_t, int, enum target_signal))
488b725ae77Skettenis 	    noprocess);
489b725ae77Skettenis   de_fault (to_wait,
490b725ae77Skettenis 	    (ptid_t (*) (ptid_t, struct target_waitstatus *))
491b725ae77Skettenis 	    noprocess);
492b725ae77Skettenis   de_fault (to_fetch_registers,
493b725ae77Skettenis 	    (void (*) (int))
494b725ae77Skettenis 	    target_ignore);
495b725ae77Skettenis   de_fault (to_store_registers,
496b725ae77Skettenis 	    (void (*) (int))
497b725ae77Skettenis 	    noprocess);
498b725ae77Skettenis   de_fault (to_prepare_to_store,
499b725ae77Skettenis 	    (void (*) (void))
500b725ae77Skettenis 	    noprocess);
501*63addd46Skettenis   de_fault (deprecated_xfer_memory,
502b725ae77Skettenis 	    (int (*) (CORE_ADDR, char *, int, int, struct mem_attrib *, struct target_ops *))
503b725ae77Skettenis 	    nomemory);
504b725ae77Skettenis   de_fault (to_files_info,
505b725ae77Skettenis 	    (void (*) (struct target_ops *))
506b725ae77Skettenis 	    target_ignore);
507b725ae77Skettenis   de_fault (to_insert_breakpoint,
508b725ae77Skettenis 	    memory_insert_breakpoint);
509b725ae77Skettenis   de_fault (to_remove_breakpoint,
510b725ae77Skettenis 	    memory_remove_breakpoint);
511b725ae77Skettenis   de_fault (to_can_use_hw_breakpoint,
512b725ae77Skettenis 	    (int (*) (int, int, int))
513b725ae77Skettenis 	    return_zero);
514b725ae77Skettenis   de_fault (to_insert_hw_breakpoint,
515b725ae77Skettenis 	    (int (*) (CORE_ADDR, char *))
516b725ae77Skettenis 	    return_minus_one);
517b725ae77Skettenis   de_fault (to_remove_hw_breakpoint,
518b725ae77Skettenis 	    (int (*) (CORE_ADDR, char *))
519b725ae77Skettenis 	    return_minus_one);
520b725ae77Skettenis   de_fault (to_insert_watchpoint,
521b725ae77Skettenis 	    (int (*) (CORE_ADDR, int, int))
522b725ae77Skettenis 	    return_minus_one);
523b725ae77Skettenis   de_fault (to_remove_watchpoint,
524b725ae77Skettenis 	    (int (*) (CORE_ADDR, int, int))
525b725ae77Skettenis 	    return_minus_one);
526b725ae77Skettenis   de_fault (to_stopped_by_watchpoint,
527b725ae77Skettenis 	    (int (*) (void))
528b725ae77Skettenis 	    return_zero);
529b725ae77Skettenis   de_fault (to_stopped_data_address,
530*63addd46Skettenis 	    (int (*) (struct target_ops *, CORE_ADDR *))
531b725ae77Skettenis 	    return_zero);
532b725ae77Skettenis   de_fault (to_region_size_ok_for_hw_watchpoint,
533b725ae77Skettenis 	    default_region_size_ok_for_hw_watchpoint);
534b725ae77Skettenis   de_fault (to_terminal_init,
535b725ae77Skettenis 	    (void (*) (void))
536b725ae77Skettenis 	    target_ignore);
537b725ae77Skettenis   de_fault (to_terminal_inferior,
538b725ae77Skettenis 	    (void (*) (void))
539b725ae77Skettenis 	    target_ignore);
540b725ae77Skettenis   de_fault (to_terminal_ours_for_output,
541b725ae77Skettenis 	    (void (*) (void))
542b725ae77Skettenis 	    target_ignore);
543b725ae77Skettenis   de_fault (to_terminal_ours,
544b725ae77Skettenis 	    (void (*) (void))
545b725ae77Skettenis 	    target_ignore);
546b725ae77Skettenis   de_fault (to_terminal_save_ours,
547b725ae77Skettenis 	    (void (*) (void))
548b725ae77Skettenis 	    target_ignore);
549b725ae77Skettenis   de_fault (to_terminal_info,
550b725ae77Skettenis 	    default_terminal_info);
551b725ae77Skettenis   de_fault (to_kill,
552b725ae77Skettenis 	    (void (*) (void))
553b725ae77Skettenis 	    noprocess);
554b725ae77Skettenis   de_fault (to_load,
555b725ae77Skettenis 	    (void (*) (char *, int))
556b725ae77Skettenis 	    tcomplain);
557b725ae77Skettenis   de_fault (to_lookup_symbol,
558b725ae77Skettenis 	    (int (*) (char *, CORE_ADDR *))
559b725ae77Skettenis 	    nosymbol);
560b725ae77Skettenis   de_fault (to_create_inferior,
561b725ae77Skettenis 	    maybe_kill_then_create_inferior);
562b725ae77Skettenis   de_fault (to_post_startup_inferior,
563b725ae77Skettenis 	    (void (*) (ptid_t))
564b725ae77Skettenis 	    target_ignore);
565b725ae77Skettenis   de_fault (to_acknowledge_created_inferior,
566b725ae77Skettenis 	    (void (*) (int))
567b725ae77Skettenis 	    target_ignore);
568b725ae77Skettenis   de_fault (to_insert_fork_catchpoint,
569b725ae77Skettenis 	    (int (*) (int))
570b725ae77Skettenis 	    tcomplain);
571b725ae77Skettenis   de_fault (to_remove_fork_catchpoint,
572b725ae77Skettenis 	    (int (*) (int))
573b725ae77Skettenis 	    tcomplain);
574b725ae77Skettenis   de_fault (to_insert_vfork_catchpoint,
575b725ae77Skettenis 	    (int (*) (int))
576b725ae77Skettenis 	    tcomplain);
577b725ae77Skettenis   de_fault (to_remove_vfork_catchpoint,
578b725ae77Skettenis 	    (int (*) (int))
579b725ae77Skettenis 	    tcomplain);
580b725ae77Skettenis   de_fault (to_follow_fork,
581b725ae77Skettenis 	    (int (*) (int))
582b725ae77Skettenis 	    target_ignore);
583b725ae77Skettenis   de_fault (to_insert_exec_catchpoint,
584b725ae77Skettenis 	    (int (*) (int))
585b725ae77Skettenis 	    tcomplain);
586b725ae77Skettenis   de_fault (to_remove_exec_catchpoint,
587b725ae77Skettenis 	    (int (*) (int))
588b725ae77Skettenis 	    tcomplain);
589b725ae77Skettenis   de_fault (to_reported_exec_events_per_exec_call,
590b725ae77Skettenis 	    (int (*) (void))
591b725ae77Skettenis 	    return_one);
592b725ae77Skettenis   de_fault (to_has_exited,
593b725ae77Skettenis 	    (int (*) (int, int, int *))
594b725ae77Skettenis 	    return_zero);
595b725ae77Skettenis   de_fault (to_mourn_inferior,
596b725ae77Skettenis 	    (void (*) (void))
597b725ae77Skettenis 	    noprocess);
598b725ae77Skettenis   de_fault (to_can_run,
599b725ae77Skettenis 	    return_zero);
600b725ae77Skettenis   de_fault (to_notice_signals,
601b725ae77Skettenis 	    (void (*) (ptid_t))
602b725ae77Skettenis 	    target_ignore);
603b725ae77Skettenis   de_fault (to_thread_alive,
604b725ae77Skettenis 	    (int (*) (ptid_t))
605b725ae77Skettenis 	    return_zero);
606b725ae77Skettenis   de_fault (to_find_new_threads,
607b725ae77Skettenis 	    (void (*) (void))
608b725ae77Skettenis 	    target_ignore);
609b725ae77Skettenis   de_fault (to_extra_thread_info,
610b725ae77Skettenis 	    (char *(*) (struct thread_info *))
611b725ae77Skettenis 	    return_zero);
612b725ae77Skettenis   de_fault (to_stop,
613b725ae77Skettenis 	    (void (*) (void))
614b725ae77Skettenis 	    target_ignore);
615b725ae77Skettenis   current_target.to_xfer_partial = default_xfer_partial;
616b725ae77Skettenis   de_fault (to_rcmd,
617b725ae77Skettenis 	    (void (*) (char *, struct ui_file *))
618b725ae77Skettenis 	    tcomplain);
619b725ae77Skettenis   de_fault (to_enable_exception_callback,
620b725ae77Skettenis 	    (struct symtab_and_line * (*) (enum exception_event_kind, int))
621b725ae77Skettenis 	    nosupport_runtime);
622b725ae77Skettenis   de_fault (to_get_current_exception_event,
623b725ae77Skettenis 	    (struct exception_event_record * (*) (void))
624b725ae77Skettenis 	    nosupport_runtime);
625b725ae77Skettenis   de_fault (to_pid_to_exec_file,
626b725ae77Skettenis 	    (char *(*) (int))
627b725ae77Skettenis 	    return_zero);
628b725ae77Skettenis   de_fault (to_can_async_p,
629b725ae77Skettenis 	    (int (*) (void))
630b725ae77Skettenis 	    return_zero);
631b725ae77Skettenis   de_fault (to_is_async_p,
632b725ae77Skettenis 	    (int (*) (void))
633b725ae77Skettenis 	    return_zero);
634b725ae77Skettenis   de_fault (to_async,
635b725ae77Skettenis 	    (void (*) (void (*) (enum inferior_event_type, void*), void*))
636b725ae77Skettenis 	    tcomplain);
637b725ae77Skettenis #undef de_fault
638b725ae77Skettenis 
639b725ae77Skettenis   /* Finally, position the target-stack beneath the squashed
640b725ae77Skettenis      "current_target".  That way code looking for a non-inherited
641b725ae77Skettenis      target method can quickly and simply find it.  */
642b725ae77Skettenis   current_target.beneath = target_stack;
643e93f7393Sniklas }
644e93f7393Sniklas 
645e93f7393Sniklas /* Push a new target type into the stack of the existing target accessors,
646e93f7393Sniklas    possibly superseding some of the existing accessors.
647e93f7393Sniklas 
648e93f7393Sniklas    Result is zero if the pushed target ended up on top of the stack,
649e93f7393Sniklas    nonzero if at least one target is on top of it.
650e93f7393Sniklas 
651e93f7393Sniklas    Rather than allow an empty stack, we always have the dummy target at
652e93f7393Sniklas    the bottom stratum, so we can call the function vectors without
653e93f7393Sniklas    checking them.  */
654e93f7393Sniklas 
655e93f7393Sniklas int
push_target(struct target_ops * t)656b725ae77Skettenis push_target (struct target_ops *t)
657e93f7393Sniklas {
658b725ae77Skettenis   struct target_ops **cur;
659e93f7393Sniklas 
660e93f7393Sniklas   /* Check magic number.  If wrong, it probably means someone changed
661e93f7393Sniklas      the struct definition, but not all the places that initialize one.  */
662e93f7393Sniklas   if (t->to_magic != OPS_MAGIC)
663e93f7393Sniklas     {
664e93f7393Sniklas       fprintf_unfiltered (gdb_stderr,
665e93f7393Sniklas 			  "Magic number of %s target struct wrong\n",
666e93f7393Sniklas 			  t->to_shortname);
667b725ae77Skettenis       internal_error (__FILE__, __LINE__, "failed internal consistency check");
668e93f7393Sniklas     }
669e93f7393Sniklas 
670e93f7393Sniklas   /* Find the proper stratum to install this target in.  */
671b725ae77Skettenis   for (cur = &target_stack; (*cur) != NULL; cur = &(*cur)->beneath)
672e93f7393Sniklas     {
673b725ae77Skettenis       if ((int) (t->to_stratum) >= (int) (*cur)->to_stratum)
674e93f7393Sniklas 	break;
675e93f7393Sniklas     }
676e93f7393Sniklas 
677e93f7393Sniklas   /* If there's already targets at this stratum, remove them.  */
678b725ae77Skettenis   /* FIXME: cagney/2003-10-15: I think this should be poping all
679b725ae77Skettenis      targets to CUR, and not just those at this stratum level.  */
680b725ae77Skettenis   while ((*cur) != NULL && t->to_stratum == (*cur)->to_stratum)
681e93f7393Sniklas     {
682b725ae77Skettenis       /* There's already something at this stratum level.  Close it,
683b725ae77Skettenis          and un-hook it from the stack.  */
684b725ae77Skettenis       struct target_ops *tmp = (*cur);
685b725ae77Skettenis       (*cur) = (*cur)->beneath;
686b725ae77Skettenis       tmp->beneath = NULL;
687b725ae77Skettenis       target_close (tmp, 0);
688e93f7393Sniklas     }
689e93f7393Sniklas 
690e93f7393Sniklas   /* We have removed all targets in our stratum, now add the new one.  */
691b725ae77Skettenis   t->beneath = (*cur);
692b725ae77Skettenis   (*cur) = t;
693e93f7393Sniklas 
694e93f7393Sniklas   update_current_target ();
695e93f7393Sniklas 
696e93f7393Sniklas   if (targetdebug)
697e93f7393Sniklas     setup_target_debug ();
698e93f7393Sniklas 
699b725ae77Skettenis   /* Not on top?  */
700b725ae77Skettenis   return (t != target_stack);
701e93f7393Sniklas }
702e93f7393Sniklas 
703e93f7393Sniklas /* Remove a target_ops vector from the stack, wherever it may be.
704e93f7393Sniklas    Return how many times it was removed (0 or 1).  */
705e93f7393Sniklas 
706e93f7393Sniklas int
unpush_target(struct target_ops * t)707b725ae77Skettenis unpush_target (struct target_ops *t)
708e93f7393Sniklas {
709b725ae77Skettenis   struct target_ops **cur;
710b725ae77Skettenis   struct target_ops *tmp;
711e93f7393Sniklas 
712e93f7393Sniklas   /* Look for the specified target.  Note that we assume that a target
713e93f7393Sniklas      can only occur once in the target stack. */
714e93f7393Sniklas 
715b725ae77Skettenis   for (cur = &target_stack; (*cur) != NULL; cur = &(*cur)->beneath)
716b725ae77Skettenis     {
717b725ae77Skettenis       if ((*cur) == t)
718e93f7393Sniklas 	break;
719b725ae77Skettenis     }
720e93f7393Sniklas 
721b725ae77Skettenis   if ((*cur) == NULL)
722e93f7393Sniklas     return 0;			/* Didn't find target_ops, quit now */
723e93f7393Sniklas 
724b725ae77Skettenis   /* NOTE: cagney/2003-12-06: In '94 the close call was made
725b725ae77Skettenis      unconditional by moving it to before the above check that the
726b725ae77Skettenis      target was in the target stack (something about "Change the way
727b725ae77Skettenis      pushing and popping of targets work to support target overlays
728b725ae77Skettenis      and inheritance").  This doesn't make much sense - only open
729b725ae77Skettenis      targets should be closed.  */
730b725ae77Skettenis   target_close (t, 0);
731b725ae77Skettenis 
732e93f7393Sniklas   /* Unchain the target */
733b725ae77Skettenis   tmp = (*cur);
734b725ae77Skettenis   (*cur) = (*cur)->beneath;
735b725ae77Skettenis   tmp->beneath = NULL;
736e93f7393Sniklas 
737e93f7393Sniklas   update_current_target ();
738e93f7393Sniklas 
739e93f7393Sniklas   return 1;
740e93f7393Sniklas }
741e93f7393Sniklas 
742e93f7393Sniklas void
pop_target(void)743b725ae77Skettenis pop_target (void)
744e93f7393Sniklas {
745b725ae77Skettenis   target_close (&current_target, 0);	/* Let it clean up */
746b725ae77Skettenis   if (unpush_target (target_stack) == 1)
747e93f7393Sniklas     return;
748e93f7393Sniklas 
749e93f7393Sniklas   fprintf_unfiltered (gdb_stderr,
750e93f7393Sniklas 		      "pop_target couldn't find target %s\n",
751e93f7393Sniklas 		      current_target.to_shortname);
752b725ae77Skettenis   internal_error (__FILE__, __LINE__, "failed internal consistency check");
753e93f7393Sniklas }
754e93f7393Sniklas 
755e93f7393Sniklas #undef	MIN
756e93f7393Sniklas #define MIN(A, B) (((A) <= (B)) ? (A) : (B))
757e93f7393Sniklas 
758e93f7393Sniklas /* target_read_string -- read a null terminated string, up to LEN bytes,
759e93f7393Sniklas    from MEMADDR in target.  Set *ERRNOP to the errno code, or 0 if successful.
760e93f7393Sniklas    Set *STRING to a pointer to malloc'd memory containing the data; the caller
761e93f7393Sniklas    is responsible for freeing it.  Return the number of bytes successfully
762e93f7393Sniklas    read.  */
763e93f7393Sniklas 
764e93f7393Sniklas int
target_read_string(CORE_ADDR memaddr,char ** string,int len,int * errnop)765b725ae77Skettenis target_read_string (CORE_ADDR memaddr, char **string, int len, int *errnop)
766e93f7393Sniklas {
767e93f7393Sniklas   int tlen, origlen, offset, i;
768e93f7393Sniklas   char buf[4];
769e93f7393Sniklas   int errcode = 0;
770e93f7393Sniklas   char *buffer;
771e93f7393Sniklas   int buffer_allocated;
772e93f7393Sniklas   char *bufptr;
773e93f7393Sniklas   unsigned int nbytes_read = 0;
774e93f7393Sniklas 
775e93f7393Sniklas   /* Small for testing.  */
776e93f7393Sniklas   buffer_allocated = 4;
777e93f7393Sniklas   buffer = xmalloc (buffer_allocated);
778e93f7393Sniklas   bufptr = buffer;
779e93f7393Sniklas 
780e93f7393Sniklas   origlen = len;
781e93f7393Sniklas 
782e93f7393Sniklas   while (len > 0)
783e93f7393Sniklas     {
784e93f7393Sniklas       tlen = MIN (len, 4 - (memaddr & 3));
785e93f7393Sniklas       offset = memaddr & 3;
786e93f7393Sniklas 
787*63addd46Skettenis       errcode = target_read_memory (memaddr & ~3, buf, 4);
788e93f7393Sniklas       if (errcode != 0)
789b725ae77Skettenis 	{
790b725ae77Skettenis 	  /* The transfer request might have crossed the boundary to an
791b725ae77Skettenis 	     unallocated region of memory. Retry the transfer, requesting
792b725ae77Skettenis 	     a single byte.  */
793b725ae77Skettenis 	  tlen = 1;
794b725ae77Skettenis 	  offset = 0;
795*63addd46Skettenis 	  errcode = target_read_memory (memaddr, buf, 1);
796b725ae77Skettenis 	  if (errcode != 0)
797e93f7393Sniklas 	    goto done;
798b725ae77Skettenis 	}
799e93f7393Sniklas 
800e93f7393Sniklas       if (bufptr - buffer + tlen > buffer_allocated)
801e93f7393Sniklas 	{
802e93f7393Sniklas 	  unsigned int bytes;
803e93f7393Sniklas 	  bytes = bufptr - buffer;
804e93f7393Sniklas 	  buffer_allocated *= 2;
805e93f7393Sniklas 	  buffer = xrealloc (buffer, buffer_allocated);
806e93f7393Sniklas 	  bufptr = buffer + bytes;
807e93f7393Sniklas 	}
808e93f7393Sniklas 
809e93f7393Sniklas       for (i = 0; i < tlen; i++)
810e93f7393Sniklas 	{
811e93f7393Sniklas 	  *bufptr++ = buf[i + offset];
812e93f7393Sniklas 	  if (buf[i + offset] == '\000')
813e93f7393Sniklas 	    {
814e93f7393Sniklas 	      nbytes_read += i + 1;
815e93f7393Sniklas 	      goto done;
816e93f7393Sniklas 	    }
817e93f7393Sniklas 	}
818e93f7393Sniklas 
819e93f7393Sniklas       memaddr += tlen;
820e93f7393Sniklas       len -= tlen;
821e93f7393Sniklas       nbytes_read += tlen;
822e93f7393Sniklas     }
823e93f7393Sniklas done:
824e93f7393Sniklas   if (errnop != NULL)
825e93f7393Sniklas     *errnop = errcode;
826e93f7393Sniklas   if (string != NULL)
827e93f7393Sniklas     *string = buffer;
828e93f7393Sniklas   return nbytes_read;
829e93f7393Sniklas }
830e93f7393Sniklas 
831b725ae77Skettenis /* Find a section containing ADDR.  */
832b725ae77Skettenis struct section_table *
target_section_by_addr(struct target_ops * target,CORE_ADDR addr)833b725ae77Skettenis target_section_by_addr (struct target_ops *target, CORE_ADDR addr)
834b725ae77Skettenis {
835b725ae77Skettenis   struct section_table *secp;
836b725ae77Skettenis   for (secp = target->to_sections;
837b725ae77Skettenis        secp < target->to_sections_end;
838b725ae77Skettenis        secp++)
839b725ae77Skettenis     {
840b725ae77Skettenis       if (addr >= secp->addr && addr < secp->endaddr)
841b725ae77Skettenis 	return secp;
842b725ae77Skettenis     }
843b725ae77Skettenis   return NULL;
844b725ae77Skettenis }
845b725ae77Skettenis 
846*63addd46Skettenis /* Return non-zero when the target vector has supplied an xfer_partial
847*63addd46Skettenis    method and it, rather than xfer_memory, should be used.  */
848*63addd46Skettenis static int
target_xfer_partial_p(void)849*63addd46Skettenis target_xfer_partial_p (void)
850*63addd46Skettenis {
851*63addd46Skettenis   return (target_stack != NULL
852*63addd46Skettenis 	  && target_stack->to_xfer_partial != default_xfer_partial);
853*63addd46Skettenis }
854*63addd46Skettenis 
855*63addd46Skettenis static LONGEST
target_xfer_partial(struct target_ops * ops,enum target_object object,const char * annex,void * readbuf,const void * writebuf,ULONGEST offset,LONGEST len)856*63addd46Skettenis target_xfer_partial (struct target_ops *ops,
857*63addd46Skettenis 		     enum target_object object, const char *annex,
858*63addd46Skettenis 		     void *readbuf, const void *writebuf,
859*63addd46Skettenis 		     ULONGEST offset, LONGEST len)
860*63addd46Skettenis {
861*63addd46Skettenis   LONGEST retval;
862*63addd46Skettenis 
863*63addd46Skettenis   gdb_assert (ops->to_xfer_partial != NULL);
864*63addd46Skettenis   retval = ops->to_xfer_partial (ops, object, annex, readbuf, writebuf,
865*63addd46Skettenis 				 offset, len);
866*63addd46Skettenis   if (targetdebug)
867*63addd46Skettenis     {
868*63addd46Skettenis       const unsigned char *myaddr = NULL;
869*63addd46Skettenis 
870*63addd46Skettenis       fprintf_unfiltered (gdb_stdlog,
871*63addd46Skettenis 			  "%s:target_xfer_partial (%d, %s, 0x%lx,  0x%lx,  0x%s, %s) = %s",
872*63addd46Skettenis 			  ops->to_shortname,
873*63addd46Skettenis 			  (int) object,
874*63addd46Skettenis 			  (annex ? annex : "(null)"),
875*63addd46Skettenis 			  (long) readbuf, (long) writebuf,
876*63addd46Skettenis 			  paddr_nz (offset), paddr_d (len), paddr_d (retval));
877*63addd46Skettenis 
878*63addd46Skettenis       if (readbuf)
879*63addd46Skettenis 	myaddr = readbuf;
880*63addd46Skettenis       if (writebuf)
881*63addd46Skettenis 	myaddr = writebuf;
882*63addd46Skettenis       if (retval > 0 && myaddr != NULL)
883*63addd46Skettenis 	{
884*63addd46Skettenis 	  int i;
885*63addd46Skettenis 
886*63addd46Skettenis 	  fputs_unfiltered (", bytes =", gdb_stdlog);
887*63addd46Skettenis 	  for (i = 0; i < retval; i++)
888*63addd46Skettenis 	    {
889*63addd46Skettenis 	      if ((((long) &(myaddr[i])) & 0xf) == 0)
890*63addd46Skettenis 		{
891*63addd46Skettenis 		  if (targetdebug < 2 && i > 0)
892*63addd46Skettenis 		    {
893*63addd46Skettenis 		      fprintf_unfiltered (gdb_stdlog, " ...");
894*63addd46Skettenis 		      break;
895*63addd46Skettenis 		    }
896*63addd46Skettenis 		  fprintf_unfiltered (gdb_stdlog, "\n");
897*63addd46Skettenis 		}
898*63addd46Skettenis 
899*63addd46Skettenis 	      fprintf_unfiltered (gdb_stdlog, " %02x", myaddr[i] & 0xff);
900*63addd46Skettenis 	    }
901*63addd46Skettenis 	}
902*63addd46Skettenis 
903*63addd46Skettenis       fputc_unfiltered ('\n', gdb_stdlog);
904*63addd46Skettenis     }
905*63addd46Skettenis   return retval;
906*63addd46Skettenis }
907*63addd46Skettenis 
908*63addd46Skettenis /* Attempt a transfer all LEN bytes starting at OFFSET between the
909*63addd46Skettenis    inferior's KIND:ANNEX space and GDB's READBUF/WRITEBUF buffer.  If
910*63addd46Skettenis    the transfer succeeds, return zero, otherwize the host ERRNO is
911*63addd46Skettenis    returned.
912*63addd46Skettenis 
913*63addd46Skettenis    The inferior is formed from several layers.  In the case of
914*63addd46Skettenis    corefiles, inf-corefile is layered above inf-exec and a request for
915*63addd46Skettenis    text (corefiles do not include text pages) will be first sent to
916*63addd46Skettenis    the core-stratum, fail, and then sent to the object-file where it
917*63addd46Skettenis    will succeed.
918*63addd46Skettenis 
919*63addd46Skettenis    NOTE: cagney/2004-09-30:
920*63addd46Skettenis 
921*63addd46Skettenis    The old code tried to use four separate mechanisms for mapping an
922*63addd46Skettenis    object:offset:len tuple onto an inferior and its address space: the
923*63addd46Skettenis    target stack; the inferior's TO_SECTIONS; solib's SO_LIST;
924*63addd46Skettenis    overlays.
925*63addd46Skettenis 
926*63addd46Skettenis    This is stupid.
927*63addd46Skettenis 
928*63addd46Skettenis    The code below is instead using a single mechanism (currently
929*63addd46Skettenis    strata).  If that mechanism proves insufficient then re-factor it
930*63addd46Skettenis    implementing another singluar mechanism (for instance, a generic
931*63addd46Skettenis    object:annex onto inferior:object:annex say).  */
932*63addd46Skettenis 
933*63addd46Skettenis static LONGEST
xfer_using_stratum(enum target_object object,const char * annex,ULONGEST offset,LONGEST len,void * readbuf,const void * writebuf)934*63addd46Skettenis xfer_using_stratum (enum target_object object, const char *annex,
935*63addd46Skettenis 		    ULONGEST offset, LONGEST len, void *readbuf,
936*63addd46Skettenis 		    const void *writebuf)
937*63addd46Skettenis {
938*63addd46Skettenis   LONGEST xfered;
939*63addd46Skettenis   struct target_ops *target;
940*63addd46Skettenis 
941*63addd46Skettenis   /* Always successful.  */
942*63addd46Skettenis   if (len == 0)
943*63addd46Skettenis     return 0;
944*63addd46Skettenis   /* Never successful.  */
945*63addd46Skettenis   if (target_stack == NULL)
946*63addd46Skettenis     return EIO;
947*63addd46Skettenis 
948*63addd46Skettenis   target = target_stack;
949*63addd46Skettenis   while (1)
950*63addd46Skettenis     {
951*63addd46Skettenis       xfered = target_xfer_partial (target, object, annex,
952*63addd46Skettenis 				    readbuf, writebuf, offset, len);
953*63addd46Skettenis       if (xfered > 0)
954*63addd46Skettenis 	{
955*63addd46Skettenis 	  /* The partial xfer succeeded, update the counts, check that
956*63addd46Skettenis 	     the xfer hasn't finished and if it hasn't set things up
957*63addd46Skettenis 	     for the next round.  */
958*63addd46Skettenis 	  len -= xfered;
959*63addd46Skettenis 	  if (len <= 0)
960*63addd46Skettenis 	    return 0;
961*63addd46Skettenis 	  offset += xfered;
962*63addd46Skettenis 	  if (readbuf != NULL)
963*63addd46Skettenis 	    readbuf = (bfd_byte *) readbuf + xfered;
964*63addd46Skettenis 	  if (writebuf != NULL)
965*63addd46Skettenis 	    writebuf = (bfd_byte *) writebuf + xfered;
966*63addd46Skettenis 	  target = target_stack;
967*63addd46Skettenis 	}
968*63addd46Skettenis       else if (xfered < 0)
969*63addd46Skettenis 	{
970*63addd46Skettenis 	  /* Something totally screwed up, abandon the attempt to
971*63addd46Skettenis 	     xfer.  */
972*63addd46Skettenis 	  if (errno)
973*63addd46Skettenis 	    return errno;
974*63addd46Skettenis 	  else
975*63addd46Skettenis 	    return EIO;
976*63addd46Skettenis 	}
977*63addd46Skettenis       else
978*63addd46Skettenis 	{
979*63addd46Skettenis 	  /* This "stratum" didn't work, try the next one down.  */
980*63addd46Skettenis 	  target = target->beneath;
981*63addd46Skettenis 	  if (target == NULL)
982*63addd46Skettenis 	    return EIO;
983*63addd46Skettenis 	}
984*63addd46Skettenis     }
985*63addd46Skettenis }
986*63addd46Skettenis 
987e93f7393Sniklas /* Read LEN bytes of target memory at address MEMADDR, placing the results in
988e93f7393Sniklas    GDB's memory at MYADDR.  Returns either 0 for success or an errno value
989e93f7393Sniklas    if any error occurs.
990e93f7393Sniklas 
991e93f7393Sniklas    If an error occurs, no guarantee is made about the contents of the data at
992e93f7393Sniklas    MYADDR.  In particular, the caller should not depend upon partial reads
993e93f7393Sniklas    filling the buffer with good data.  There is no way for the caller to know
994e93f7393Sniklas    how much good data might have been transfered anyway.  Callers that can
995e93f7393Sniklas    deal with partial reads should call target_read_memory_partial. */
996e93f7393Sniklas 
997e93f7393Sniklas int
target_read_memory(CORE_ADDR memaddr,char * myaddr,int len)998b725ae77Skettenis target_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
999e93f7393Sniklas {
1000*63addd46Skettenis   if (target_xfer_partial_p ())
1001*63addd46Skettenis     return xfer_using_stratum (TARGET_OBJECT_MEMORY, NULL,
1002*63addd46Skettenis 			       memaddr, len, myaddr, NULL);
1003*63addd46Skettenis   else
1004e93f7393Sniklas     return target_xfer_memory (memaddr, myaddr, len, 0);
1005e93f7393Sniklas }
1006e93f7393Sniklas 
1007e93f7393Sniklas int
target_write_memory(CORE_ADDR memaddr,char * myaddr,int len)1008b725ae77Skettenis target_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
1009e93f7393Sniklas {
1010*63addd46Skettenis   if (target_xfer_partial_p ())
1011*63addd46Skettenis     return xfer_using_stratum (TARGET_OBJECT_MEMORY, NULL,
1012*63addd46Skettenis 			       memaddr, len, NULL, myaddr);
1013*63addd46Skettenis   else
1014e93f7393Sniklas     return target_xfer_memory (memaddr, myaddr, len, 1);
1015e93f7393Sniklas }
1016e93f7393Sniklas 
1017*63addd46Skettenis #ifndef target_stopped_data_address_p
1018*63addd46Skettenis int
target_stopped_data_address_p(struct target_ops * target)1019*63addd46Skettenis target_stopped_data_address_p (struct target_ops *target)
1020*63addd46Skettenis {
1021*63addd46Skettenis   if (target->to_stopped_data_address
1022*63addd46Skettenis       == (int (*) (struct target_ops *, CORE_ADDR *)) return_zero)
1023*63addd46Skettenis     return 0;
1024*63addd46Skettenis   if (target->to_stopped_data_address == debug_to_stopped_data_address
1025*63addd46Skettenis       && (debug_target.to_stopped_data_address
1026*63addd46Skettenis 	  == (int (*) (struct target_ops *, CORE_ADDR *)) return_zero))
1027*63addd46Skettenis     return 0;
1028*63addd46Skettenis   return 1;
1029*63addd46Skettenis }
1030*63addd46Skettenis #endif
1031*63addd46Skettenis 
1032b725ae77Skettenis static int trust_readonly = 0;
1033e93f7393Sniklas 
1034b725ae77Skettenis /* Move memory to or from the targets.  The top target gets priority;
1035b725ae77Skettenis    if it cannot handle it, it is offered to the next one down, etc.
1036b725ae77Skettenis 
1037b725ae77Skettenis    Result is -1 on error, or the number of bytes transfered.  */
1038e93f7393Sniklas 
1039e93f7393Sniklas int
do_xfer_memory(CORE_ADDR memaddr,char * myaddr,int len,int write,struct mem_attrib * attrib)1040b725ae77Skettenis do_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
1041b725ae77Skettenis 		struct mem_attrib *attrib)
1042e93f7393Sniklas {
1043e93f7393Sniklas   int res;
1044b725ae77Skettenis   int done = 0;
1045e93f7393Sniklas   struct target_ops *t;
1046b725ae77Skettenis 
1047b725ae77Skettenis   /* Zero length requests are ok and require no work.  */
1048b725ae77Skettenis   if (len == 0)
1049b725ae77Skettenis     return 0;
1050e93f7393Sniklas 
1051*63addd46Skettenis   /* deprecated_xfer_memory is not guaranteed to set errno, even when
1052*63addd46Skettenis      it returns 0.  */
1053e93f7393Sniklas   errno = 0;
1054e93f7393Sniklas 
1055b725ae77Skettenis   if (!write && trust_readonly)
1056b725ae77Skettenis     {
1057b725ae77Skettenis       struct section_table *secp;
1058b725ae77Skettenis       /* User-settable option, "trust-readonly-sections".  If true,
1059b725ae77Skettenis          then memory from any SEC_READONLY bfd section may be read
1060b725ae77Skettenis          directly from the bfd file.  */
1061b725ae77Skettenis       secp = target_section_by_addr (&current_target, memaddr);
1062b725ae77Skettenis       if (secp != NULL
1063b725ae77Skettenis 	  && (bfd_get_section_flags (secp->bfd, secp->the_bfd_section)
1064b725ae77Skettenis 	      & SEC_READONLY))
1065b725ae77Skettenis 	return xfer_memory (memaddr, myaddr, len, 0, attrib, &current_target);
1066b725ae77Skettenis     }
1067b725ae77Skettenis 
1068b725ae77Skettenis   /* The quick case is that the top target can handle the transfer.  */
1069*63addd46Skettenis   res = current_target.deprecated_xfer_memory
1070b725ae77Skettenis     (memaddr, myaddr, len, write, attrib, &current_target);
1071e93f7393Sniklas 
1072e93f7393Sniklas   /* If res <= 0 then we call it again in the loop.  Ah well. */
1073b725ae77Skettenis   if (res <= 0)
1074e93f7393Sniklas     {
1075b725ae77Skettenis       for (t = target_stack; t != NULL; t = t->beneath)
1076e93f7393Sniklas 	{
1077e93f7393Sniklas 	  if (!t->to_has_memory)
1078e93f7393Sniklas 	    continue;
1079e93f7393Sniklas 
1080*63addd46Skettenis 	  res = t->deprecated_xfer_memory (memaddr, myaddr, len, write, attrib, t);
1081e93f7393Sniklas 	  if (res > 0)
1082e93f7393Sniklas 	    break;		/* Handled all or part of xfer */
1083e93f7393Sniklas 	  if (t->to_has_all_memory)
1084e93f7393Sniklas 	    break;
1085e93f7393Sniklas 	}
1086e93f7393Sniklas 
1087e93f7393Sniklas       if (res <= 0)
1088b725ae77Skettenis 	return -1;
1089b725ae77Skettenis     }
1090b725ae77Skettenis 
1091b725ae77Skettenis   return res;
1092b725ae77Skettenis }
1093b725ae77Skettenis 
1094b725ae77Skettenis 
1095b725ae77Skettenis /* Perform a memory transfer.  Iterate until the entire region has
1096b725ae77Skettenis    been transfered.
1097b725ae77Skettenis 
1098b725ae77Skettenis    Result is 0 or errno value.  */
1099b725ae77Skettenis 
1100b725ae77Skettenis static int
target_xfer_memory(CORE_ADDR memaddr,char * myaddr,int len,int write)1101b725ae77Skettenis target_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write)
1102e93f7393Sniklas {
1103b725ae77Skettenis   int res;
1104b725ae77Skettenis   int reg_len;
1105b725ae77Skettenis   struct mem_region *region;
1106b725ae77Skettenis 
1107b725ae77Skettenis   /* Zero length requests are ok and require no work.  */
1108b725ae77Skettenis   if (len == 0)
1109b725ae77Skettenis     {
1110b725ae77Skettenis       return 0;
1111b725ae77Skettenis     }
1112b725ae77Skettenis 
1113b725ae77Skettenis   while (len > 0)
1114b725ae77Skettenis     {
1115b725ae77Skettenis       region = lookup_mem_region(memaddr);
1116b725ae77Skettenis       if (memaddr + len < region->hi)
1117b725ae77Skettenis 	reg_len = len;
1118b725ae77Skettenis       else
1119b725ae77Skettenis 	reg_len = region->hi - memaddr;
1120b725ae77Skettenis 
1121b725ae77Skettenis       switch (region->attrib.mode)
1122b725ae77Skettenis 	{
1123b725ae77Skettenis 	case MEM_RO:
1124b725ae77Skettenis 	  if (write)
1125b725ae77Skettenis 	    return EIO;
1126b725ae77Skettenis 	  break;
1127b725ae77Skettenis 
1128b725ae77Skettenis 	case MEM_WO:
1129b725ae77Skettenis 	  if (!write)
1130b725ae77Skettenis 	    return EIO;
1131b725ae77Skettenis 	  break;
1132b725ae77Skettenis 	}
1133b725ae77Skettenis 
1134b725ae77Skettenis       while (reg_len > 0)
1135b725ae77Skettenis 	{
1136b725ae77Skettenis 	  if (region->attrib.cache)
1137b725ae77Skettenis 	    res = dcache_xfer_memory (target_dcache, memaddr, myaddr,
1138b725ae77Skettenis 				     reg_len, write);
1139b725ae77Skettenis 	  else
1140b725ae77Skettenis 	    res = do_xfer_memory (memaddr, myaddr, reg_len, write,
1141b725ae77Skettenis 				 &region->attrib);
1142b725ae77Skettenis 
1143b725ae77Skettenis 	  if (res <= 0)
1144b725ae77Skettenis 	    {
1145b725ae77Skettenis 	      /* If this address is for nonexistent memory, read zeros
1146b725ae77Skettenis 		 if reading, or do nothing if writing.  Return
1147b725ae77Skettenis 		 error. */
1148e93f7393Sniklas 	      if (!write)
1149e93f7393Sniklas 		memset (myaddr, 0, len);
1150e93f7393Sniklas 	      if (errno == 0)
1151e93f7393Sniklas 		return EIO;
1152e93f7393Sniklas 	      else
1153e93f7393Sniklas 		return errno;
1154e93f7393Sniklas 	    }
1155b725ae77Skettenis 
1156e93f7393Sniklas 	  memaddr += res;
1157e93f7393Sniklas 	  myaddr  += res;
1158e93f7393Sniklas 	  len     -= res;
1159b725ae77Skettenis 	  reg_len -= res;
1160e93f7393Sniklas 	}
1161b725ae77Skettenis     }
1162b725ae77Skettenis 
1163e93f7393Sniklas   return 0;			/* We managed to cover it all somehow. */
1164e93f7393Sniklas }
1165e93f7393Sniklas 
1166e93f7393Sniklas 
1167b725ae77Skettenis /* Perform a partial memory transfer.
1168b725ae77Skettenis 
1169b725ae77Skettenis    Result is -1 on error, or the number of bytes transfered.  */
1170b725ae77Skettenis 
1171b725ae77Skettenis static int
target_xfer_memory_partial(CORE_ADDR memaddr,char * myaddr,int len,int write_p,int * err)1172b725ae77Skettenis target_xfer_memory_partial (CORE_ADDR memaddr, char *myaddr, int len,
1173b725ae77Skettenis 			    int write_p, int *err)
1174b725ae77Skettenis {
1175b725ae77Skettenis   int res;
1176b725ae77Skettenis   int reg_len;
1177b725ae77Skettenis   struct mem_region *region;
1178b725ae77Skettenis 
1179b725ae77Skettenis   /* Zero length requests are ok and require no work.  */
1180b725ae77Skettenis   if (len == 0)
1181b725ae77Skettenis     {
1182b725ae77Skettenis       *err = 0;
1183b725ae77Skettenis       return 0;
1184b725ae77Skettenis     }
1185b725ae77Skettenis 
1186b725ae77Skettenis   region = lookup_mem_region(memaddr);
1187b725ae77Skettenis   if (memaddr + len < region->hi)
1188b725ae77Skettenis     reg_len = len;
1189b725ae77Skettenis   else
1190b725ae77Skettenis     reg_len = region->hi - memaddr;
1191b725ae77Skettenis 
1192b725ae77Skettenis   switch (region->attrib.mode)
1193b725ae77Skettenis     {
1194b725ae77Skettenis     case MEM_RO:
1195b725ae77Skettenis       if (write_p)
1196b725ae77Skettenis 	{
1197b725ae77Skettenis 	  *err = EIO;
1198b725ae77Skettenis 	  return -1;
1199b725ae77Skettenis 	}
1200b725ae77Skettenis       break;
1201b725ae77Skettenis 
1202b725ae77Skettenis     case MEM_WO:
1203b725ae77Skettenis       if (write_p)
1204b725ae77Skettenis 	{
1205b725ae77Skettenis 	  *err = EIO;
1206b725ae77Skettenis 	  return -1;
1207b725ae77Skettenis 	}
1208b725ae77Skettenis       break;
1209b725ae77Skettenis     }
1210b725ae77Skettenis 
1211b725ae77Skettenis   if (region->attrib.cache)
1212b725ae77Skettenis     res = dcache_xfer_memory (target_dcache, memaddr, myaddr,
1213b725ae77Skettenis 			      reg_len, write_p);
1214b725ae77Skettenis   else
1215b725ae77Skettenis     res = do_xfer_memory (memaddr, myaddr, reg_len, write_p,
1216b725ae77Skettenis 			  &region->attrib);
1217b725ae77Skettenis 
1218b725ae77Skettenis   if (res <= 0)
1219b725ae77Skettenis     {
1220b725ae77Skettenis       if (errno != 0)
1221b725ae77Skettenis 	*err = errno;
1222b725ae77Skettenis       else
1223b725ae77Skettenis 	*err = EIO;
1224b725ae77Skettenis 
1225b725ae77Skettenis         return -1;
1226b725ae77Skettenis     }
1227b725ae77Skettenis 
1228b725ae77Skettenis   *err = 0;
1229b725ae77Skettenis   return res;
1230b725ae77Skettenis }
1231b725ae77Skettenis 
1232b725ae77Skettenis int
target_read_memory_partial(CORE_ADDR memaddr,char * buf,int len,int * err)1233b725ae77Skettenis target_read_memory_partial (CORE_ADDR memaddr, char *buf, int len, int *err)
1234b725ae77Skettenis {
1235*63addd46Skettenis   if (target_xfer_partial_p ())
1236*63addd46Skettenis     return target_xfer_partial (target_stack, TARGET_OBJECT_MEMORY, NULL,
1237*63addd46Skettenis 				buf, NULL, memaddr, len);
1238*63addd46Skettenis   else
1239b725ae77Skettenis     return target_xfer_memory_partial (memaddr, buf, len, 0, err);
1240b725ae77Skettenis }
1241b725ae77Skettenis 
1242b725ae77Skettenis int
target_write_memory_partial(CORE_ADDR memaddr,char * buf,int len,int * err)1243b725ae77Skettenis target_write_memory_partial (CORE_ADDR memaddr, char *buf, int len, int *err)
1244b725ae77Skettenis {
1245*63addd46Skettenis   if (target_xfer_partial_p ())
1246*63addd46Skettenis     return target_xfer_partial (target_stack, TARGET_OBJECT_MEMORY, NULL,
1247*63addd46Skettenis 				NULL, buf, memaddr, len);
1248*63addd46Skettenis   else
1249b725ae77Skettenis     return target_xfer_memory_partial (memaddr, buf, len, 1, err);
1250b725ae77Skettenis }
1251b725ae77Skettenis 
1252b725ae77Skettenis /* More generic transfers.  */
1253b725ae77Skettenis 
1254b725ae77Skettenis static LONGEST
default_xfer_partial(struct target_ops * ops,enum target_object object,const char * annex,void * readbuf,const void * writebuf,ULONGEST offset,LONGEST len)1255b725ae77Skettenis default_xfer_partial (struct target_ops *ops, enum target_object object,
1256b725ae77Skettenis 		      const char *annex, void *readbuf,
1257b725ae77Skettenis 		      const void *writebuf, ULONGEST offset, LONGEST len)
1258b725ae77Skettenis {
1259b725ae77Skettenis   if (object == TARGET_OBJECT_MEMORY
1260*63addd46Skettenis       && ops->deprecated_xfer_memory != NULL)
1261*63addd46Skettenis     /* If available, fall back to the target's
1262*63addd46Skettenis        "deprecated_xfer_memory" method.  */
1263b725ae77Skettenis     {
1264b725ae77Skettenis       int xfered = -1;
1265b725ae77Skettenis       errno = 0;
1266b725ae77Skettenis       if (writebuf != NULL)
1267b725ae77Skettenis 	{
1268b725ae77Skettenis 	  void *buffer = xmalloc (len);
1269b725ae77Skettenis 	  struct cleanup *cleanup = make_cleanup (xfree, buffer);
1270b725ae77Skettenis 	  memcpy (buffer, writebuf, len);
1271*63addd46Skettenis 	  xfered = ops->deprecated_xfer_memory (offset, buffer, len,
1272*63addd46Skettenis 						1/*write*/, NULL, ops);
1273b725ae77Skettenis 	  do_cleanups (cleanup);
1274b725ae77Skettenis 	}
1275b725ae77Skettenis       if (readbuf != NULL)
1276*63addd46Skettenis 	xfered = ops->deprecated_xfer_memory (offset, readbuf, len, 0/*read*/,
1277*63addd46Skettenis 					      NULL, ops);
1278b725ae77Skettenis       if (xfered > 0)
1279b725ae77Skettenis 	return xfered;
1280b725ae77Skettenis       else if (xfered == 0 && errno == 0)
1281*63addd46Skettenis 	/* "deprecated_xfer_memory" uses 0, cross checked against
1282*63addd46Skettenis            ERRNO as one indication of an error.  */
1283b725ae77Skettenis 	return 0;
1284b725ae77Skettenis       else
1285b725ae77Skettenis 	return -1;
1286b725ae77Skettenis     }
1287b725ae77Skettenis   else if (ops->beneath != NULL)
1288*63addd46Skettenis     return target_xfer_partial (ops->beneath, object, annex,
1289b725ae77Skettenis 				readbuf, writebuf, offset, len);
1290b725ae77Skettenis   else
1291b725ae77Skettenis     return -1;
1292b725ae77Skettenis }
1293b725ae77Skettenis 
1294b725ae77Skettenis /* Target vector read/write partial wrapper functions.
1295b725ae77Skettenis 
1296b725ae77Skettenis    NOTE: cagney/2003-10-21: I wonder if having "to_xfer_partial
1297b725ae77Skettenis    (inbuf, outbuf)", instead of separate read/write methods, make life
1298b725ae77Skettenis    easier.  */
1299b725ae77Skettenis 
1300b725ae77Skettenis LONGEST
target_read_partial(struct target_ops * ops,enum target_object object,const char * annex,void * buf,ULONGEST offset,LONGEST len)1301b725ae77Skettenis target_read_partial (struct target_ops *ops,
1302b725ae77Skettenis 		     enum target_object object,
1303b725ae77Skettenis 		     const char *annex, void *buf,
1304b725ae77Skettenis 		     ULONGEST offset, LONGEST len)
1305b725ae77Skettenis {
1306*63addd46Skettenis   return target_xfer_partial (ops, object, annex, buf, NULL, offset, len);
1307b725ae77Skettenis }
1308b725ae77Skettenis 
1309b725ae77Skettenis LONGEST
target_write_partial(struct target_ops * ops,enum target_object object,const char * annex,const void * buf,ULONGEST offset,LONGEST len)1310b725ae77Skettenis target_write_partial (struct target_ops *ops,
1311b725ae77Skettenis 		      enum target_object object,
1312b725ae77Skettenis 		      const char *annex, const void *buf,
1313b725ae77Skettenis 		      ULONGEST offset, LONGEST len)
1314b725ae77Skettenis {
1315*63addd46Skettenis   return target_xfer_partial (ops, object, annex, NULL, buf, offset, len);
1316b725ae77Skettenis }
1317b725ae77Skettenis 
1318b725ae77Skettenis /* Wrappers to perform the full transfer.  */
1319b725ae77Skettenis LONGEST
target_read(struct target_ops * ops,enum target_object object,const char * annex,void * buf,ULONGEST offset,LONGEST len)1320b725ae77Skettenis target_read (struct target_ops *ops,
1321b725ae77Skettenis 	     enum target_object object,
1322b725ae77Skettenis 	     const char *annex, void *buf,
1323b725ae77Skettenis 	     ULONGEST offset, LONGEST len)
1324b725ae77Skettenis {
1325b725ae77Skettenis   LONGEST xfered = 0;
1326b725ae77Skettenis   while (xfered < len)
1327b725ae77Skettenis     {
1328b725ae77Skettenis       LONGEST xfer = target_read_partial (ops, object, annex,
1329b725ae77Skettenis 					  (bfd_byte *) buf + xfered,
1330b725ae77Skettenis 					  offset + xfered, len - xfered);
1331b725ae77Skettenis       /* Call an observer, notifying them of the xfer progress?  */
1332b725ae77Skettenis       if (xfer <= 0)
1333b725ae77Skettenis 	/* Call memory_error?  */
1334b725ae77Skettenis 	return -1;
1335b725ae77Skettenis       xfered += xfer;
1336b725ae77Skettenis       QUIT;
1337b725ae77Skettenis     }
1338b725ae77Skettenis   return len;
1339b725ae77Skettenis }
1340b725ae77Skettenis 
1341b725ae77Skettenis LONGEST
target_write(struct target_ops * ops,enum target_object object,const char * annex,const void * buf,ULONGEST offset,LONGEST len)1342b725ae77Skettenis target_write (struct target_ops *ops,
1343b725ae77Skettenis 	      enum target_object object,
1344b725ae77Skettenis 	      const char *annex, const void *buf,
1345b725ae77Skettenis 	      ULONGEST offset, LONGEST len)
1346b725ae77Skettenis {
1347b725ae77Skettenis   LONGEST xfered = 0;
1348b725ae77Skettenis   while (xfered < len)
1349b725ae77Skettenis     {
1350b725ae77Skettenis       LONGEST xfer = target_write_partial (ops, object, annex,
1351b725ae77Skettenis 					   (bfd_byte *) buf + xfered,
1352b725ae77Skettenis 					   offset + xfered, len - xfered);
1353b725ae77Skettenis       /* Call an observer, notifying them of the xfer progress?  */
1354b725ae77Skettenis       if (xfer <= 0)
1355b725ae77Skettenis 	/* Call memory_error?  */
1356b725ae77Skettenis 	return -1;
1357b725ae77Skettenis       xfered += xfer;
1358b725ae77Skettenis       QUIT;
1359b725ae77Skettenis     }
1360b725ae77Skettenis   return len;
1361b725ae77Skettenis }
1362b725ae77Skettenis 
1363b725ae77Skettenis /* Memory transfer methods.  */
1364b725ae77Skettenis 
1365b725ae77Skettenis void
get_target_memory(struct target_ops * ops,CORE_ADDR addr,void * buf,LONGEST len)1366b725ae77Skettenis get_target_memory (struct target_ops *ops, CORE_ADDR addr, void *buf,
1367b725ae77Skettenis 		   LONGEST len)
1368b725ae77Skettenis {
1369b725ae77Skettenis   if (target_read (ops, TARGET_OBJECT_MEMORY, NULL, buf, addr, len)
1370b725ae77Skettenis       != len)
1371b725ae77Skettenis     memory_error (EIO, addr);
1372b725ae77Skettenis }
1373b725ae77Skettenis 
1374b725ae77Skettenis ULONGEST
get_target_memory_unsigned(struct target_ops * ops,CORE_ADDR addr,int len)1375b725ae77Skettenis get_target_memory_unsigned (struct target_ops *ops,
1376b725ae77Skettenis 			    CORE_ADDR addr, int len)
1377b725ae77Skettenis {
1378b725ae77Skettenis   char buf[sizeof (ULONGEST)];
1379b725ae77Skettenis 
1380b725ae77Skettenis   gdb_assert (len <= sizeof (buf));
1381b725ae77Skettenis   get_target_memory (ops, addr, buf, len);
1382b725ae77Skettenis   return extract_unsigned_integer (buf, len);
1383b725ae77Skettenis }
1384b725ae77Skettenis 
1385e93f7393Sniklas static void
target_info(char * args,int from_tty)1386b725ae77Skettenis target_info (char *args, int from_tty)
1387e93f7393Sniklas {
1388e93f7393Sniklas   struct target_ops *t;
1389e93f7393Sniklas   int has_all_mem = 0;
1390e93f7393Sniklas 
1391e93f7393Sniklas   if (symfile_objfile != NULL)
1392e93f7393Sniklas     printf_unfiltered ("Symbols from \"%s\".\n", symfile_objfile->name);
1393e93f7393Sniklas 
1394b725ae77Skettenis   for (t = target_stack; t != NULL; t = t->beneath)
1395e93f7393Sniklas     {
1396e93f7393Sniklas       if (!t->to_has_memory)
1397e93f7393Sniklas 	continue;
1398e93f7393Sniklas 
1399e93f7393Sniklas       if ((int) (t->to_stratum) <= (int) dummy_stratum)
1400e93f7393Sniklas 	continue;
1401e93f7393Sniklas       if (has_all_mem)
1402e93f7393Sniklas 	printf_unfiltered ("\tWhile running this, GDB does not access memory from...\n");
1403e93f7393Sniklas       printf_unfiltered ("%s:\n", t->to_longname);
1404e93f7393Sniklas       (t->to_files_info) (t);
1405e93f7393Sniklas       has_all_mem = t->to_has_all_memory;
1406e93f7393Sniklas     }
1407e93f7393Sniklas }
1408e93f7393Sniklas 
1409e93f7393Sniklas /* This is to be called by the open routine before it does
1410e93f7393Sniklas    anything.  */
1411e93f7393Sniklas 
1412e93f7393Sniklas void
target_preopen(int from_tty)1413b725ae77Skettenis target_preopen (int from_tty)
1414e93f7393Sniklas {
1415e93f7393Sniklas   dont_repeat ();
1416e93f7393Sniklas 
1417e93f7393Sniklas   if (target_has_execution)
1418e93f7393Sniklas     {
1419b725ae77Skettenis       if (!from_tty
1420b725ae77Skettenis           || query ("A program is being debugged already.  Kill it? "))
1421e93f7393Sniklas 	target_kill ();
1422e93f7393Sniklas       else
1423e93f7393Sniklas 	error ("Program not killed.");
1424e93f7393Sniklas     }
1425e93f7393Sniklas 
1426e93f7393Sniklas   /* Calling target_kill may remove the target from the stack.  But if
1427e93f7393Sniklas      it doesn't (which seems like a win for UDI), remove it now.  */
1428e93f7393Sniklas 
1429e93f7393Sniklas   if (target_has_execution)
1430e93f7393Sniklas     pop_target ();
1431e93f7393Sniklas }
1432e93f7393Sniklas 
1433e93f7393Sniklas /* Detach a target after doing deferred register stores.  */
1434e93f7393Sniklas 
1435e93f7393Sniklas void
target_detach(char * args,int from_tty)1436b725ae77Skettenis target_detach (char *args, int from_tty)
1437e93f7393Sniklas {
1438e93f7393Sniklas   (current_target.to_detach) (args, from_tty);
1439e93f7393Sniklas }
1440e93f7393Sniklas 
1441e93f7393Sniklas void
target_disconnect(char * args,int from_tty)1442b725ae77Skettenis target_disconnect (char *args, int from_tty)
1443e93f7393Sniklas {
1444b725ae77Skettenis   (current_target.to_disconnect) (args, from_tty);
1445b725ae77Skettenis }
1446b725ae77Skettenis 
1447b725ae77Skettenis void
target_link(char * modname,CORE_ADDR * t_reloc)1448b725ae77Skettenis target_link (char *modname, CORE_ADDR *t_reloc)
1449b725ae77Skettenis {
1450b725ae77Skettenis   if (DEPRECATED_STREQ (current_target.to_shortname, "rombug"))
1451e93f7393Sniklas     {
1452e93f7393Sniklas       (current_target.to_lookup_symbol) (modname, t_reloc);
1453e93f7393Sniklas       if (*t_reloc == 0)
1454e93f7393Sniklas 	error ("Unable to link to %s and get relocation in rombug", modname);
1455e93f7393Sniklas     }
1456e93f7393Sniklas   else
1457e93f7393Sniklas     *t_reloc = (CORE_ADDR) -1;
1458e93f7393Sniklas }
1459e93f7393Sniklas 
1460b725ae77Skettenis int
target_async_mask(int mask)1461b725ae77Skettenis target_async_mask (int mask)
1462b725ae77Skettenis {
1463b725ae77Skettenis   int saved_async_masked_status = target_async_mask_value;
1464b725ae77Skettenis   target_async_mask_value = mask;
1465b725ae77Skettenis   return saved_async_masked_status;
1466b725ae77Skettenis }
1467b725ae77Skettenis 
1468e93f7393Sniklas /* Look through the list of possible targets for a target that can
1469e93f7393Sniklas    execute a run or attach command without any other data.  This is
1470e93f7393Sniklas    used to locate the default process stratum.
1471e93f7393Sniklas 
1472e93f7393Sniklas    Result is always valid (error() is called for errors).  */
1473e93f7393Sniklas 
1474e93f7393Sniklas static struct target_ops *
find_default_run_target(char * do_mesg)1475b725ae77Skettenis find_default_run_target (char *do_mesg)
1476e93f7393Sniklas {
1477e93f7393Sniklas   struct target_ops **t;
1478e93f7393Sniklas   struct target_ops *runable = NULL;
1479e93f7393Sniklas   int count;
1480e93f7393Sniklas 
1481e93f7393Sniklas   count = 0;
1482e93f7393Sniklas 
1483e93f7393Sniklas   for (t = target_structs; t < target_structs + target_struct_size;
1484e93f7393Sniklas        ++t)
1485e93f7393Sniklas     {
1486e93f7393Sniklas       if ((*t)->to_can_run && target_can_run (*t))
1487e93f7393Sniklas 	{
1488e93f7393Sniklas 	  runable = *t;
1489e93f7393Sniklas 	  ++count;
1490e93f7393Sniklas 	}
1491e93f7393Sniklas     }
1492e93f7393Sniklas 
1493e93f7393Sniklas   if (count != 1)
1494e93f7393Sniklas     error ("Don't know how to %s.  Try \"help target\".", do_mesg);
1495e93f7393Sniklas 
1496e93f7393Sniklas   return runable;
1497e93f7393Sniklas }
1498e93f7393Sniklas 
1499e93f7393Sniklas void
find_default_attach(char * args,int from_tty)1500b725ae77Skettenis find_default_attach (char *args, int from_tty)
1501e93f7393Sniklas {
1502e93f7393Sniklas   struct target_ops *t;
1503e93f7393Sniklas 
1504e93f7393Sniklas   t = find_default_run_target ("attach");
1505e93f7393Sniklas   (t->to_attach) (args, from_tty);
1506e93f7393Sniklas   return;
1507e93f7393Sniklas }
1508e93f7393Sniklas 
1509e93f7393Sniklas void
find_default_create_inferior(char * exec_file,char * allargs,char ** env,int from_tty)1510*63addd46Skettenis find_default_create_inferior (char *exec_file, char *allargs, char **env,
1511*63addd46Skettenis 			      int from_tty)
1512e93f7393Sniklas {
1513e93f7393Sniklas   struct target_ops *t;
1514e93f7393Sniklas 
1515e93f7393Sniklas   t = find_default_run_target ("run");
1516*63addd46Skettenis   (t->to_create_inferior) (exec_file, allargs, env, from_tty);
1517e93f7393Sniklas   return;
1518e93f7393Sniklas }
1519e93f7393Sniklas 
1520e93f7393Sniklas static int
default_region_size_ok_for_hw_watchpoint(int byte_count)1521b725ae77Skettenis default_region_size_ok_for_hw_watchpoint (int byte_count)
1522b725ae77Skettenis {
1523b725ae77Skettenis   return (byte_count <= TYPE_LENGTH (builtin_type_void_data_ptr));
1524b725ae77Skettenis }
1525b725ae77Skettenis 
1526b725ae77Skettenis static int
return_zero(void)1527b725ae77Skettenis return_zero (void)
1528e93f7393Sniklas {
1529e93f7393Sniklas   return 0;
1530e93f7393Sniklas }
1531e93f7393Sniklas 
1532b725ae77Skettenis static int
return_one(void)1533b725ae77Skettenis return_one (void)
1534b725ae77Skettenis {
1535b725ae77Skettenis   return 1;
1536b725ae77Skettenis }
1537b725ae77Skettenis 
1538b725ae77Skettenis static int
return_minus_one(void)1539b725ae77Skettenis return_minus_one (void)
1540b725ae77Skettenis {
1541b725ae77Skettenis   return -1;
1542b725ae77Skettenis }
1543b725ae77Skettenis 
1544b725ae77Skettenis /*
1545b725ae77Skettenis  * Resize the to_sections pointer.  Also make sure that anyone that
1546b725ae77Skettenis  * was holding on to an old value of it gets updated.
1547b725ae77Skettenis  * Returns the old size.
1548b725ae77Skettenis  */
1549b725ae77Skettenis 
1550b725ae77Skettenis int
target_resize_to_sections(struct target_ops * target,int num_added)1551b725ae77Skettenis target_resize_to_sections (struct target_ops *target, int num_added)
1552b725ae77Skettenis {
1553b725ae77Skettenis   struct target_ops **t;
1554b725ae77Skettenis   struct section_table *old_value;
1555b725ae77Skettenis   int old_count;
1556b725ae77Skettenis 
1557b725ae77Skettenis   old_value = target->to_sections;
1558b725ae77Skettenis 
1559b725ae77Skettenis   if (target->to_sections)
1560b725ae77Skettenis     {
1561b725ae77Skettenis       old_count = target->to_sections_end - target->to_sections;
1562b725ae77Skettenis       target->to_sections = (struct section_table *)
1563b725ae77Skettenis 	xrealloc ((char *) target->to_sections,
1564b725ae77Skettenis 		  (sizeof (struct section_table)) * (num_added + old_count));
1565b725ae77Skettenis     }
1566b725ae77Skettenis   else
1567b725ae77Skettenis     {
1568b725ae77Skettenis       old_count = 0;
1569b725ae77Skettenis       target->to_sections = (struct section_table *)
1570b725ae77Skettenis 	xmalloc ((sizeof (struct section_table)) * num_added);
1571b725ae77Skettenis     }
1572b725ae77Skettenis   target->to_sections_end = target->to_sections + (num_added + old_count);
1573b725ae77Skettenis 
1574b725ae77Skettenis   /* Check to see if anyone else was pointing to this structure.
1575b725ae77Skettenis      If old_value was null, then no one was. */
1576b725ae77Skettenis 
1577b725ae77Skettenis   if (old_value)
1578b725ae77Skettenis     {
1579b725ae77Skettenis       for (t = target_structs; t < target_structs + target_struct_size;
1580b725ae77Skettenis 	   ++t)
1581b725ae77Skettenis 	{
1582b725ae77Skettenis 	  if ((*t)->to_sections == old_value)
1583b725ae77Skettenis 	    {
1584b725ae77Skettenis 	      (*t)->to_sections = target->to_sections;
1585b725ae77Skettenis 	      (*t)->to_sections_end = target->to_sections_end;
1586b725ae77Skettenis 	    }
1587b725ae77Skettenis 	}
1588*63addd46Skettenis       /* There is a flattened view of the target stack in current_target,
1589*63addd46Skettenis 	 so its to_sections pointer might also need updating. */
1590*63addd46Skettenis       if (current_target.to_sections == old_value)
1591*63addd46Skettenis 	{
1592*63addd46Skettenis 	  current_target.to_sections = target->to_sections;
1593*63addd46Skettenis 	  current_target.to_sections_end = target->to_sections_end;
1594*63addd46Skettenis 	}
1595b725ae77Skettenis     }
1596b725ae77Skettenis 
1597b725ae77Skettenis   return old_count;
1598b725ae77Skettenis 
1599b725ae77Skettenis }
1600b725ae77Skettenis 
1601b725ae77Skettenis /* Remove all target sections taken from ABFD.
1602b725ae77Skettenis 
1603b725ae77Skettenis    Scan the current target stack for targets whose section tables
1604b725ae77Skettenis    refer to sections from BFD, and remove those sections.  We use this
1605b725ae77Skettenis    when we notice that the inferior has unloaded a shared object, for
1606b725ae77Skettenis    example.  */
1607b725ae77Skettenis void
remove_target_sections(bfd * abfd)1608b725ae77Skettenis remove_target_sections (bfd *abfd)
1609b725ae77Skettenis {
1610b725ae77Skettenis   struct target_ops **t;
1611b725ae77Skettenis 
1612b725ae77Skettenis   for (t = target_structs; t < target_structs + target_struct_size; t++)
1613b725ae77Skettenis     {
1614b725ae77Skettenis       struct section_table *src, *dest;
1615b725ae77Skettenis 
1616b725ae77Skettenis       dest = (*t)->to_sections;
1617b725ae77Skettenis       for (src = (*t)->to_sections; src < (*t)->to_sections_end; src++)
1618b725ae77Skettenis 	if (src->bfd != abfd)
1619b725ae77Skettenis 	  {
1620b725ae77Skettenis 	    /* Keep this section.  */
1621b725ae77Skettenis 	    if (dest < src) *dest = *src;
1622b725ae77Skettenis 	    dest++;
1623b725ae77Skettenis 	  }
1624b725ae77Skettenis 
1625b725ae77Skettenis       /* If we've dropped any sections, resize the section table.  */
1626b725ae77Skettenis       if (dest < src)
1627b725ae77Skettenis 	target_resize_to_sections (*t, dest - src);
1628b725ae77Skettenis     }
1629b725ae77Skettenis }
1630b725ae77Skettenis 
1631b725ae77Skettenis 
1632b725ae77Skettenis 
1633b725ae77Skettenis 
1634b725ae77Skettenis /* Find a single runnable target in the stack and return it.  If for
1635b725ae77Skettenis    some reason there is more than one, return NULL.  */
1636b725ae77Skettenis 
1637e93f7393Sniklas struct target_ops *
find_run_target(void)1638b725ae77Skettenis find_run_target (void)
1639b725ae77Skettenis {
1640b725ae77Skettenis   struct target_ops **t;
1641b725ae77Skettenis   struct target_ops *runable = NULL;
1642b725ae77Skettenis   int count;
1643b725ae77Skettenis 
1644b725ae77Skettenis   count = 0;
1645b725ae77Skettenis 
1646b725ae77Skettenis   for (t = target_structs; t < target_structs + target_struct_size; ++t)
1647b725ae77Skettenis     {
1648b725ae77Skettenis       if ((*t)->to_can_run && target_can_run (*t))
1649b725ae77Skettenis 	{
1650b725ae77Skettenis 	  runable = *t;
1651b725ae77Skettenis 	  ++count;
1652b725ae77Skettenis 	}
1653b725ae77Skettenis     }
1654b725ae77Skettenis 
1655b725ae77Skettenis   return (count == 1 ? runable : NULL);
1656b725ae77Skettenis }
1657b725ae77Skettenis 
1658b725ae77Skettenis /* Find a single core_stratum target in the list of targets and return it.
1659b725ae77Skettenis    If for some reason there is more than one, return NULL.  */
1660b725ae77Skettenis 
1661b725ae77Skettenis struct target_ops *
find_core_target(void)1662b725ae77Skettenis find_core_target (void)
1663e93f7393Sniklas {
1664e93f7393Sniklas   struct target_ops **t;
1665e93f7393Sniklas   struct target_ops *runable = NULL;
1666e93f7393Sniklas   int count;
1667e93f7393Sniklas 
1668e93f7393Sniklas   count = 0;
1669e93f7393Sniklas 
1670e93f7393Sniklas   for (t = target_structs; t < target_structs + target_struct_size;
1671e93f7393Sniklas        ++t)
1672e93f7393Sniklas     {
1673e93f7393Sniklas       if ((*t)->to_stratum == core_stratum)
1674e93f7393Sniklas 	{
1675e93f7393Sniklas 	  runable = *t;
1676e93f7393Sniklas 	  ++count;
1677e93f7393Sniklas 	}
1678e93f7393Sniklas     }
1679e93f7393Sniklas 
1680e93f7393Sniklas   return (count == 1 ? runable : NULL);
1681e93f7393Sniklas }
1682b725ae77Skettenis 
1683b725ae77Skettenis /*
1684b725ae77Skettenis  * Find the next target down the stack from the specified target.
1685b725ae77Skettenis  */
1686b725ae77Skettenis 
1687b725ae77Skettenis struct target_ops *
find_target_beneath(struct target_ops * t)1688b725ae77Skettenis find_target_beneath (struct target_ops *t)
1689b725ae77Skettenis {
1690b725ae77Skettenis   return t->beneath;
1691b725ae77Skettenis }
1692b725ae77Skettenis 
1693e93f7393Sniklas 
1694e93f7393Sniklas /* The inferior process has died.  Long live the inferior!  */
1695e93f7393Sniklas 
1696e93f7393Sniklas void
generic_mourn_inferior(void)1697b725ae77Skettenis generic_mourn_inferior (void)
1698e93f7393Sniklas {
1699e93f7393Sniklas   extern int show_breakpoint_hit_counts;
1700e93f7393Sniklas 
1701b725ae77Skettenis   inferior_ptid = null_ptid;
1702e93f7393Sniklas   attach_flag = 0;
1703b725ae77Skettenis   breakpoint_init_inferior (inf_exited);
1704e93f7393Sniklas   registers_changed ();
1705e93f7393Sniklas 
1706e93f7393Sniklas   reopen_exec_file ();
1707e93f7393Sniklas   reinit_frame_cache ();
1708e93f7393Sniklas 
1709e93f7393Sniklas   /* It is confusing to the user for ignore counts to stick around
1710e93f7393Sniklas      from previous runs of the inferior.  So clear them.  */
1711e93f7393Sniklas   /* However, it is more confusing for the ignore counts to disappear when
1712e93f7393Sniklas      using hit counts.  So don't clear them if we're counting hits.  */
1713e93f7393Sniklas   if (!show_breakpoint_hit_counts)
1714e93f7393Sniklas     breakpoint_clear_ignore_counts ();
1715b725ae77Skettenis 
1716*63addd46Skettenis   if (deprecated_detach_hook)
1717*63addd46Skettenis     deprecated_detach_hook ();
1718e93f7393Sniklas }
1719e93f7393Sniklas 
1720e93f7393Sniklas /* Helper function for child_wait and the Lynx derivatives of child_wait.
1721e93f7393Sniklas    HOSTSTATUS is the waitstatus from wait() or the equivalent; store our
1722e93f7393Sniklas    translation of that in OURSTATUS.  */
1723e93f7393Sniklas void
store_waitstatus(struct target_waitstatus * ourstatus,int hoststatus)1724b725ae77Skettenis store_waitstatus (struct target_waitstatus *ourstatus, int hoststatus)
1725e93f7393Sniklas {
1726e93f7393Sniklas #ifdef CHILD_SPECIAL_WAITSTATUS
1727e93f7393Sniklas   /* CHILD_SPECIAL_WAITSTATUS should return nonzero and set *OURSTATUS
1728e93f7393Sniklas      if it wants to deal with hoststatus.  */
1729e93f7393Sniklas   if (CHILD_SPECIAL_WAITSTATUS (ourstatus, hoststatus))
1730e93f7393Sniklas     return;
1731e93f7393Sniklas #endif
1732e93f7393Sniklas 
1733e93f7393Sniklas   if (WIFEXITED (hoststatus))
1734e93f7393Sniklas     {
1735e93f7393Sniklas       ourstatus->kind = TARGET_WAITKIND_EXITED;
1736e93f7393Sniklas       ourstatus->value.integer = WEXITSTATUS (hoststatus);
1737e93f7393Sniklas     }
1738e93f7393Sniklas   else if (!WIFSTOPPED (hoststatus))
1739e93f7393Sniklas     {
1740e93f7393Sniklas       ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
1741e93f7393Sniklas       ourstatus->value.sig = target_signal_from_host (WTERMSIG (hoststatus));
1742e93f7393Sniklas     }
1743e93f7393Sniklas   else
1744e93f7393Sniklas     {
1745e93f7393Sniklas       ourstatus->kind = TARGET_WAITKIND_STOPPED;
1746e93f7393Sniklas       ourstatus->value.sig = target_signal_from_host (WSTOPSIG (hoststatus));
1747e93f7393Sniklas     }
1748e93f7393Sniklas }
1749e93f7393Sniklas 
1750e93f7393Sniklas /* Returns zero to leave the inferior alone, one to interrupt it.  */
1751b725ae77Skettenis int (*target_activity_function) (void);
1752e93f7393Sniklas int target_activity_fd;
1753e93f7393Sniklas 
1754e93f7393Sniklas /* Convert a normal process ID to a string.  Returns the string in a static
1755e93f7393Sniklas    buffer.  */
1756e93f7393Sniklas 
1757e93f7393Sniklas char *
normal_pid_to_str(ptid_t ptid)1758b725ae77Skettenis normal_pid_to_str (ptid_t ptid)
1759e93f7393Sniklas {
1760e93f7393Sniklas   static char buf[30];
1761e93f7393Sniklas 
1762b725ae77Skettenis   sprintf (buf, "process %d", PIDGET (ptid));
1763e93f7393Sniklas   return buf;
1764e93f7393Sniklas }
1765b725ae77Skettenis 
1766b725ae77Skettenis /* Error-catcher for target_find_memory_regions */
dummy_find_memory_regions(int (* ignore1)(),void * ignore2)1767b725ae77Skettenis static int dummy_find_memory_regions (int (*ignore1) (), void *ignore2)
1768b725ae77Skettenis {
1769b725ae77Skettenis   error ("No target.");
1770b725ae77Skettenis   return 0;
1771b725ae77Skettenis }
1772b725ae77Skettenis 
1773b725ae77Skettenis /* Error-catcher for target_make_corefile_notes */
dummy_make_corefile_notes(bfd * ignore1,int * ignore2)1774b725ae77Skettenis static char * dummy_make_corefile_notes (bfd *ignore1, int *ignore2)
1775b725ae77Skettenis {
1776b725ae77Skettenis   error ("No target.");
1777b725ae77Skettenis   return NULL;
1778b725ae77Skettenis }
1779b725ae77Skettenis 
1780b725ae77Skettenis /* Set up the handful of non-empty slots needed by the dummy target
1781b725ae77Skettenis    vector.  */
1782b725ae77Skettenis 
1783b725ae77Skettenis static void
init_dummy_target(void)1784b725ae77Skettenis init_dummy_target (void)
1785b725ae77Skettenis {
1786b725ae77Skettenis   dummy_target.to_shortname = "None";
1787b725ae77Skettenis   dummy_target.to_longname = "None";
1788b725ae77Skettenis   dummy_target.to_doc = "";
1789b725ae77Skettenis   dummy_target.to_attach = find_default_attach;
1790b725ae77Skettenis   dummy_target.to_create_inferior = find_default_create_inferior;
1791b725ae77Skettenis   dummy_target.to_pid_to_str = normal_pid_to_str;
1792b725ae77Skettenis   dummy_target.to_stratum = dummy_stratum;
1793b725ae77Skettenis   dummy_target.to_find_memory_regions = dummy_find_memory_regions;
1794b725ae77Skettenis   dummy_target.to_make_corefile_notes = dummy_make_corefile_notes;
1795b725ae77Skettenis   dummy_target.to_xfer_partial = default_xfer_partial;
1796b725ae77Skettenis   dummy_target.to_magic = OPS_MAGIC;
1797b725ae77Skettenis }
1798e93f7393Sniklas 
1799e93f7393Sniklas static void
debug_to_open(char * args,int from_tty)1800b725ae77Skettenis debug_to_open (char *args, int from_tty)
1801e93f7393Sniklas {
1802e93f7393Sniklas   debug_target.to_open (args, from_tty);
1803e93f7393Sniklas 
1804b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_open (%s, %d)\n", args, from_tty);
1805e93f7393Sniklas }
1806e93f7393Sniklas 
1807e93f7393Sniklas static void
debug_to_close(int quitting)1808b725ae77Skettenis debug_to_close (int quitting)
1809e93f7393Sniklas {
1810b725ae77Skettenis   target_close (&debug_target, quitting);
1811b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_close (%d)\n", quitting);
1812b725ae77Skettenis }
1813e93f7393Sniklas 
1814b725ae77Skettenis void
target_close(struct target_ops * targ,int quitting)1815b725ae77Skettenis target_close (struct target_ops *targ, int quitting)
1816b725ae77Skettenis {
1817b725ae77Skettenis   if (targ->to_xclose != NULL)
1818b725ae77Skettenis     targ->to_xclose (targ, quitting);
1819b725ae77Skettenis   else if (targ->to_close != NULL)
1820b725ae77Skettenis     targ->to_close (quitting);
1821e93f7393Sniklas }
1822e93f7393Sniklas 
1823e93f7393Sniklas static void
debug_to_attach(char * args,int from_tty)1824b725ae77Skettenis debug_to_attach (char *args, int from_tty)
1825e93f7393Sniklas {
1826e93f7393Sniklas   debug_target.to_attach (args, from_tty);
1827e93f7393Sniklas 
1828b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_attach (%s, %d)\n", args, from_tty);
1829b725ae77Skettenis }
1830b725ae77Skettenis 
1831b725ae77Skettenis 
1832b725ae77Skettenis static void
debug_to_post_attach(int pid)1833b725ae77Skettenis debug_to_post_attach (int pid)
1834b725ae77Skettenis {
1835b725ae77Skettenis   debug_target.to_post_attach (pid);
1836b725ae77Skettenis 
1837b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_post_attach (%d)\n", pid);
1838e93f7393Sniklas }
1839e93f7393Sniklas 
1840e93f7393Sniklas static void
debug_to_detach(char * args,int from_tty)1841b725ae77Skettenis debug_to_detach (char *args, int from_tty)
1842e93f7393Sniklas {
1843e93f7393Sniklas   debug_target.to_detach (args, from_tty);
1844e93f7393Sniklas 
1845b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_detach (%s, %d)\n", args, from_tty);
1846e93f7393Sniklas }
1847e93f7393Sniklas 
1848e93f7393Sniklas static void
debug_to_disconnect(char * args,int from_tty)1849b725ae77Skettenis debug_to_disconnect (char *args, int from_tty)
1850e93f7393Sniklas {
1851b725ae77Skettenis   debug_target.to_disconnect (args, from_tty);
1852e93f7393Sniklas 
1853b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_disconnect (%s, %d)\n",
1854b725ae77Skettenis 		      args, from_tty);
1855b725ae77Skettenis }
1856b725ae77Skettenis 
1857b725ae77Skettenis static void
debug_to_resume(ptid_t ptid,int step,enum target_signal siggnal)1858b725ae77Skettenis debug_to_resume (ptid_t ptid, int step, enum target_signal siggnal)
1859b725ae77Skettenis {
1860b725ae77Skettenis   debug_target.to_resume (ptid, step, siggnal);
1861b725ae77Skettenis 
1862b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_resume (%d, %s, %s)\n", PIDGET (ptid),
1863e93f7393Sniklas 		      step ? "step" : "continue",
1864e93f7393Sniklas 		      target_signal_to_name (siggnal));
1865e93f7393Sniklas }
1866e93f7393Sniklas 
1867b725ae77Skettenis static ptid_t
debug_to_wait(ptid_t ptid,struct target_waitstatus * status)1868b725ae77Skettenis debug_to_wait (ptid_t ptid, struct target_waitstatus *status)
1869e93f7393Sniklas {
1870b725ae77Skettenis   ptid_t retval;
1871e93f7393Sniklas 
1872b725ae77Skettenis   retval = debug_target.to_wait (ptid, status);
1873e93f7393Sniklas 
1874b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog,
1875b725ae77Skettenis 		      "target_wait (%d, status) = %d,   ", PIDGET (ptid),
1876b725ae77Skettenis 		      PIDGET (retval));
1877b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "status->kind = ");
1878e93f7393Sniklas   switch (status->kind)
1879e93f7393Sniklas     {
1880e93f7393Sniklas     case TARGET_WAITKIND_EXITED:
1881b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "exited, status = %d\n",
1882b725ae77Skettenis 			  status->value.integer);
1883e93f7393Sniklas       break;
1884e93f7393Sniklas     case TARGET_WAITKIND_STOPPED:
1885b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "stopped, signal = %s\n",
1886e93f7393Sniklas 			  target_signal_to_name (status->value.sig));
1887e93f7393Sniklas       break;
1888e93f7393Sniklas     case TARGET_WAITKIND_SIGNALLED:
1889b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "signalled, signal = %s\n",
1890e93f7393Sniklas 			  target_signal_to_name (status->value.sig));
1891e93f7393Sniklas       break;
1892e93f7393Sniklas     case TARGET_WAITKIND_LOADED:
1893b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "loaded\n");
1894b725ae77Skettenis       break;
1895b725ae77Skettenis     case TARGET_WAITKIND_FORKED:
1896b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "forked\n");
1897b725ae77Skettenis       break;
1898b725ae77Skettenis     case TARGET_WAITKIND_VFORKED:
1899b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "vforked\n");
1900b725ae77Skettenis       break;
1901b725ae77Skettenis     case TARGET_WAITKIND_EXECD:
1902b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "execd\n");
1903e93f7393Sniklas       break;
1904e93f7393Sniklas     case TARGET_WAITKIND_SPURIOUS:
1905b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "spurious\n");
1906e93f7393Sniklas       break;
1907e93f7393Sniklas     default:
1908b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "unknown???\n");
1909e93f7393Sniklas       break;
1910e93f7393Sniklas     }
1911e93f7393Sniklas 
1912e93f7393Sniklas   return retval;
1913e93f7393Sniklas }
1914e93f7393Sniklas 
1915e93f7393Sniklas static void
debug_print_register(const char * func,int regno)1916b725ae77Skettenis debug_print_register (const char * func, int regno)
1917b725ae77Skettenis {
1918b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "%s ", func);
1919b725ae77Skettenis   if (regno >= 0 && regno < NUM_REGS + NUM_PSEUDO_REGS
1920b725ae77Skettenis       && REGISTER_NAME (regno) != NULL && REGISTER_NAME (regno)[0] != '\0')
1921b725ae77Skettenis     fprintf_unfiltered (gdb_stdlog, "(%s)", REGISTER_NAME (regno));
1922b725ae77Skettenis   else
1923b725ae77Skettenis     fprintf_unfiltered (gdb_stdlog, "(%d)", regno);
1924b725ae77Skettenis   if (regno >= 0)
1925b725ae77Skettenis     {
1926b725ae77Skettenis       int i;
1927b725ae77Skettenis       unsigned char buf[MAX_REGISTER_SIZE];
1928b725ae77Skettenis       deprecated_read_register_gen (regno, buf);
1929b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, " = ");
1930*63addd46Skettenis       for (i = 0; i < register_size (current_gdbarch, regno); i++)
1931b725ae77Skettenis 	{
1932b725ae77Skettenis 	  fprintf_unfiltered (gdb_stdlog, "%02x", buf[i]);
1933b725ae77Skettenis 	}
1934*63addd46Skettenis       if (register_size (current_gdbarch, regno) <= sizeof (LONGEST))
1935b725ae77Skettenis 	{
1936b725ae77Skettenis 	  fprintf_unfiltered (gdb_stdlog, " 0x%s %s",
1937b725ae77Skettenis 			      paddr_nz (read_register (regno)),
1938b725ae77Skettenis 			      paddr_d (read_register (regno)));
1939b725ae77Skettenis 	}
1940b725ae77Skettenis     }
1941b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "\n");
1942b725ae77Skettenis }
1943b725ae77Skettenis 
1944b725ae77Skettenis static void
debug_to_fetch_registers(int regno)1945b725ae77Skettenis debug_to_fetch_registers (int regno)
1946e93f7393Sniklas {
1947e93f7393Sniklas   debug_target.to_fetch_registers (regno);
1948b725ae77Skettenis   debug_print_register ("target_fetch_registers", regno);
1949e93f7393Sniklas }
1950e93f7393Sniklas 
1951e93f7393Sniklas static void
debug_to_store_registers(int regno)1952b725ae77Skettenis debug_to_store_registers (int regno)
1953e93f7393Sniklas {
1954e93f7393Sniklas   debug_target.to_store_registers (regno);
1955b725ae77Skettenis   debug_print_register ("target_store_registers", regno);
1956b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "\n");
1957e93f7393Sniklas }
1958e93f7393Sniklas 
1959e93f7393Sniklas static void
debug_to_prepare_to_store(void)1960b725ae77Skettenis debug_to_prepare_to_store (void)
1961e93f7393Sniklas {
1962e93f7393Sniklas   debug_target.to_prepare_to_store ();
1963e93f7393Sniklas 
1964b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_prepare_to_store ()\n");
1965e93f7393Sniklas }
1966e93f7393Sniklas 
1967e93f7393Sniklas static int
deprecated_debug_xfer_memory(CORE_ADDR memaddr,char * myaddr,int len,int write,struct mem_attrib * attrib,struct target_ops * target)1968*63addd46Skettenis deprecated_debug_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
1969*63addd46Skettenis 			      int write, struct mem_attrib *attrib,
1970b725ae77Skettenis 			      struct target_ops *target)
1971e93f7393Sniklas {
1972e93f7393Sniklas   int retval;
1973e93f7393Sniklas 
1974*63addd46Skettenis   retval = debug_target.deprecated_xfer_memory (memaddr, myaddr, len, write,
1975b725ae77Skettenis 						attrib, target);
1976e93f7393Sniklas 
1977b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog,
1978e93f7393Sniklas 		      "target_xfer_memory (0x%x, xxx, %d, %s, xxx) = %d",
1979b725ae77Skettenis 		      (unsigned int) memaddr,	/* possable truncate long long */
1980b725ae77Skettenis 		      len, write ? "write" : "read", retval);
1981b725ae77Skettenis 
1982e93f7393Sniklas   if (retval > 0)
1983e93f7393Sniklas     {
1984e93f7393Sniklas       int i;
1985e93f7393Sniklas 
1986b725ae77Skettenis       fputs_unfiltered (", bytes =", gdb_stdlog);
1987e93f7393Sniklas       for (i = 0; i < retval; i++)
1988e93f7393Sniklas 	{
1989e93f7393Sniklas 	  if ((((long) &(myaddr[i])) & 0xf) == 0)
1990*63addd46Skettenis 	    {
1991*63addd46Skettenis 	      if (targetdebug < 2 && i > 0)
1992*63addd46Skettenis 		{
1993*63addd46Skettenis 		  fprintf_unfiltered (gdb_stdlog, " ...");
1994*63addd46Skettenis 		  break;
1995*63addd46Skettenis 		}
1996b725ae77Skettenis 	      fprintf_unfiltered (gdb_stdlog, "\n");
1997*63addd46Skettenis 	    }
1998*63addd46Skettenis 
1999b725ae77Skettenis 	  fprintf_unfiltered (gdb_stdlog, " %02x", myaddr[i] & 0xff);
2000e93f7393Sniklas 	}
2001e93f7393Sniklas     }
2002e93f7393Sniklas 
2003b725ae77Skettenis   fputc_unfiltered ('\n', gdb_stdlog);
2004e93f7393Sniklas 
2005e93f7393Sniklas   return retval;
2006e93f7393Sniklas }
2007e93f7393Sniklas 
2008e93f7393Sniklas static void
debug_to_files_info(struct target_ops * target)2009b725ae77Skettenis debug_to_files_info (struct target_ops *target)
2010e93f7393Sniklas {
2011e93f7393Sniklas   debug_target.to_files_info (target);
2012e93f7393Sniklas 
2013b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_files_info (xxx)\n");
2014e93f7393Sniklas }
2015e93f7393Sniklas 
2016e93f7393Sniklas static int
debug_to_insert_breakpoint(CORE_ADDR addr,char * save)2017b725ae77Skettenis debug_to_insert_breakpoint (CORE_ADDR addr, char *save)
2018e93f7393Sniklas {
2019e93f7393Sniklas   int retval;
2020e93f7393Sniklas 
2021e93f7393Sniklas   retval = debug_target.to_insert_breakpoint (addr, save);
2022e93f7393Sniklas 
2023b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog,
2024b725ae77Skettenis 		      "target_insert_breakpoint (0x%lx, xxx) = %ld\n",
2025b725ae77Skettenis 		      (unsigned long) addr,
2026b725ae77Skettenis 		      (unsigned long) retval);
2027e93f7393Sniklas   return retval;
2028e93f7393Sniklas }
2029e93f7393Sniklas 
2030e93f7393Sniklas static int
debug_to_remove_breakpoint(CORE_ADDR addr,char * save)2031b725ae77Skettenis debug_to_remove_breakpoint (CORE_ADDR addr, char *save)
2032e93f7393Sniklas {
2033e93f7393Sniklas   int retval;
2034e93f7393Sniklas 
2035e93f7393Sniklas   retval = debug_target.to_remove_breakpoint (addr, save);
2036e93f7393Sniklas 
2037b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog,
2038b725ae77Skettenis 		      "target_remove_breakpoint (0x%lx, xxx) = %ld\n",
2039b725ae77Skettenis 		      (unsigned long) addr,
2040b725ae77Skettenis 		      (unsigned long) retval);
2041b725ae77Skettenis   return retval;
2042b725ae77Skettenis }
2043b725ae77Skettenis 
2044b725ae77Skettenis static int
debug_to_can_use_hw_breakpoint(int type,int cnt,int from_tty)2045b725ae77Skettenis debug_to_can_use_hw_breakpoint (int type, int cnt, int from_tty)
2046b725ae77Skettenis {
2047b725ae77Skettenis   int retval;
2048b725ae77Skettenis 
2049b725ae77Skettenis   retval = debug_target.to_can_use_hw_breakpoint (type, cnt, from_tty);
2050b725ae77Skettenis 
2051b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog,
2052b725ae77Skettenis 		      "target_can_use_hw_breakpoint (%ld, %ld, %ld) = %ld\n",
2053b725ae77Skettenis 		      (unsigned long) type,
2054b725ae77Skettenis 		      (unsigned long) cnt,
2055b725ae77Skettenis 		      (unsigned long) from_tty,
2056b725ae77Skettenis 		      (unsigned long) retval);
2057b725ae77Skettenis   return retval;
2058b725ae77Skettenis }
2059b725ae77Skettenis 
2060b725ae77Skettenis static int
debug_to_region_size_ok_for_hw_watchpoint(int byte_count)2061b725ae77Skettenis debug_to_region_size_ok_for_hw_watchpoint (int byte_count)
2062b725ae77Skettenis {
2063b725ae77Skettenis   CORE_ADDR retval;
2064b725ae77Skettenis 
2065b725ae77Skettenis   retval = debug_target.to_region_size_ok_for_hw_watchpoint (byte_count);
2066b725ae77Skettenis 
2067b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog,
2068b725ae77Skettenis 		      "TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT (%ld) = 0x%lx\n",
2069b725ae77Skettenis 		      (unsigned long) byte_count,
2070b725ae77Skettenis 		      (unsigned long) retval);
2071b725ae77Skettenis   return retval;
2072b725ae77Skettenis }
2073b725ae77Skettenis 
2074b725ae77Skettenis static int
debug_to_stopped_by_watchpoint(void)2075b725ae77Skettenis debug_to_stopped_by_watchpoint (void)
2076b725ae77Skettenis {
2077b725ae77Skettenis   int retval;
2078b725ae77Skettenis 
2079b725ae77Skettenis   retval = debug_target.to_stopped_by_watchpoint ();
2080b725ae77Skettenis 
2081b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog,
2082b725ae77Skettenis 		      "STOPPED_BY_WATCHPOINT () = %ld\n",
2083b725ae77Skettenis 		      (unsigned long) retval);
2084b725ae77Skettenis   return retval;
2085b725ae77Skettenis }
2086b725ae77Skettenis 
2087*63addd46Skettenis static int
debug_to_stopped_data_address(struct target_ops * target,CORE_ADDR * addr)2088*63addd46Skettenis debug_to_stopped_data_address (struct target_ops *target, CORE_ADDR *addr)
2089b725ae77Skettenis {
2090*63addd46Skettenis   int retval;
2091b725ae77Skettenis 
2092*63addd46Skettenis   retval = debug_target.to_stopped_data_address (target, addr);
2093b725ae77Skettenis 
2094b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog,
2095*63addd46Skettenis 		      "target_stopped_data_address ([0x%lx]) = %ld\n",
2096*63addd46Skettenis 		      (unsigned long)*addr,
2097b725ae77Skettenis 		      (unsigned long)retval);
2098b725ae77Skettenis   return retval;
2099b725ae77Skettenis }
2100b725ae77Skettenis 
2101b725ae77Skettenis static int
debug_to_insert_hw_breakpoint(CORE_ADDR addr,char * save)2102b725ae77Skettenis debug_to_insert_hw_breakpoint (CORE_ADDR addr, char *save)
2103b725ae77Skettenis {
2104b725ae77Skettenis   int retval;
2105b725ae77Skettenis 
2106b725ae77Skettenis   retval = debug_target.to_insert_hw_breakpoint (addr, save);
2107b725ae77Skettenis 
2108b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog,
2109b725ae77Skettenis 		      "target_insert_hw_breakpoint (0x%lx, xxx) = %ld\n",
2110b725ae77Skettenis 		      (unsigned long) addr,
2111b725ae77Skettenis 		      (unsigned long) retval);
2112b725ae77Skettenis   return retval;
2113b725ae77Skettenis }
2114b725ae77Skettenis 
2115b725ae77Skettenis static int
debug_to_remove_hw_breakpoint(CORE_ADDR addr,char * save)2116b725ae77Skettenis debug_to_remove_hw_breakpoint (CORE_ADDR addr, char *save)
2117b725ae77Skettenis {
2118b725ae77Skettenis   int retval;
2119b725ae77Skettenis 
2120b725ae77Skettenis   retval = debug_target.to_remove_hw_breakpoint (addr, save);
2121b725ae77Skettenis 
2122b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog,
2123b725ae77Skettenis 		      "target_remove_hw_breakpoint (0x%lx, xxx) = %ld\n",
2124b725ae77Skettenis 		      (unsigned long) addr,
2125b725ae77Skettenis 		      (unsigned long) retval);
2126b725ae77Skettenis   return retval;
2127b725ae77Skettenis }
2128b725ae77Skettenis 
2129b725ae77Skettenis static int
debug_to_insert_watchpoint(CORE_ADDR addr,int len,int type)2130b725ae77Skettenis debug_to_insert_watchpoint (CORE_ADDR addr, int len, int type)
2131b725ae77Skettenis {
2132b725ae77Skettenis   int retval;
2133b725ae77Skettenis 
2134b725ae77Skettenis   retval = debug_target.to_insert_watchpoint (addr, len, type);
2135b725ae77Skettenis 
2136b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog,
2137b725ae77Skettenis 		      "target_insert_watchpoint (0x%lx, %d, %d) = %ld\n",
2138b725ae77Skettenis 		      (unsigned long) addr, len, type, (unsigned long) retval);
2139b725ae77Skettenis   return retval;
2140b725ae77Skettenis }
2141b725ae77Skettenis 
2142b725ae77Skettenis static int
debug_to_remove_watchpoint(CORE_ADDR addr,int len,int type)2143b725ae77Skettenis debug_to_remove_watchpoint (CORE_ADDR addr, int len, int type)
2144b725ae77Skettenis {
2145b725ae77Skettenis   int retval;
2146b725ae77Skettenis 
2147b725ae77Skettenis   retval = debug_target.to_insert_watchpoint (addr, len, type);
2148b725ae77Skettenis 
2149b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog,
2150b725ae77Skettenis 		      "target_insert_watchpoint (0x%lx, %d, %d) = %ld\n",
2151b725ae77Skettenis 		      (unsigned long) addr, len, type, (unsigned long) retval);
2152e93f7393Sniklas   return retval;
2153e93f7393Sniklas }
2154e93f7393Sniklas 
2155e93f7393Sniklas static void
debug_to_terminal_init(void)2156b725ae77Skettenis debug_to_terminal_init (void)
2157e93f7393Sniklas {
2158e93f7393Sniklas   debug_target.to_terminal_init ();
2159e93f7393Sniklas 
2160b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_terminal_init ()\n");
2161e93f7393Sniklas }
2162e93f7393Sniklas 
2163e93f7393Sniklas static void
debug_to_terminal_inferior(void)2164b725ae77Skettenis debug_to_terminal_inferior (void)
2165e93f7393Sniklas {
2166e93f7393Sniklas   debug_target.to_terminal_inferior ();
2167e93f7393Sniklas 
2168b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_terminal_inferior ()\n");
2169e93f7393Sniklas }
2170e93f7393Sniklas 
2171e93f7393Sniklas static void
debug_to_terminal_ours_for_output(void)2172b725ae77Skettenis debug_to_terminal_ours_for_output (void)
2173e93f7393Sniklas {
2174e93f7393Sniklas   debug_target.to_terminal_ours_for_output ();
2175e93f7393Sniklas 
2176b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_terminal_ours_for_output ()\n");
2177e93f7393Sniklas }
2178e93f7393Sniklas 
2179e93f7393Sniklas static void
debug_to_terminal_ours(void)2180b725ae77Skettenis debug_to_terminal_ours (void)
2181e93f7393Sniklas {
2182e93f7393Sniklas   debug_target.to_terminal_ours ();
2183e93f7393Sniklas 
2184b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_terminal_ours ()\n");
2185e93f7393Sniklas }
2186e93f7393Sniklas 
2187e93f7393Sniklas static void
debug_to_terminal_save_ours(void)2188b725ae77Skettenis debug_to_terminal_save_ours (void)
2189b725ae77Skettenis {
2190b725ae77Skettenis   debug_target.to_terminal_save_ours ();
2191b725ae77Skettenis 
2192b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_terminal_save_ours ()\n");
2193b725ae77Skettenis }
2194b725ae77Skettenis 
2195b725ae77Skettenis static void
debug_to_terminal_info(char * arg,int from_tty)2196b725ae77Skettenis debug_to_terminal_info (char *arg, int from_tty)
2197e93f7393Sniklas {
2198e93f7393Sniklas   debug_target.to_terminal_info (arg, from_tty);
2199e93f7393Sniklas 
2200b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_terminal_info (%s, %d)\n", arg,
2201e93f7393Sniklas 		      from_tty);
2202e93f7393Sniklas }
2203e93f7393Sniklas 
2204e93f7393Sniklas static void
debug_to_kill(void)2205b725ae77Skettenis debug_to_kill (void)
2206e93f7393Sniklas {
2207e93f7393Sniklas   debug_target.to_kill ();
2208e93f7393Sniklas 
2209b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_kill ()\n");
2210e93f7393Sniklas }
2211e93f7393Sniklas 
2212e93f7393Sniklas static void
debug_to_load(char * args,int from_tty)2213b725ae77Skettenis debug_to_load (char *args, int from_tty)
2214e93f7393Sniklas {
2215e93f7393Sniklas   debug_target.to_load (args, from_tty);
2216e93f7393Sniklas 
2217b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_load (%s, %d)\n", args, from_tty);
2218e93f7393Sniklas }
2219e93f7393Sniklas 
2220e93f7393Sniklas static int
debug_to_lookup_symbol(char * name,CORE_ADDR * addrp)2221b725ae77Skettenis debug_to_lookup_symbol (char *name, CORE_ADDR *addrp)
2222e93f7393Sniklas {
2223e93f7393Sniklas   int retval;
2224e93f7393Sniklas 
2225e93f7393Sniklas   retval = debug_target.to_lookup_symbol (name, addrp);
2226e93f7393Sniklas 
2227b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_lookup_symbol (%s, xxx)\n", name);
2228e93f7393Sniklas 
2229e93f7393Sniklas   return retval;
2230e93f7393Sniklas }
2231e93f7393Sniklas 
2232e93f7393Sniklas static void
debug_to_create_inferior(char * exec_file,char * args,char ** env,int from_tty)2233*63addd46Skettenis debug_to_create_inferior (char *exec_file, char *args, char **env,
2234*63addd46Skettenis 			  int from_tty)
2235e93f7393Sniklas {
2236*63addd46Skettenis   debug_target.to_create_inferior (exec_file, args, env, from_tty);
2237e93f7393Sniklas 
2238*63addd46Skettenis   fprintf_unfiltered (gdb_stdlog, "target_create_inferior (%s, %s, xxx, %d)\n",
2239*63addd46Skettenis 		      exec_file, args, from_tty);
2240e93f7393Sniklas }
2241e93f7393Sniklas 
2242e93f7393Sniklas static void
debug_to_post_startup_inferior(ptid_t ptid)2243b725ae77Skettenis debug_to_post_startup_inferior (ptid_t ptid)
2244e93f7393Sniklas {
2245b725ae77Skettenis   debug_target.to_post_startup_inferior (ptid);
2246e93f7393Sniklas 
2247b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_post_startup_inferior (%d)\n",
2248b725ae77Skettenis 		      PIDGET (ptid));
2249b725ae77Skettenis }
2250b725ae77Skettenis 
2251b725ae77Skettenis static void
debug_to_acknowledge_created_inferior(int pid)2252b725ae77Skettenis debug_to_acknowledge_created_inferior (int pid)
2253b725ae77Skettenis {
2254b725ae77Skettenis   debug_target.to_acknowledge_created_inferior (pid);
2255b725ae77Skettenis 
2256b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_acknowledge_created_inferior (%d)\n",
2257b725ae77Skettenis 		      pid);
2258e93f7393Sniklas }
2259e93f7393Sniklas 
2260e93f7393Sniklas static int
debug_to_insert_fork_catchpoint(int pid)2261b725ae77Skettenis debug_to_insert_fork_catchpoint (int pid)
2262b725ae77Skettenis {
2263b725ae77Skettenis   int retval;
2264b725ae77Skettenis 
2265b725ae77Skettenis   retval = debug_target.to_insert_fork_catchpoint (pid);
2266b725ae77Skettenis 
2267b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_insert_fork_catchpoint (%d) = %d\n",
2268b725ae77Skettenis 		      pid, retval);
2269b725ae77Skettenis 
2270b725ae77Skettenis   return retval;
2271b725ae77Skettenis }
2272b725ae77Skettenis 
2273b725ae77Skettenis static int
debug_to_remove_fork_catchpoint(int pid)2274b725ae77Skettenis debug_to_remove_fork_catchpoint (int pid)
2275b725ae77Skettenis {
2276b725ae77Skettenis   int retval;
2277b725ae77Skettenis 
2278b725ae77Skettenis   retval = debug_target.to_remove_fork_catchpoint (pid);
2279b725ae77Skettenis 
2280b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_remove_fork_catchpoint (%d) = %d\n",
2281b725ae77Skettenis 		      pid, retval);
2282b725ae77Skettenis 
2283b725ae77Skettenis   return retval;
2284b725ae77Skettenis }
2285b725ae77Skettenis 
2286b725ae77Skettenis static int
debug_to_insert_vfork_catchpoint(int pid)2287b725ae77Skettenis debug_to_insert_vfork_catchpoint (int pid)
2288b725ae77Skettenis {
2289b725ae77Skettenis   int retval;
2290b725ae77Skettenis 
2291b725ae77Skettenis   retval = debug_target.to_insert_vfork_catchpoint (pid);
2292b725ae77Skettenis 
2293b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_insert_vfork_catchpoint (%d)= %d\n",
2294b725ae77Skettenis 		      pid, retval);
2295b725ae77Skettenis 
2296b725ae77Skettenis   return retval;
2297b725ae77Skettenis }
2298b725ae77Skettenis 
2299b725ae77Skettenis static int
debug_to_remove_vfork_catchpoint(int pid)2300b725ae77Skettenis debug_to_remove_vfork_catchpoint (int pid)
2301b725ae77Skettenis {
2302b725ae77Skettenis   int retval;
2303b725ae77Skettenis 
2304b725ae77Skettenis   retval = debug_target.to_remove_vfork_catchpoint (pid);
2305b725ae77Skettenis 
2306b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_remove_vfork_catchpoint (%d) = %d\n",
2307b725ae77Skettenis 		      pid, retval);
2308b725ae77Skettenis 
2309b725ae77Skettenis   return retval;
2310b725ae77Skettenis }
2311b725ae77Skettenis 
2312b725ae77Skettenis static int
debug_to_follow_fork(int follow_child)2313b725ae77Skettenis debug_to_follow_fork (int follow_child)
2314b725ae77Skettenis {
2315b725ae77Skettenis   int retval =  debug_target.to_follow_fork (follow_child);
2316b725ae77Skettenis 
2317b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_follow_fork (%d) = %d\n",
2318b725ae77Skettenis 		      follow_child, retval);
2319b725ae77Skettenis 
2320b725ae77Skettenis   return retval;
2321b725ae77Skettenis }
2322b725ae77Skettenis 
2323b725ae77Skettenis static int
debug_to_insert_exec_catchpoint(int pid)2324b725ae77Skettenis debug_to_insert_exec_catchpoint (int pid)
2325b725ae77Skettenis {
2326b725ae77Skettenis   int retval;
2327b725ae77Skettenis 
2328b725ae77Skettenis   retval = debug_target.to_insert_exec_catchpoint (pid);
2329b725ae77Skettenis 
2330b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_insert_exec_catchpoint (%d) = %d\n",
2331b725ae77Skettenis 		      pid, retval);
2332b725ae77Skettenis 
2333b725ae77Skettenis   return retval;
2334b725ae77Skettenis }
2335b725ae77Skettenis 
2336b725ae77Skettenis static int
debug_to_remove_exec_catchpoint(int pid)2337b725ae77Skettenis debug_to_remove_exec_catchpoint (int pid)
2338b725ae77Skettenis {
2339b725ae77Skettenis   int retval;
2340b725ae77Skettenis 
2341b725ae77Skettenis   retval = debug_target.to_remove_exec_catchpoint (pid);
2342b725ae77Skettenis 
2343b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_remove_exec_catchpoint (%d) = %d\n",
2344b725ae77Skettenis 		      pid, retval);
2345b725ae77Skettenis 
2346b725ae77Skettenis   return retval;
2347b725ae77Skettenis }
2348b725ae77Skettenis 
2349b725ae77Skettenis static int
debug_to_reported_exec_events_per_exec_call(void)2350b725ae77Skettenis debug_to_reported_exec_events_per_exec_call (void)
2351b725ae77Skettenis {
2352b725ae77Skettenis   int reported_exec_events;
2353b725ae77Skettenis 
2354b725ae77Skettenis   reported_exec_events = debug_target.to_reported_exec_events_per_exec_call ();
2355b725ae77Skettenis 
2356b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog,
2357b725ae77Skettenis 		      "target_reported_exec_events_per_exec_call () = %d\n",
2358b725ae77Skettenis 		      reported_exec_events);
2359b725ae77Skettenis 
2360b725ae77Skettenis   return reported_exec_events;
2361b725ae77Skettenis }
2362b725ae77Skettenis 
2363b725ae77Skettenis static int
debug_to_has_exited(int pid,int wait_status,int * exit_status)2364b725ae77Skettenis debug_to_has_exited (int pid, int wait_status, int *exit_status)
2365b725ae77Skettenis {
2366b725ae77Skettenis   int has_exited;
2367b725ae77Skettenis 
2368b725ae77Skettenis   has_exited = debug_target.to_has_exited (pid, wait_status, exit_status);
2369b725ae77Skettenis 
2370b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_has_exited (%d, %d, %d) = %d\n",
2371b725ae77Skettenis 		      pid, wait_status, *exit_status, has_exited);
2372b725ae77Skettenis 
2373b725ae77Skettenis   return has_exited;
2374b725ae77Skettenis }
2375b725ae77Skettenis 
2376b725ae77Skettenis static void
debug_to_mourn_inferior(void)2377b725ae77Skettenis debug_to_mourn_inferior (void)
2378b725ae77Skettenis {
2379b725ae77Skettenis   debug_target.to_mourn_inferior ();
2380b725ae77Skettenis 
2381b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_mourn_inferior ()\n");
2382b725ae77Skettenis }
2383b725ae77Skettenis 
2384b725ae77Skettenis static int
debug_to_can_run(void)2385b725ae77Skettenis debug_to_can_run (void)
2386e93f7393Sniklas {
2387e93f7393Sniklas   int retval;
2388e93f7393Sniklas 
2389e93f7393Sniklas   retval = debug_target.to_can_run ();
2390e93f7393Sniklas 
2391b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_can_run () = %d\n", retval);
2392e93f7393Sniklas 
2393e93f7393Sniklas   return retval;
2394e93f7393Sniklas }
2395e93f7393Sniklas 
2396e93f7393Sniklas static void
debug_to_notice_signals(ptid_t ptid)2397b725ae77Skettenis debug_to_notice_signals (ptid_t ptid)
2398e93f7393Sniklas {
2399b725ae77Skettenis   debug_target.to_notice_signals (ptid);
2400e93f7393Sniklas 
2401b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_notice_signals (%d)\n",
2402b725ae77Skettenis                       PIDGET (ptid));
2403e93f7393Sniklas }
2404e93f7393Sniklas 
2405e93f7393Sniklas static int
debug_to_thread_alive(ptid_t ptid)2406b725ae77Skettenis debug_to_thread_alive (ptid_t ptid)
2407e93f7393Sniklas {
2408e93f7393Sniklas   int retval;
2409e93f7393Sniklas 
2410b725ae77Skettenis   retval = debug_target.to_thread_alive (ptid);
2411e93f7393Sniklas 
2412b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_thread_alive (%d) = %d\n",
2413b725ae77Skettenis 		      PIDGET (ptid), retval);
2414e93f7393Sniklas 
2415e93f7393Sniklas   return retval;
2416e93f7393Sniklas }
2417e93f7393Sniklas 
2418e93f7393Sniklas static void
debug_to_find_new_threads(void)2419b725ae77Skettenis debug_to_find_new_threads (void)
2420e93f7393Sniklas {
2421b725ae77Skettenis   debug_target.to_find_new_threads ();
2422e93f7393Sniklas 
2423b725ae77Skettenis   fputs_unfiltered ("target_find_new_threads ()\n", gdb_stdlog);
2424e93f7393Sniklas }
2425e93f7393Sniklas 
2426e93f7393Sniklas static void
debug_to_stop(void)2427b725ae77Skettenis debug_to_stop (void)
2428b725ae77Skettenis {
2429b725ae77Skettenis   debug_target.to_stop ();
2430b725ae77Skettenis 
2431b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_stop ()\n");
2432b725ae77Skettenis }
2433b725ae77Skettenis 
2434b725ae77Skettenis static void
debug_to_rcmd(char * command,struct ui_file * outbuf)2435b725ae77Skettenis debug_to_rcmd (char *command,
2436b725ae77Skettenis 	       struct ui_file *outbuf)
2437b725ae77Skettenis {
2438b725ae77Skettenis   debug_target.to_rcmd (command, outbuf);
2439b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_rcmd (%s, ...)\n", command);
2440b725ae77Skettenis }
2441b725ae77Skettenis 
2442b725ae77Skettenis static struct symtab_and_line *
debug_to_enable_exception_callback(enum exception_event_kind kind,int enable)2443b725ae77Skettenis debug_to_enable_exception_callback (enum exception_event_kind kind, int enable)
2444b725ae77Skettenis {
2445b725ae77Skettenis   struct symtab_and_line *result;
2446b725ae77Skettenis   result = debug_target.to_enable_exception_callback (kind, enable);
2447b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog,
2448b725ae77Skettenis 		      "target get_exception_callback_sal (%d, %d)\n",
2449b725ae77Skettenis 		      kind, enable);
2450b725ae77Skettenis   return result;
2451b725ae77Skettenis }
2452b725ae77Skettenis 
2453b725ae77Skettenis static struct exception_event_record *
debug_to_get_current_exception_event(void)2454b725ae77Skettenis debug_to_get_current_exception_event (void)
2455b725ae77Skettenis {
2456b725ae77Skettenis   struct exception_event_record *result;
2457b725ae77Skettenis   result = debug_target.to_get_current_exception_event ();
2458b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target get_current_exception_event ()\n");
2459b725ae77Skettenis   return result;
2460b725ae77Skettenis }
2461b725ae77Skettenis 
2462b725ae77Skettenis static char *
debug_to_pid_to_exec_file(int pid)2463b725ae77Skettenis debug_to_pid_to_exec_file (int pid)
2464b725ae77Skettenis {
2465b725ae77Skettenis   char *exec_file;
2466b725ae77Skettenis 
2467b725ae77Skettenis   exec_file = debug_target.to_pid_to_exec_file (pid);
2468b725ae77Skettenis 
2469b725ae77Skettenis   fprintf_unfiltered (gdb_stdlog, "target_pid_to_exec_file (%d) = %s\n",
2470b725ae77Skettenis 		      pid, exec_file);
2471b725ae77Skettenis 
2472b725ae77Skettenis   return exec_file;
2473b725ae77Skettenis }
2474b725ae77Skettenis 
2475b725ae77Skettenis static void
setup_target_debug(void)2476b725ae77Skettenis setup_target_debug (void)
2477e93f7393Sniklas {
2478e93f7393Sniklas   memcpy (&debug_target, &current_target, sizeof debug_target);
2479e93f7393Sniklas 
2480e93f7393Sniklas   current_target.to_open = debug_to_open;
2481e93f7393Sniklas   current_target.to_close = debug_to_close;
2482e93f7393Sniklas   current_target.to_attach = debug_to_attach;
2483b725ae77Skettenis   current_target.to_post_attach = debug_to_post_attach;
2484e93f7393Sniklas   current_target.to_detach = debug_to_detach;
2485b725ae77Skettenis   current_target.to_disconnect = debug_to_disconnect;
2486e93f7393Sniklas   current_target.to_resume = debug_to_resume;
2487e93f7393Sniklas   current_target.to_wait = debug_to_wait;
2488e93f7393Sniklas   current_target.to_fetch_registers = debug_to_fetch_registers;
2489e93f7393Sniklas   current_target.to_store_registers = debug_to_store_registers;
2490e93f7393Sniklas   current_target.to_prepare_to_store = debug_to_prepare_to_store;
2491*63addd46Skettenis   current_target.deprecated_xfer_memory = deprecated_debug_xfer_memory;
2492e93f7393Sniklas   current_target.to_files_info = debug_to_files_info;
2493e93f7393Sniklas   current_target.to_insert_breakpoint = debug_to_insert_breakpoint;
2494e93f7393Sniklas   current_target.to_remove_breakpoint = debug_to_remove_breakpoint;
2495b725ae77Skettenis   current_target.to_can_use_hw_breakpoint = debug_to_can_use_hw_breakpoint;
2496b725ae77Skettenis   current_target.to_insert_hw_breakpoint = debug_to_insert_hw_breakpoint;
2497b725ae77Skettenis   current_target.to_remove_hw_breakpoint = debug_to_remove_hw_breakpoint;
2498b725ae77Skettenis   current_target.to_insert_watchpoint = debug_to_insert_watchpoint;
2499b725ae77Skettenis   current_target.to_remove_watchpoint = debug_to_remove_watchpoint;
2500b725ae77Skettenis   current_target.to_stopped_by_watchpoint = debug_to_stopped_by_watchpoint;
2501b725ae77Skettenis   current_target.to_stopped_data_address = debug_to_stopped_data_address;
2502b725ae77Skettenis   current_target.to_region_size_ok_for_hw_watchpoint = debug_to_region_size_ok_for_hw_watchpoint;
2503e93f7393Sniklas   current_target.to_terminal_init = debug_to_terminal_init;
2504e93f7393Sniklas   current_target.to_terminal_inferior = debug_to_terminal_inferior;
2505e93f7393Sniklas   current_target.to_terminal_ours_for_output = debug_to_terminal_ours_for_output;
2506e93f7393Sniklas   current_target.to_terminal_ours = debug_to_terminal_ours;
2507b725ae77Skettenis   current_target.to_terminal_save_ours = debug_to_terminal_save_ours;
2508e93f7393Sniklas   current_target.to_terminal_info = debug_to_terminal_info;
2509e93f7393Sniklas   current_target.to_kill = debug_to_kill;
2510e93f7393Sniklas   current_target.to_load = debug_to_load;
2511e93f7393Sniklas   current_target.to_lookup_symbol = debug_to_lookup_symbol;
2512e93f7393Sniklas   current_target.to_create_inferior = debug_to_create_inferior;
2513b725ae77Skettenis   current_target.to_post_startup_inferior = debug_to_post_startup_inferior;
2514b725ae77Skettenis   current_target.to_acknowledge_created_inferior = debug_to_acknowledge_created_inferior;
2515b725ae77Skettenis   current_target.to_insert_fork_catchpoint = debug_to_insert_fork_catchpoint;
2516b725ae77Skettenis   current_target.to_remove_fork_catchpoint = debug_to_remove_fork_catchpoint;
2517b725ae77Skettenis   current_target.to_insert_vfork_catchpoint = debug_to_insert_vfork_catchpoint;
2518b725ae77Skettenis   current_target.to_remove_vfork_catchpoint = debug_to_remove_vfork_catchpoint;
2519b725ae77Skettenis   current_target.to_follow_fork = debug_to_follow_fork;
2520b725ae77Skettenis   current_target.to_insert_exec_catchpoint = debug_to_insert_exec_catchpoint;
2521b725ae77Skettenis   current_target.to_remove_exec_catchpoint = debug_to_remove_exec_catchpoint;
2522b725ae77Skettenis   current_target.to_reported_exec_events_per_exec_call = debug_to_reported_exec_events_per_exec_call;
2523b725ae77Skettenis   current_target.to_has_exited = debug_to_has_exited;
2524e93f7393Sniklas   current_target.to_mourn_inferior = debug_to_mourn_inferior;
2525e93f7393Sniklas   current_target.to_can_run = debug_to_can_run;
2526e93f7393Sniklas   current_target.to_notice_signals = debug_to_notice_signals;
2527e93f7393Sniklas   current_target.to_thread_alive = debug_to_thread_alive;
2528b725ae77Skettenis   current_target.to_find_new_threads = debug_to_find_new_threads;
2529e93f7393Sniklas   current_target.to_stop = debug_to_stop;
2530b725ae77Skettenis   current_target.to_rcmd = debug_to_rcmd;
2531b725ae77Skettenis   current_target.to_enable_exception_callback = debug_to_enable_exception_callback;
2532b725ae77Skettenis   current_target.to_get_current_exception_event = debug_to_get_current_exception_event;
2533b725ae77Skettenis   current_target.to_pid_to_exec_file = debug_to_pid_to_exec_file;
2534b725ae77Skettenis 
2535e93f7393Sniklas }
2536e93f7393Sniklas 
2537b725ae77Skettenis 
2538e93f7393Sniklas static char targ_desc[] =
2539e93f7393Sniklas "Names of targets and files being debugged.\n\
2540e93f7393Sniklas Shows the entire stack of targets currently in use (including the exec-file,\n\
2541e93f7393Sniklas core-file, and process, if any), as well as the symbol file name.";
2542e93f7393Sniklas 
2543b725ae77Skettenis static void
do_monitor_command(char * cmd,int from_tty)2544b725ae77Skettenis do_monitor_command (char *cmd,
2545b725ae77Skettenis 		 int from_tty)
2546e93f7393Sniklas {
2547b725ae77Skettenis   if ((current_target.to_rcmd
2548b725ae77Skettenis        == (void (*) (char *, struct ui_file *)) tcomplain)
2549b725ae77Skettenis       || (current_target.to_rcmd == debug_to_rcmd
2550b725ae77Skettenis 	  && (debug_target.to_rcmd
2551b725ae77Skettenis 	      == (void (*) (char *, struct ui_file *)) tcomplain)))
2552b725ae77Skettenis     {
2553b725ae77Skettenis       error ("\"monitor\" command not supported by this target.\n");
2554b725ae77Skettenis     }
2555b725ae77Skettenis   target_rcmd (cmd, gdb_stdtarg);
2556b725ae77Skettenis }
2557b725ae77Skettenis 
2558b725ae77Skettenis void
initialize_targets(void)2559b725ae77Skettenis initialize_targets (void)
2560b725ae77Skettenis {
2561b725ae77Skettenis   init_dummy_target ();
2562e93f7393Sniklas   push_target (&dummy_target);
2563e93f7393Sniklas 
2564e93f7393Sniklas   add_info ("target", target_info, targ_desc);
2565e93f7393Sniklas   add_info ("files", target_info, targ_desc);
2566e93f7393Sniklas 
2567*63addd46Skettenis   deprecated_add_show_from_set
2568b725ae77Skettenis     (add_set_cmd ("target", class_maintenance, var_zinteger,
2569e93f7393Sniklas 		  (char *) &targetdebug,
2570e93f7393Sniklas 		  "Set target debugging.\n\
2571*63addd46Skettenis When non-zero, target debugging is enabled.  Higher numbers are more\n\
2572*63addd46Skettenis verbose.  Changes do not take effect until the next \"run\" or \"target\"\n\
2573*63addd46Skettenis command.", &setdebuglist),
2574b725ae77Skettenis      &showdebuglist);
2575e93f7393Sniklas 
2576b725ae77Skettenis   add_setshow_boolean_cmd ("trust-readonly-sections", class_support,
2577b725ae77Skettenis 			   &trust_readonly, "\
2578*63addd46Skettenis Set mode for reading from readonly sections.", "\
2579*63addd46Skettenis Show mode for reading from readonly sections.", "\
2580b725ae77Skettenis When this mode is on, memory reads from readonly sections (such as .text)\n\
2581b725ae77Skettenis will be read from the object file instead of from the target.  This will\n\
2582b725ae77Skettenis result in significant performance improvement for remote targets.", "\
2583*63addd46Skettenis Mode for reading from readonly sections is %s.",
2584b725ae77Skettenis 			   NULL, NULL,
2585b725ae77Skettenis 			   &setlist, &showlist);
2586b725ae77Skettenis 
2587b725ae77Skettenis   add_com ("monitor", class_obscure, do_monitor_command,
2588b725ae77Skettenis 	   "Send a command to the remote monitor (remote targets only).");
2589b725ae77Skettenis 
2590b725ae77Skettenis   target_dcache = dcache_init ();
2591e93f7393Sniklas }
2592